使用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
相关产品推荐
相关产品推荐

