在Selenium WebDriver中设置加载页面的实际超时时间?

时间:2012-05-25 07:24:03

标签: python selenium webdriver selenium-webdriver wait

我正在测试一个包含大量代理的网站,问题是其中一些代理非常慢。因此我的代码时不时地加载页面。

from selenium import webdriver

browser = webdriver.Firefox()
browser.get("http://example.com/example-page.php")
element = browser.find_element_by_id("someElement")

我尝试过很多像explicit waitsimplicit waits这样的东西,并且已经搜索了很长一段时间但仍然没有找到解决方案或解决方法。似乎没有什么真正影响页面加载行browser.get("http://example.com/example-page.php"),这就是为什么它总是卡在那里。

有人为此获得了解决方案吗?

更新1:

JimEvans的回答解决了我之前的问题,here你可以找到这个新功能的python补丁。

新问题:

browser = webdriver.Firefox()
browser.set_page_load_timeout(30)

browser.get("http://example.com/example-page.php")

element = browser.find_element_by_id("elementA")
element.click() ## assume it's a link to a new page http://example.com/another-example.php

another_element = browser.find_element_by_id("another_element")

正如您所看到的,browser.set_page_load_timeout(30)仅影响browser.get("http://example.com/example-page.php"),这意味着如果此页面加载超过30秒,它将抛出超时异常,但问题是它没有超过页面加载功能作为element.click(),虽然在新页面完全加载之前它不会阻止,another_element = browser.find_element_by_id("another_element")是屁股中的新痛点,因为explicit waitsimplicit waits会等待整个页面在开始寻找该元素之前加载。在某些极端情况下,这甚至需要 HOURS 。我该怎么办呢?

2 个答案:

答案 0 :(得分:12)

您可以尝试使用库中引入的页面加载超时。它的实现并不是通用的,但它通过.NET和Java绑定可以肯定,并且现在已经在Firefox驱动程序中实现,并且在即将推出的2.22中的IE驱动程序中实现。在Java中,要将页面加载超时设置为15秒,设置它的代码将如下所示:

driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS);

如果它没有在Python语言绑定中公开,我确信维护者会急切地接受实现它的补丁。

答案 1 :(得分:0)

您仍然可以通过等待5-8秒的预期元素的存在(不等待可见性)然后发送window.stop()JS脚本(停止加载更多元素)而不等待整个来加速脚本执行页面加载或捕获页面加载超时异常5-8秒后调用window.stop()

因为如果页面没有采用延迟加载技术(仅加载可见元素并仅在滚动后加载元素的其余部分),它会在返回window.ready状态之前加载每个元素,因此如果任何元素需要更长的时间,它将会更慢渲染。