2012-05-25 18 views
18

我测试一个网站,有很多代理的,问题是一些人代理的都是非常缓慢。因此,我的代码被困在加载页面时不时。在Selenium WebDriver中设置一个真正的超时加载页面?

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你可以找到关于此新功能蟒蛇补丁。

新的问题:

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将等待整个页面加载它开始寻找之前那个元素。在某些极端情况下,这甚至需要小时。我能做些什么呢?

回答

12

你可以尝试使用在库中引入了页面加载超时。它的实现不是通用的,但它通过.NET和Java绑定暴露出来,并已在现在的Firefox驱动程序中实现,并在即将推出的2.22版本的IE驱动程序中实现。在Java中,设置页面加载超时15秒,代码来设置它应该是这样的:

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

如果它不是用Python语言绑定暴露,我敢肯定,维护者会急切地接受实现它的补丁。

+0

酷!当然是一个很好的功能。 –

+0

@JimEvans:感谢队友,我刚刚为此http://code.google.com/p/selenium/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Stars%20Type%找到了python补丁程序20Status%20Priority%20Milestone%20Owner%20Summary&groupby =&sort =&id = 687,而且效果很好。 – Shane

+0

@JimEvans:嘿伙计,请检查我的更新。有一个新问题困扰着我。 – Shane

0

可以通过为说预期元素等待的存在(不等待能见度)5-8秒,然后发送window.stop()JS脚本(停止加载其他元素),而无需等待还在加速你的脚本执行整个页面加载或捕获超过5-8秒后页面加载超时异常,然后调用window.stop()

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

相关问题