Python&Selenium多链接导航遇StaleElementReferenceException问题求助
解决Selenium中的StaleElementReferenceException问题
你遇到的StaleElementReferenceException错误,本质是页面刷新、回退操作后,原页面的DOM结构被重新渲染——你一开始获取的ALL_HREF元素列表,里面的每个元素对象都绑定到初始主页的DOM节点上,当返回主页时页面已重新加载,这些旧元素对象就和当前页面的实际元素脱节,自然找不到对应元素。
下面是两种可行的解决办法:
方法一:每次返回主页后重新获取元素列表
核心是避免复用旧元素对象,每次回到主页后重新查询符合条件的元素:
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get('https://www.xxxxxx.xx/') while True: try: # 每次回到主页后重新查询元素 all_href = driver.find_elements(By.XPATH, "//*[contains(@href, 'h2h-stats')]") if not all_href: break # 点击当前页面的第一个目标元素 all_href[0].click() time.sleep(2) driver.refresh() driver.back() time.sleep(2) except Exception as e: print(f"执行出错: {e}") break driver.quit()
方法二:先收集所有链接地址,再逐个访问
这种方法更稳定,保存的是链接URL而非元素对象,完全不受DOM刷新影响:
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get('https://www.xxxxxx.xx/') # 一次性收集所有目标链接的地址 all_links = [link.get_attribute('href') for link in driver.find_elements(By.XPATH, "//*[contains(@href, 'h2h-stats')]")] for link in all_links: time.sleep(2) # 直接通过URL跳转 driver.get(link) time.sleep(2) driver.refresh() driver.back() time.sleep(2) driver.quit()
推荐使用第二种方法,既避免了元素失效问题,代码逻辑也更清晰,执行效率更高。
内容的提问来源于stack exchange,提问作者Gigabyte
相关产品推荐
相关产品推荐

