首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单击带有操作的网站上的所有链接。元素引用已过期

问单击带有操作的网站上的所有链接。元素引用已过期
EN

Stack Overflow用户
提问于 2017-03-23 06:44:28
回答 1查看 265关注 0票数 0

我做了一个新的脚本,我想点击()网站上所有列出的链接,找到一些东西,回到列出的链接,点击()下一个链接,找到一些东西,回到列出的链接。

我从网站开始,它为我列出了一些链接:

链路1、链路2、链路3等

代码语言:javascript
复制
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,或者页面已刷新。

代码语言:javascript
复制
on line:
for link in links:
    link.click() <----

我怎么才能修复它?(Python 2.7)

EN

回答 1

Stack Overflow用户

发布于 2017-03-23 06:54:54

有几件事:

不要使用像“睡眠”这样的延迟来同步。改用“等待”条件。

因为你使用的是"back()“,所以你只想在成功移出上一页的情况下才这样做,这就是为什么最好是专门测试这些动作的原因之一--例如,你怎么知道每次click()都会让你”前进“,可能还会涉及到其他一些动作。在这里,您正在对DOM进行假设,这是可以的,但是在执行其他操作之前,您需要检查您的条件。例如,如果您在加载下一个页面之前移动"back“,您将丢失DOM。

此外,back()也可能导致DOM刷新,从而改变元素标识符。如果是这种情况,您需要在每次返回后验证页面,并按索引遍历元素,在单击之前逐个查找它们。

我一直认为更好的做法是对点击操作这样的事情更加严格。单击specific链接,检查specific结果,并在两次操作之间使用等待条件,以确保您处于预期的位置。

更多关于wait conditions here的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42964029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档