You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:42:06