selenium隐式等待不起作用

这是我第一次使用selenium和无头浏览器,因为我想使用ajax技术来爬网某些网页。

效果很好,但是在某些情况下,加载整个页面会花费太多时间(尤其是当某些资源不可用时),因此我必须为selenium设置超时时间。

首先,我尝试了set_page_load_timeout()set_script_timeout(),但是当我设置这些超时时,如果页面未完全加载,我将不会得到任何页面源,如下代码所示:

driver = webdriver.Chrome(chrome_options=options)

driver.set_page_load_timeout(5)

driver.set_script_timeout(5)

try:

driver.get(url)

except Exception:

driver.execute_script('window.stop()')

print driver.page_source.encode('utf-8') # raise TimeoutException this line.

所以我尝试使用隐式等待和条件等待,如下所示:

driver = webdriver.Firefox(firefox_options=options, executable_path=path)

print("Firefox Headless Browser Invoked")

wait = WebDriverWait(driver, timeout=10)

driver.implicitly_wait(2)

start = time.time()

driver.get(url)

end = time.time()

print 'time used: %s s' % str(end - start)

try:

WebDriverWait(driver, 2, 0.5).until(expected.presence_of_element_located((By.TAG_NAME, 'body')))

print driver.find_element_by_tag_name('body').text

except Exception:

driver.execute_script('window.stop()')

这次我得到了想要的内容。但是,它花费的时间很长(40+秒),这意味着我设置的2秒钟的超时时间根本不起作用。

在我看来,driver.get()呼叫直到浏览器停止加载页面才结束,只有在以下代码可以正常工作之后,您才能终止get()呼叫,否则您将一无所获。但这与selenium文档有很大不同,我真的很想知道错误在哪里。

环境:OSX 10.12,带有FireFox和GoogleChrome Headless的selenium3.0.9(均为最新版本)。

-更新----

谢谢您的帮助。我WebDriverWait()单独使用下面的代码,但是仍然存在调用持续很长时间的情况,这远超过我设置的超时时间。想知道我是否可以在超时后立即停止页面加载?

driver = webdriver.Firefox(firefox_options=options, executable_path=path)

print("Firefox Headless Browser Invoked")

start = time.time()

driver.get('url')

end = time.time()

print 'time used: %s s' % str(end - start)

try:

WebDriverWait(driver, 2, 0.5).until(expected.presence_of_element_located((By.TAG_NAME, 'body')))

print driver.find_element_by_tag_name('body').text

except Exception:

driver.execute_script('window.stop()')

driver.quit()

这是测试中的终端输出:

Firefox Headless Browser Invoked

time used: 44.6049938202 s

根据代码,这意味着driver.get()呼叫需要44秒才能完成呼叫,这是意外的,我想知道是否误解了无头浏览器的行为?

回答:

正如您在问题中提到的,如果 被测应用程序 ( *

  • 在您的第一个场景中,你已经引起双方set_page_load_timeout(5)set_script_timeout(5)

    • set_page_load_timeout(time_to_wait) :设置在引发异常之前等待页面加载完成的时间。
    • set_script_timeout(time_to_wait):设置脚本在execute_async_script调用期间应等待的时间(引发异常)。

因此, 两种情况 下,被测应用程序均 依赖 JavaScriptAJAX调用 会引发 TimeoutException

  • 在第二种情况下,您同时引出implicitly_wait(2)WebDriverWait(driver, 2, 0.5)

    • implicitly_wait(time_to_wait) :将超时设置为隐式等待找到元素或命令完成。
    • WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None) :将超时设置与不同 expected_conditions
    • 但是您正在 经历很长的超时时间(40+秒), 因为 文档中 已明确提到

:请勿混合使用隐式和显式等待。这样做可能导致无法预测的等待时间。例如,将隐式等待设置为10秒,将显式等待设置为15秒,则可能导致20秒后发生超时。

回答:

最好的解决方案是删除的所有实例implicitly_wait(time_to_wait)并替换WebDriverWait()为以使

被测应用程序(AUT) 保持稳定的行为。


回答:

根据您的反问题,当前代码块看起来很完美。的时候,你看到的测量time used: 44.6049938202 s是所需的时间 网页

完全和功能加载对于所需要的时间 客户端 (即 Web浏览器 来控制返回到) webdriver的 情况下,一旦

等于 。 Selenium

或作为用户,您无法控制此渲染过程。但是,为了获得更好的性能,您可以遵循以下最佳做法:

  • 保持您的 版本当前为最新状态 Java SE Development Kit 8u162
  • 保持您的 版本当前为 selenium 3.9.0的 最新版本 __
  • 保持您的 版本更新。
  • 保持您的 版本更新。
  • 定期在IDE中清理 项目工作区 ,以仅使用所需的依赖项来构建项目。
  • 在执行 Test Suite 之前和之后,使用 工具清除OS杂项。 __
  • 如果您的 Web浏览器 基本版本太旧,请通过 卸载 Web浏览器 ,然后安装最新发布的GA版本的 Web浏览器 。 __
  • 执行 测试

以上是 selenium隐式等待不起作用 的全部内容, 来源链接: utcz.com/qa/433897.html

回到顶部