【问题标题】:Click all links on the website with action. The element reference is stale er单击网站上的所有链接并采取行动。元素引用已过时
【发布时间】:2017-03-22 22:44:28
【问题描述】:

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

我从为我列出一些链接的网站开始:

链接 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)

【问题讨论】:

    标签: python python-2.7 selenium selenium-webdriver


    【解决方案1】:

    有几点:

    不要使用“睡眠”之类的延迟来进行同步。请改用“等待”条件。

    由于您使用的是“back()”,因此您只想在成功移出上一页时才这样做,这是最好专门测试操作的原因之一 - 例如,您如何知道每个 click() 都应该让您“向前”移动,可能涉及其他一些操作。您在这里对 DOM 做出假设,这没关系,但您需要在执行其他操作之前检查您的条件。例如,如果您在加载下一页之前“向后”移动,您将丢失 DOM。

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

    我一直发现对点击操作等事情更严格是更好的做法。点击 specific 链接并检查 specific 结果 - 并在操作之间使用等待条件,以确保您准确地到达预期的位置。

    更多关于wait conditions here

    【讨论】:

    • 为什么 wait() 比 sleep() 好?相反,我不知道如何单击()所有链接:) 你能告诉我例子吗?这和谷歌搜索一样,点击所有结果。对不起我的英语
    • @PythonLearn - 你想在睡眠中使用wait() 的原因是它不会影响你的代码正在运行的线程;你只是告诉你的driver 对象,“等一下。”当您使用sleep 时,您将线程 置于睡眠状态。这可能会导致异常并减慢测试的执行时间。
    • “睡眠”并不能保证已满足所需条件。它只是延迟了事情的发生。所有的测试动作都应该有预期的结果,并且“等待”允许你等待所有的加载和渲染和东西完成。如果事情没有正确发生,等待会超时。测试时使用“waits”不休眠,条件要么满足,要么不满足。如果没有,您需要检查页面是否更改。
    • 真的没有例子吗?也许在新标签中打开所有链接?
    • 对不起,我不是 Python 程序员;我在 Selenium Web 驱动程序和运行浏览器测试场景方面拥有丰富的经验。无论如何,这确实是哲学上的——因为等待和排序的细节在不同的场景中是不同的。有关 Python 中“等待条件”的详细信息,请参阅提供的链接 - 有很多!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2020-11-06
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2014-10-21
    相关资源
    最近更新 更多