我正在测试一个包含大量代理的网站,问题是其中一些代理非常慢。因此我的代码时不时地加载页面。
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
这样的东西,并且已经搜索了很长一段时间但仍然没有找到解决方案或解决方法。似乎没有什么真正影响页面加载行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 waits
或implicit waits
会等待整个页面在开始寻找该元素之前加载。在某些极端情况下,这甚至需要 HOURS 。我该怎么办呢?
答案 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状态之前加载每个元素,因此如果任何元素需要更长的时间,它将会更慢渲染。