18

我正在测试一个有很多代理的网站,问题是其中一些代理非常慢。因此,我的代码时不时地卡在加载页面上。

from selenium import webdriver

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

我已经尝试了很多类似explicit waits或的东西,implicit waits并且已经搜索了很长一段时间,但仍然没有找到解决方案或解决方法。似乎没有什么真正影响 page loading line 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(),尽管它不会阻塞直到新页面完全加载up,another_element = browser.find_element_by_id("another_element")是新的麻烦,因为要么explicit waitsimplicit waits将等待整个页面加载,然后再开始寻找该元素。在某些极端情况下,这甚至需要HOURS。我能做些什么呢?

4

2 回答 2

12

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

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

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

于 2012-05-25T11:34:24.567 回答
0

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

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

于 2016-10-10T05:51:21.413 回答