【发布时间】: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