【问题标题】:Python Selenium: Unable to Find Element After First RefreshPython Selenium:第一次刷新后无法找到元素
【发布时间】:2016-05-07 19:31:38
【问题描述】:

我见过这个问题的几个例子,但我不确定如何将这些更改应用于我的特定情况。我的代码可以监控网页的更改并每 30 秒刷新一次,如下所示:

import sys
import ctypes
from time import sleep
from Checker import Checker

USERNAME = sys.argv[1]
PASSWORD = sys.argv[2]


def main():
    crawler = Checker()
    crawler.login(USERNAME, PASSWORD)
    crawler.click_data()
    crawler.view_page()
    while crawler.check_page():
    crawler.wait_for_table()
    crawler.refresh()
ctypes.windll.user32.MessageBoxW(0, "A change has been made!", "Attention", 1)


if __name__ == "__main__":
    main()

问题是 Selenium 在第一次刷新后总是会显示一个错误,指出它无法定位元素。我怀疑,有问题的元素是一个表,我使用以下函数从中检索数据:

def get_data_cells(self):
    contents = []
    table_id = "table.datadisplaytable:nth-child(4)"
    table = self.driver.find_element(By.CSS_SELECTOR, table_id)
    cells = table.find_elements_by_tag_name('td')
    for cell in cells:
        contents.append(cell.text)
    return contents

我不知道问题出在上述函数中还是在main() 中。什么是让 Selenium 刷新页面而不返回此类错误的简单方法?

更新:

我已经添加了一个等待功能并相应地调整了main()功能:

def wait_for_table(self):
    table_selector = "table.datadisplaytable:nth-child(4)"
    delay = 60
    try:
        wait = ui.WebDriverWait(self.driver, delay)
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, table_selector)))
    except TimeoutError:
        print("Operation timeout! The requested element never loaded.")

由于同样的错误仍然存​​在,要么是我的计时功能无法正常工作,要么不是计时问题。

【问题讨论】:

  • 您是否尝试为表格完整渲染添加一些时间?
  • @Andersson 是的。请参阅上面的更新。
  • 请检查您的表格是否位于<frame><iframe> 块内
  • @Andersson 该表确实在<iframe> 块内。这与错误消息有何关系?
  • 抱歉,我想说的是<frame>,而不是<iframe>

标签: python selenium selenium-webdriver


【解决方案1】:

我之前在进行网络抓取时遇到了同样的问题,发现重新发送 GET 请求(而不是刷新)似乎可以消除它。

它不是很优雅,但它对我有用。

【讨论】:

  • 这实际上是我尝试的第一个解决方法。零差异。
  • 嗯,很奇怪。这通常对我有用。您可能会哭着关闭网络驱动程序,然后重新启动它(即执行 crawler.close() 然后 crawler.get('http://...')。虽然这可能不够快,因为你说你是每 30 秒执行一次。
【解决方案2】:

我似乎已经解决了我自己的问题。

我的refresh()函数是这样写的:

def refresh():
    self.driver.refresh()

我所做的只是在refresh() 调用之后立即切换帧。那就是:

def refresh():
    self.driver.refresh()
    self.driver.switch_to.frame("content")

这就解决了。我可以看到页面现在正在刷新,没有问题。

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2022-09-30
    • 2022-12-21
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多