我在用selenium 写爬虫的时候,会遇到这个问题:
Message: stale element reference: element is not attached to the page
document (Session info: chrome=112.0.5614.0); For documentation on
this error, please visit:
https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#stale-element-reference-exception
我写的代码大概是这样的:
sumit= driver.find_element(By.CLASS_NAME, "button").click
点完click以后,就出现上面的报错了;这主要是我在测试selenium或者requests的时候,测试在某个页面上停留太久,就会出现这个问题。
出现这个问题的原因:
页面上的某个元素在你尝试与它交互时已经被重新渲染或移除,导致你之前引用的元素引用失效了。
比较官方的说法是:
- 页面刷新或重新加载:页面被刷新或重新加载后,页面上的元素会被重新渲染,之前的元素引用就会失效。
- DOM 更新:页面的 DOM 被动态更新,比如通过 JavaScript 动态加载内容或移除元素。
- 元素被隐藏或移除:某些操作可能导致元素被隐藏或从 DOM 中移除。
- 异步操作:如 AJAX 请求完成后,页面的部分内容被更新
比较粗暴翻译出来的意思是:可能页面停留太久了,之前的元素已经无效了,过期了。
解决方法:
1. 重新定位元素
在每次与元素交互之前,重新定位元素,而不是使用之前保存的引用。例如:
# 不推荐:保存元素引用
element = driver.find_element_by_id("my_element")
element.click()
# 推荐:每次操作前重新定位
driver.find_element_by_id("my_element").click()
2. 避免页面刷新
如果可能,尽量避免在测试过程中触发页面刷新。
例如,避免点击会导致页面重新加载的按钮。
3 捕获异常并重试
如果问题仍然无法避免,可以捕获异常并尝试重新定位元素。例如:
from selenium.common.exceptions import StaleElementReferenceException
try:
element = driver.find_element_by_id("my_element")
element.click()
except StaleElementReferenceException:
print("Element is stale. Retrying...")
element = driver.find_element_by_id("my_element")
element.click()
4. 检查页面的加载状态
确保在操作元素之前,页面已经完全加载完成。可以使用 WebDriverWait
来等待页面加载完成:
WebDriverWait(driver, 10).until(lambda d: d.execute_script("return document.readyState") == "complete")
5. 使用 JavaScript 执行操作
如果元素经常失效,可以尝试使用 JavaScript 来执行操作,避免直接操作元素。
例如:
driver.execute_script("document.getElementById('my_element').click();")