Python Selenium:首次刷新后无法找到元素

时间:2016-05-07 19:31:38

标签: python selenium selenium-webdriver

我已经看过这个问题的一些例子,但我不确定如何将更改应用到我的特定情况。我有代码监视网页的变化并每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.")

由于仍然发生相同的错误,我的定时功能无法正常工作或者不是定时问题。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

我的refresh()函数编写如下:

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

我所做的就是在refresh()电话后立即切换帧。那就是:

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

这照顾了它。我可以看到页面现在刷新没有问题。