使用Python在Selenium Webdriver(Selenium 2)中显式等待和隐式等待的问题

时间:2012-05-25 14:52:30

标签: python selenium-webdriver

我必须与一些非常慢的代理一起工作并且时不时地陷入困境。因此,我正在尝试为此找到解决方案/解决方法,这是我的问题:

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"))它都会卡住,有时候只是为了HOURS。似乎等待该页面http://whateversite.com/page.html完全加载,在某些极端情况下可能需要数小时。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我没有看到这个问题的好答案,所以我想我会给出解决方案。我已经多次遇到过使用硒和hack-y的情况,我使用了expect。 expect是一种非常简单的基于tcl的语言,可以让您轻松生成其他程序并等待输入或超时并执行某些操作。所以基本上不是使用sel的等待,我创建一个使用python的sleep等待的函数:

import time

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次尝试,它会自杀。您还可以拥有更多关于如何在不同状态下重新启动程序的控件等。