当前位置: 首页 > 知识库问答 >
问题:

在浏览器中向后移动时,即使在刷新后也会出现过时元素引用异常

曾景龙
2023-03-14

我试图做一个刮刀,将通过一堆链接,导出为PDF格式的指南,并循环通过父文件夹中的所有指南。它运行良好,但是当我试图倒退时,它会抛出陈旧的异常,即使我确保刷新代码中的元素,或者刷新页面。

from selenium import webdriver
import time, bs4

browser = webdriver.Firefox()
browser.get('MYURL')
loginElem = browser.find_element_by_id('email')
loginElem.send_keys('LOGIN')
pwdElem = browser.find_element_by_id('password')
pwdElem.send_keys('PASSWORD')
pwdElem.submit()
time.sleep(3)
category = browser.find_elements_by_class_name('title')
for i in category:
    i.click()
    time.sleep(3)
    guide = browser.find_elements_by_class_name('cell')
    for j in guide:
        j.click()
        time.sleep(3)
        soup = bs4.BeautifulSoup(browser.page_source, features="html.parser")
        guidetitle = soup.find_all(id='guide-intro-title')
        print(guidetitle)
        browser.find_element_by_link_text('Options').click()
        time.sleep(0.5)
        browser.find_element_by_partial_link_text('Download PDF').click()
        browser.find_element_by_id('download').click()
        browser.execute_script("window.history.go(-2)")
        print("went back")
        time.sleep(5)
        print("waited")
        guide = browser.find_elements_by_class_name('thumb')
        print("refreshed elements")
    print("made it to outer loop")

如果我都使用脚本向后移动浏览器或驱动程序,就会发生这种情况。back()方法。我可以看到它返回到子目录,然后等待并刷新元素。但是,它似乎无法加载新元素以进入下一个指南。我在这里发现了一个类似的问题,但有人只是提供了针对这个问题的代码,而不是解释,所以我仍然感到困惑。

我也知道使用waitdriver,但我现在只使用sleep,因为我不完全了解EC等待条件。无论如何,增加睡眠时间并不能解决这个问题。

共有1个答案

狄令
2023-03-14

由于DOM中的元素UUID更改,页面刷新时会发生过时的元素引用异常。如何避免:始终在交互之前尝试搜索元素。

在您的代码中,您搜索单元格,找到它们并将它们存储在Guide中。现在,Guide有一个硒UUID列表。但是,您正在循环遍历列表,每次刷新时(我相信当您返回时会发生这种情况),单元格的UUID会发生变化,因此您存储的旧单元格不再附加到DOM。当试图与它们交互时,Selenium无法在DOM中找到它们并抛出此异常。

而不是循环通过引导您的方式,尝试每次重新查找元素,如:

guide = browser.find_elements_by_class_name('cell')
for j in range(len(guide)):
    browser.find_elements_by_class_name('cell')[j].click()

请注意,看起来类别可能有类似的问题,所以也尝试将此解决方案应用于类别

希望这有帮助。这里有一个类似的问题和解决方案。

 类似资料:
  • 问题内容: 如果转到页面a并滚动浏览,则刷新页面将在您离开页面的位置刷新。这很好,但是在URL中存在锚点位置的页面上也会发生这种情况。例如,如果您单击一个链接并在环顾四周后刷新页面,您将不会处于锚点,而页面会跳来跳去。有什么办法可以防止使用javascript吗?因此,无论如何,您始终可以导航到锚点。 问题答案: 由于浏览器行为的更改,不再建议使用此解决方案。查看其他答案。 基本上,如果使用锚,则

  • 我正在尝试简单地登录到这个页面来访问LexisNexis。下面是我的代码: 下面是html源代码:

  • 我对Hibernate和JPA存储库的实现有问题。 我得到了关于错误: "发生异常后不要刷新会话" 这是从第节开始的- 消息表: 用户表: 服务: 可能这就是问题所在——这是一个例外。会议仍然开放。当然,我在服务中有事务注释。 以及执行日志:

  • 我尝试只更新chart.js,而不需要刷新浏览器,也不需要重新加载所有行的动画。我尝试使用简单的命令chart.update(),但它不断刷新浏览器和动画。我想用尽可能简单的方式来做这件事。我的数据来自数据库。 这是我的图表: 这是我试图更新图表的内容:

  • 我正在用随机整数填充ArrayList。然后,当我试图删除它们时,我得到了以下错误: 线程“main”java.lang.indexoutOfboundsException:在java.base/jdk.internal.util.preconditions.outofbounds(preconditions.java:64)在java.base/jdk.internal.util.precond

  • 问题内容: 我有一个包含10个元素的div,这些元素将被逐个更新,延迟时间为2秒。下面是相同的代码 但是,当我运行它时,所有元素都会一起更新。该程序只是添加一个延迟添加一个开始,并且所有元素都一起更新(被标记)。如何制作代码来逐一标记元素? 问题答案: 您正在打破React的两个基本规则: 不要直接改变状态 如果根据现有状态更新状态,请使用回调形式,因为状态更新可能是异步的(无论如何,在您的示例中