我已经看过这个问题的一些例子,但我不确定如何将更改应用到我的特定情况。我有代码监视网页的变化并每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.")
由于仍然发生相同的错误,我的定时功能无法正常工作或者不是定时问题。
答案 0 :(得分:0)
我之前在进行网络抓取时遇到了同样的问题,发现重新发送GET请求(而不是刷新)似乎消除了它。
它不是很优雅,但它对我有用。
答案 1 :(得分:0)
我似乎解决了自己的问题。
我的refresh()
函数编写如下:
def refresh():
self.driver.refresh()
我所做的就是在refresh()
电话后立即切换帧。那就是:
def refresh():
self.driver.refresh()
self.driver.switch_to.frame("content")
这照顾了它。我可以看到页面现在刷新没有问题。