我制作新剧本,我想点击()网站上列出的所有链接,找到一些东西,回到列出的链接,点击()下一个链接,找到一些东西,回到列出的链接。
我从网站开始为我列出了一些链接:
链接1 链接2 链接3 等
links = driver.find_elements_by_xpath("myxpath")
for link in links:
link.click()
try:
time.sleep(2)
wantedelement = driver.find_element_by_xpath("xpath")
wantedelement.click()
#Save to file
tofile = driver.find_element_by_xpath("xpath")
print (tofile.text)
myfile = open("file.txt", "a")
my.write(tofile.text + "\n")
driver.back()
except (ElementNotVisibleException, NoSuchElementException):
driver.back()
但我的脚本只检查一个链接,当回到列出的链接时打印我错误:
selenium.common.exceptions.StaleElementReferenceException:消息:元素引用是陈旧的。元素不再附加到DOM或页面已刷新。
on line:
for link in links:
link.click() <----
我该如何解决? (Python 2.7)
答案 0 :(得分:0)
有几件事:
不要使用像#34; sleep&#34;同步。使用&#34;等待&#34;条件反而。
因为你正在使用&#34; back()&#34;如果你成功地离开了上一页,你将只想这样做,这是特别是测试动作更好的原因之一 - 例如,你怎么知道每次点击()都应该让你感动#34;转发&#34;,可能涉及其他一些行动。您在这里做了关于DOM的假设,这没关系,但是您需要在执行其他操作之前检查您的条件。例如,如果你移动&#34;返回&#34;在你的下一页加载之前,你将失去你的DOM。
此外,back()可能会导致DOM刷新,这会更改元素标识符。如果是这种情况,您需要在每次返回后验证您的页面并按索引遍历元素,然后在单击之前单独查找它们。
我总是发现更好的做法是更加严格地点击操作。点击特定链接并检查特定结果 - 并在操作之间使用等待条件,以确保您的确切位置。
有关wait conditions here的更多信息。