2012-05-25 44 views
5

我必须使用一些非常慢的代理,并且偶尔会卡住。因此,我试图找到一个解决方案/解决方法,这里是我的问题:使用Python在Selenium Webdriver(Selenium 2)中显式等待和隐式等待的问题

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 

browser = webdriver.Firefox() 
browser.get("http://whateversite.com") 

element = browser.find_element_by_id("element") 
element.click() # go to page http://whateversite.com/page.html 

new_element = browser.find_element_by_id("newElement") 

如果设置了browser.implicitly_wait(30)前手或使用new_element = WebDriverWait(browser, 30).until(lambda browser : browser.find_element_by_id("newElement"))它只是卡住了,有时几个小时不管。它似乎等待页面http://whateversite.com/page.html完全加载,在某些极端情况下可能需要几小时。

我该怎么做才能避免这种情况?

+0

实际使用的浏览器是什么?如果您使用Firefox或Chrome,它会有所作为吗?你的代码看起来应该可以工作。手动访问这些网站会发生什么? – aychedee

+0

@ H.Dunlop:火狐,对不起,我刚纠正了代码。 – Shane

+3

可能的重复[告诉我为什么这不会以超时错误结束(selenium 2 webdriver)?](http://stackoverflow.com/questions/10757061/tell-me-why-this-does-not-end -up-with-a-timeout-error-selenium-2-webdriver) – AutomatedTester

回答

0

尝试使用不稳定的负载策略。 例如FirefoxProfile profile = new FirefoxProfile(); profile.setPreference("webdriver.load.strategy", "unstable"); WebDriver driver = new FirefoxDriver(profile);` 你可以找到http://www.whatwg.org/specs/web-apps/current-work/multipage/dom.html#current-document-readiness

更多信息,也可以尝试这个。 driver.manage()。timeouts()。pageLoadTimeout(30,TimeUnit.SECONDS); http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#pageLoadTimeout%28long,%20java.util.concurrent.TimeUnit%29

0

我还没有看到这个问题很好的答案,所以我想我会给我的解决方案。我曾多次遇到过使用硒的问题,并且像hack-y一样,我使用期望。 expect是一个非常简单的基于tcl的语言,可让您轻松产生其他程序并等待输入或超时并执行某些操作。的所以基本上而不是使用SEL的等待,我创建一个使用Python的睡眠等功能:

def wait(waittime=30): 
    print 'kick' 
    time.sleep(waittime) 

.. 

然后创建run.exp:

set timeout 30 
set try 0 

while 1 { 
    spawn /usr/bin/python test.py 
     while 1 { 
      expect "kick" {exp_continue} 
      timeout { 
       if {$try > 5} { 
        exit 
       } 
       incr try 
      } 
     } 
    } 
} 

这就是一切,它通常工作得很好,基本上它会尝试重新启动程序,如果它挂起。 5次尝试后会自杀。你也可以有更多的控制,以便如何在不同的状态下重新启动你的程序等。

相关问题