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)
成功解决,效果如下: