【问题标题】:Set up a real timeout for loading page in Selenium WebDriver?在 Selenium WebDriver 中设置加载页面的真正超时?
【发布时间】:2012-05-25 07:24:03
【问题描述】:

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

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。我该怎么办?

【问题讨论】:

    标签: python selenium webdriver selenium-webdriver wait


    【解决方案1】:

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

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

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

    【讨论】:

    • 酷!当然是一个不错的功能。
    • @JimEvans:谢谢伙计,我刚刚找到了这个code.google.com/p/selenium/issues/… 的python 补丁,效果很好。
    • @JimEvans:嘿,伙计,请检查我的更新。有一个新问题困扰着我。
    • @JimEvans:你在 IE 中引入了pageLoadTimeout()?为什么没有人把它放到更新日志中?地狱,是的,我等了很久:)
    • 在 2.22 之前没有特定于 IE 驱动程序的变更日志,因为没有独立的 IE 位分配机制。现在有,每个更改都记录在案,但由于 2.22.0 是基线,它没有将项目整个历史中的每个更改都包含在它的第一个条目中。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-23
      • 2015-02-10
      • 1970-01-01
      • 2015-11-23
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      相关资源
      最近更新 更多