如何在Selenium WebDriver中设置真正的页面加载超时时间?

18

我正在测试一个使用众多代理的网站,但问题是其中一些代理非常慢。因此,我的代码偶尔会陷入加载页面的困境。

from selenium import webdriver

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

我已经尝试了很多方法,例如显式等待隐式等待,并且一直在搜寻解决方案或变通方法。但似乎没有什么能够真正影响页面加载行browser.get("http://example.com/example-page.php"),这就是为什么它总是卡在那里。

有人有解决方法吗?

更新1:

JimEvans的回答解决了我的之前的问题,这里可以找到这个新功能的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")是一个新的麻烦,因为无论是显式等待还是隐式等待都要等待整个页面加载完成才开始查找该元素。在极端情况下,这可能需要甚至几个小时。我该怎么办?

2个回答

12

你可以尝试使用该库中引入的页面加载超时时间。它的实现并不通用,但已经暴露在.NET和Java绑定中,在Firefox驱动程序中已经实现,在即将发布的2.22版本中也将会在IE驱动程序中实现。在Java中,要将页面加载超时时间设置为15秒,代码如下:

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

如果在Python语言绑定中没有公开,我相信维护者会热心地接受一个实现它的补丁。


酷!肯定是一个很好的功能。 - Ashwin Prabhu
@JimEvans:嘿,伙计,请检查我的更新。有一个新问题困扰着我。 - Shane
@JimEvans:你在IE中引入了pageLoadTimeout()?为什么没有人将其放入更改日志中?太棒了,我等了这么久 :) - Petr Janeček
直到2.22版本之前,IE驱动程序没有特定的变更日志,因为没有独立的机制来分发IE位。现在有了这个机制,每个变更都有记录,但由于2.22.0是基线版本,它并没有包含整个项目历史上的每一个变更作为其第一条目录。 - JimEvans

0

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

因为,如果页面没有采用惰性加载技术(仅加载可见元素并在滚动后加载其余元素),它会在返回窗口.ready状态之前加载每个元素,因此如果任何元素需要较长时间才能渲染,则速度会变慢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接