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

使用Chrome Driver时如何解决Stale Element Reference异常

登录自动化脚本触发Stale Element Reference异常

我用Python写了个网站登录自动化脚本,能成功找到并填写邮箱和密码,但点击登录按钮时触发了Stale Element Reference异常。

脚本代码

from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://waveleisure.gs-signature.cloud/Connect/mrmLogin.aspx")
driver.implicitly_wait(10)
elements = driver.find_elements(By.TAG_NAME, "input")
print(len(elements), " elements found")
for el in elements:
    if el.accessible_name == "Email Address":
        print("got email address")
        el.send_keys("****@gmail.com")
    elif el.accessible_name == "Password":
        print("got password")
        el.send_keys("****")
driver.implicitly_wait(10)
elements = driver.find_elements(By.TAG_NAME, "input")
for el in elements:
    if el.accessible_name == "Login":
        print("got login")
        el.click()

运行报错输出

DevTools listening on ws://127.0.0.1:52650/devtools/browser/09db5c0e-52e4-45a4-8499-f5703dde1f6e
10  elements found
got email address
got password
got login
Traceback (most recent call last):
  File "C:\\Workspace\\Booking\\WavesBooking.py", line 28, in <module>
    if el.accessible_name == "Login":
       ^^^^^^^^^^^^^^^^^^
  File "C:\\Users\\pete_\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\selenium\\webdriver\\remote\\webelement.py", line 303, in accessible_name
    return self._execute(Command.GET_ELEMENT_ARIA_LABEL)["value"]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\\Users\\pete_\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\selenium\\webdriver\\remote\\webelement.py", line 395, in _execute
    return self._parent.execute(command, params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\\Users\\pete_\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py", line 354, in execute
    self.error_handler.check_response(response)
  File "C:\\Users\\pete_\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\selenium\\webdriver\\remote\\errorhandler.py", line 229, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: stale element not found
  (Session info: chrome=130.0.6723.92); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#stale-element-reference-exception

问题原因

Stale Element Reference异常是因为页面元素在你获取之后发生了DOM更新(比如填写表单后触发的局部刷新、动态验证渲染),导致之前拿到的元素引用失效,无法再操作。

修复方案

方案1:精准定位目标元素(推荐)

不要遍历所有input元素,直接通过accessible_name精准定位每个控件,配合显式等待确保元素就绪:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://waveleisure.gs-signature.cloud/Connect/mrmLogin.aspx")

# 等待邮箱输入框出现并填写
email_input = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, '//input[@accessible_name="Email Address"]'))
)
email_input.send_keys("****@gmail.com")

# 等待密码输入框出现并填写
password_input = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, '//input[@accessible_name="Password"]'))
)
password_input.send_keys("****")

# 等待登录按钮可点击后点击
login_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//input[@accessible_name="Login"]'))
)
login_btn.click()

方案2:捕获异常并重试(兼容遍历场景)

如果必须遍历元素,在操作时捕获异常,遇到失效元素重新获取列表:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import StaleElementReferenceException

driver = webdriver.Chrome()
driver.get("https://waveleisure.gs-signature.cloud/Connect/mrmLogin.aspx")
driver.implicitly_wait(10)

# 填写邮箱和密码,捕获失效元素异常
elements = driver.find_elements(By.TAG_NAME, "input")
for el in elements:
    try:
        if el.accessible_name == "Email Address":
            el.send_keys("****@gmail.com")
        elif el.accessible_name == "Password":
            el.send_keys("****")
    except StaleElementReferenceException:
        continue

# 循环尝试获取登录按钮,直到成功点击
while True:
    try:
        elements = driver.find_elements(By.TAG_NAME, "input")
        for el in elements:
            if el.accessible_name == "Login":
                el.click()
                break
        break
    except StaleElementReferenceException:
        continue

关键优化点

  • 用显式等待替代隐式等待,更精准控制元素加载时机,避免DOM未就绪就操作。
  • 尽量直接定位目标元素,减少遍历整个元素列表的操作。
  • 针对StaleElementReferenceException做异常捕获,遇到失效元素时重新尝试。

内容的提问来源于stack exchange,提问作者PeteF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:53:13