Selenium 可以检测网页何时在 Python3 中完成加载吗?

Can Selenium detect when webpage finishes loading in Python3?

我在python中写道:

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
driver.get(url)
try:
    WebDriverWait(driver, 10).until(
        lambda driver: driver.execute_script('return document.readyState') == 'complete')
except se.TimeoutException:
    return False
# Start Parsing

尽管我已经为某些网站等待 readyState,但当我解析它时,我发现没有复选框。但是,如果我在解析同一个网站之前添加 time.sleep(5),我会发现有一个复选框。

我的问题是,我怎样才能拥有适用于大多数网站的通用解决方案?我不能只写 time.sleep(5),因为有些网站可能需要更多,有些可能会在 0.001 秒内完成(这会对性能产生不良影响...)

我只是想刺激一个真正的浏览器,而不是在刷新按钮再次出现之前不处理任何事情(这意味着一切都已加载)。

理想情况下,Web 应用程序在通过 get() 访问时,returns 只有在 document.readyState equals to complete 时才将控件交给 WebDriver。因此,除非 AUT(正在测试的应用程序)表现不佳,否则以下代码行通常是开销:

WebDriverWait(driver, 10).until(lambda driver: driver.execute_script('return document.readyState') == 'complete')

但是,根据您的测试要求,您可以将 配置为:

  • none
  • eager
  • normal

You can find a detailed discussion in What is the correct syntax checking the .readyState of a website in Selenium Python

此时需要注意的是,在没有任何特定条件的情况下使用time.sleep(secs)来实现达不到Automation[=54的目的=],应该不惜一切代价避免。


解决方案

适用于所有网站的通用方法是根据普遍的测试场景引入 WebDriverWait。例如:

  • 要等待元素的存在,您需要调用 presence_of_element_located()
  • 的 expected_conditions
  • 要等待元素的可见性,您需要调用 visibility_of_element_located()
  • 的 expected_conditions
  • 要等待元素可见、启用和可交互以便您可以单击它,您需要调用 element_to_be_clickable()[的 expected_conditions