[python] Message: stale element reference: element is not attach to the page document

1、前言        

        通过selenium中find_elements_by_partial_link_text()函数获取网页中符合条件的链接文本列表,并挨个点击,出现了如下两种错误。

2、准备

2.1、手写HTML文件用于实验

<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> 
<title>实验</title> 
</head>
<body>
	<p contenteditable="true" spellcheck="true">这是可编辑的段落。请试着编辑文本。</p>
	<a href = "https://weread.qq.com/">微信读书</a>
	<a href = "https://fanqienovel.com/">微番茄小说</a>
</body>
</html>

3、只能点击进入列表中第一个连接文本

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get(r'file:///C:/Users/%E%88%B%E9%9D%9E/Desktop/exe.html')

links = driver.find_elements_by_partial_link_text('微')
for link in links:
    link.click()
    time.sleep(5)

        links为列表形式,包含两个链接文本,①微信读书、②微番茄小说。

        运行如上代码,只能点击进入第一个链接文本(微信读书),然后报错如下:

Message: stale element reference: element is not attached to the page document (Session info: chrome=110.0.5481.97)

4、在列表中第一个链接文本里嵌套查找

        对上述代码进行修改,能够成功运行,但不是预期结果

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get(r'file:///C:/Users/%E5%88%98%E5%BB%BA%E9%/Desktop/exe.html')
link1 = driver.find_elements_by_partial_link_text('微')
link1[0].click()
time.sleep(15)
link2 = driver.find_elements_by_partial_link_text('微')
link2[1].click()

        使用如上代码,每点击一次就重新使用driver查找一次,生成新的link,基于这个思路得到如上代码,最后能够成功运行,但效果如下:(原因应该是“微信读书”覆盖了当前网址,所以第二次查找就基于“微信读书”进行。)

        运行link1[0].click(),进入微信读书

         运行link2[1].click(),则是在微信读书的基础上,进行了查找,进入了微信图书内部的界面

5、解决办法

from selenium import webdriver
import time

driver = webdriver.Chrome()

for i in [0,1]:
    driver.get(r'file:///C:/Users/%E5%8BB%BA%E%9E/Desktop/exe.html')
    link = driver.find_elements_by_partial_link_text('微')
    link[i].click()
    time.sleep(5)

         Message: stale element reference: element is not attached to the page document (Session info: chrome=110.0.5481.97)指过时的元素引用,元素未附加到页面文档,每点击一次就重新get(url)。运行后,得到预期结果。

        该方法不是太好。

        推测:运行上述代码,点击链接文本后,并没有跳转到新的页面,而是覆盖了当前页面,所以会有“过时的元素引用,元素未附加到页面文档”的错误。所以可通过在新的页面打开链接文本的方式避免该错误,参考如下代码:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get(r'file:///C:/Users/%E%88%BA%E9%9D%9E/Desktop/exe.html')

links = driver.find_elements_by_partial_link_text('微')
for link in links:
    href = link.get_attribute("href")
    driver.execute_script(f'window.open("{href}", "_blank");')
    time.sleep(5)

        成功解决,效果如下:

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

煮雨小筑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值