2

这是我第一次使用 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, selenium 3.0.9 with 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 秒才能完成调用,这是出乎意料的,我想知道我是否误解了无头浏览器的行为?

4

1 回答 1

1

正如您在问题中提到的那样,如果被测应用程序AUT)使用JavaScriptAJAX 调用,则很可能加载整个页面(尤其是在某些资源不可用时)需要花费太多时间

因此,在同时存在这两种情况的情况下,被测应用程序依赖于JavaScriptAJAX 调用会引发TimeoutException

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

解决方案 :

最好的解决方案是删除所有实例implicitly_wait(time_to_wait)并替换WebDriverWait()Application Under Test (AUT)的稳定行为。


更新

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

  • 当前保持您的JDK版本更新Java SE Development Kit 8u162
  • 保持您的Selenium 客户端版本当前更新selenium 3.9.0
  • 保持您的WebDriver版本更新。
  • 保持您的网络浏览器版本更新。
  • 定期清理IDE 中的项目工作区,以仅使用所需的依赖项构建项目。
  • 使用CCleaner工具在执行测试套件之前和之后清除操作系统的琐事。
  • 如果您的Web 浏览器基本版本太旧,请通过Revo Uninstaller卸载Web 浏览器并安装最新的 GA 发布版本的Web 浏览器
  • 执行你的测试
于 2018-02-26T14:41:06.750 回答