我必须与一些非常慢的代理一起工作并且时不时地陷入困境。因此,我正在尝试为此找到解决方案/解决方法,这是我的问题:
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
完全加载,在某些极端情况下可能需要数小时。
我应该怎么做才能避免这种情况?
答案 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次尝试,它会自杀。您还可以拥有更多关于如何在不同状态下重新启动程序的控件等。