5

我必须使用一些非常慢的代理,并且时不时地被卡住。因此,我正在尝试为此找到解决方案/解决方法,这是我的问题:

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完全加载,在某些极端情况下可能需要数小时。

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

4

2 回答 2

0

我还没有看到这个问题的好答案,所以我想我会给出我的解决方案。我在使用 selenium 时遇到过很多次这种情况,尽管它是 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次尝试后它会杀死自己。您还可以对如何在不同状态下重新启动程序等进行更多控制。

于 2013-07-18T17:02:34.333 回答
0

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

也试试这个。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

于 2013-03-25T12:39:39.530 回答