这是我第一次使用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秒才能完成呼叫,这是意外的,我想知道是否误解了无头浏览器的行为?
正如您在问题中提到的,如果 被测应用程序 ( AUT* )使用 JavaScript 或 AJAX调用
,则加载整个页面所花费的时间过多(尤其是在某些资源不可用时) 。 __
*
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
调用期间应等待的时间(引发异常)。因此, 在 两种情况 下,被测应用程序均 依赖 JavaScript 或 AJAX调用 会引发 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
警告
:请勿混合使用隐式和显式等待。这样做可能导致无法预测的等待时间。例如,将隐式等待设置为10秒,将显式等待设置为15秒,则可能导致20秒后发生超时。
最好的解决方案是删除的所有实例implicitly_wait(time_to_wait)
并替换WebDriverWait()
为以使
被测应用程序(AUT) 保持稳定的行为。
根据您的反问题,当前代码块看起来很完美。的时候,你看到的测量time used: 44.6049938202 s
是所需的时间 网页
完全和功能加载对于所需要的时间 客户端 (即 Web浏览器 来控制返回到) webdriver的 情况下,一旦
“document.readyState ‘ 等于 “完成” 。 Selenium
或作为用户,您无法控制此渲染过程。但是,为了获得更好的性能,您可以遵循以下最佳做法:
问题内容: 我正在学习Java Maven Selenium。我想要在Selenium中使用这样的东西。 打开网站(例如https://www.facebook.com) 单击登录的电子邮件字段 等待20秒 输入我的电子邮件 这是我的简单代码: 该代码不起作用。它只会打开Facebook,单击电子邮件字段并输入我的电子邮件ID,而不是等待10秒钟才输入我的电子邮件。 问题答案: 并且无法正常工作,
问题内容: 我正在学习Java Maven Selenium。我希望在Selenium中使用。 打开网站(例如https://www.facebook.com) 单击登录的电子邮件字段 等待20秒 输入我的电子邮件 这是我的简单代码: 该代码不起作用。它只会打开Facebook,单击电子邮件字段并输入我的电子邮件ID,而不是等待10秒钟才输入我的电子邮件。 问题答案: 并且无法正常工作,他们将在指
问题内容: 我是Selenium WebDriver的新手,正在尝试了解“等待”元素出现的正确方法。 我正在测试一个带有单选按钮答案的问题的页面。选择答案时,JavaScript可能启用/禁用页面上的某些问题。 问题似乎是Selenium的“单击速度太快”,而不是等待Javascript完成。我尝试用两种方式解决此问题- 显式等待解决了该问题。具体来说,这可以解决我的问题: 但是,我 宁愿 使用隐
但是这不起作用,正如bec所说的,驱动程序检测到web元素立即存在(并且可见和显示),但是单击不会起作用,除非我等待3秒钟。 同样,我不能使用: 出于同样的原因(这只在所述元素在3秒前不可点击/可见时才会起作用,但就而言--它立即可见) 谢了!
我如何用一个显式的替换这个隐式的等待呢? driver=新ChromeDriver(功能); driver.manage().DeleteAllCookies();
问题内容: 我是初学者。我了解基本等待的内容,但是我对互联网上的不同教程如何放置并进行解释感到困惑。例如,在下面的代码中,将其放置在加载URL之前。因此,是否只是等待URL加载或查找元素或两者兼而有之?的确,如果我在try块中使用一次隐式等待,它是否适用于我在代码中执行的每个元素搜索? 问题答案: 隐式等待 ImplicitWait按照该Java文档是指定的时间量 webdriver的 情况下,即