【Python】处理“Message: stale element reference: element is not attached to the page document” 的解决方法

我在用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的时候,测试在某个页面上停留太久,就会出现这个问题。

出现这个问题的原因:

页面上的某个元素在你尝试与它交互时已经被重新渲染或移除,导致你之前引用的元素引用失效了。

比较官方的说法是:

  1. 页面刷新或重新加载:页面被刷新或重新加载后,页面上的元素会被重新渲染,之前的元素引用就会失效。
  2. DOM 更新:页面的 DOM 被动态更新,比如通过 JavaScript 动态加载内容或移除元素。
  3. 元素被隐藏或移除:某些操作可能导致元素被隐藏或从 DOM 中移除。
  4. 异步操作:如 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();")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值