硒含蓄地等待不起作用

时间:2018-02-26 13:44:16

标签: selenium selenium-webdriver webdriver web-crawler implicitwait

这是我第一次使用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.

所以我尝试使用Implicitly Wait和Conditional Wait,如下所示:

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()来电或您# 39,什么都没得到。 但这与硒文档非常不同,我真的想知道错误在哪里。

环境:OSX 10.12,硒3.0.9与FireFox& GoogleChrome Headless(最新版本。)

---更新----

感谢您的帮助。我使用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秒才能完成调用,这是意料之外的,我想知道我是否误解了无头浏览器的行为?

1 个答案:

答案 0 :(得分:1)

正如您在问题中提到的那样,加载整个页面需要花费太多时间(特别是当某些资源不可用时)如果正在测试的应用程序 AUT )使用 JavaScript AJAX调用

因此受测试的应用程序依赖于 JavaScript AJAX调用存在这两个条件会引发 TimeoutException

  

警告:不要混合隐式和显式等待。这样做会导致不可预测的等待时间。例如,设置10秒的隐式等待和15秒的显式等待可能会导致20秒后发生超时。

解决方案:

最佳解决方案是删除implicitly_wait(time_to_wait)的所有实例,并替换为WebDriverWait()以获得受测试应用程序(AUT)的稳定行为。

更新

根据你的反问题,当前的代码块看起来很完美。您看到time used: 44.6049938202 s的时间的度量是网页完全加载和功能所需的时间,即客户端所需的时间(即 Web浏览器),一旦' document.readyState' 等于 WebDriver 实例>"完成" Selenium 或作为用户,您无法控制此渲染过程。但是为了获得更好的性能,您可以遵循以下最佳实践:

  • 目前更新 JDK 版本Java SE Development Kit 8u162
  • 立即更新 Selenium客户端版本selenium 3.9.0
  • 更新 WebDriver 版本。
  • 更新 Web浏览器版本。
  • 定期清理IDE中的 Project Workspace ,以构建仅具有所需依赖关系的项目。
  • 使用CCleaner工具清除 Test Suite 执行前后的操作系统杂务。
  • 如果您的 Web浏览器基础版本太旧,请通过Revo Uninstaller卸载 Web浏览器并安装最新的GA发布版本的 Web浏览器
  • 执行测试