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

点击网站上的所有链接,并进行操作。元素引用已过时

公冶峰
2023-03-14

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

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

链接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.消息:元素引用已失效。要么元素不再附加到DOM,要么页面已经刷新。

on line:
for link in links:
    link.click() <----

我怎样才能修好它?(Python 2.7)

共有1个答案

翁钧
2023-03-14

有几件事:

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

由于您使用的是“back()”,所以只有在成功移出上一页时,您才会希望这样做,这也是为什么最好专门测试这些操作的原因之一——例如,您如何知道每次单击()都应该让您“前进”,可能还涉及其他一些操作。在这里,您正在对DOM进行假设,这是可以的,但在执行其他操作之前,您需要检查您的条件。例如,如果在加载下一页之前“向后”移动,则会丢失DOM。

此外,back()可能会导致DOM刷新,从而更改元素标识符。如果是这样的话,你需要在每次返回后验证你的页面,并通过索引遍历元素,在单击之前逐个查找它们。

我总是发现更好的做法是对点击操作等事情更加严格。单击特定的链接并检查特定的结果——并在操作之间使用等待条件来确保你正处于你期望的位置。

更多关于等待条件的信息。

 类似资料:
  • 我知道如何让它点击链接,但一旦我进入新页面(新URL),我就无法让它在同一个会话中继续脚本。 当我指定新网址时,它会打开一个新窗口,并且不能继续,因为需要继续从上一页插入信息。 如何解决这个问题? 另外,我在python工作 上述代码应该没有任何问题。

  • 我试图找到断开的链接通过使用 但是问题是它只找到存在于主页上的链接。有没有办法找到网页上所有可用链接的目录?

  • 问题内容: 我正在尝试通过Selenium进行网络抓取。我的问题很简单:如何找到链接,然后如何单击它?例如:以下是我要网页抓取的HTML: 因此,如您所见,“详细信息”是一个链接。 如何使用Selenium找到该链接并单击它? 问题答案: 您可以使用: 例如: 要单击它,只需调用click方法:

  • 我的目标是使用selenium python来点击这个超链接元素,下面是我尝试过的3个解决方案,没有一个有效。 解决方案1: 错误消息:selenium.common.exceptions.javascriptException:消息:javascript错误:无法读取未定义的属性“click” 那么,每个解决方案都出了什么问题呢?我怎么才能让它起作用?

  • 我想知道是否有更好的(或只是其他)方法来获得进入流的终端操作的所有项目的计数,而不是以下方法: 其中给出了该阶段处理项目的实际计数。 我故意跳过了终端操作,因为这可能会在<代码>之间发生变化。forEach,或。收集。我确实知道。已经开始计数了,但只有我交换了一个

  • 我使用JavaFx WebView来显示网页,但我不想在网页和Web引擎上禁用Javascript的任何交互(位置更改)。由于这个原因,我试图禁用超链接的所有操作并通过以下方式提交表单 所以我不能拖他们。有没有其他办法解决这个问题?通过CSS或JavaFx更好地解决它<谢谢你的提前通知。