Selenium 随机超时异常,没有任何消息 [英] Selenium random timeout exceptions without any message
问题描述
这是我正在尝试做的,而且大部分时间我都成功了:基本上我是在一个网站上登录,然后等待一个类在源代码中,然后处理源代码.
Here is what I'm trying to do and most of the time I succeed: Basically I'm signing in on a website and then wait for a class to be in the source, then process the source code.
我得到的异常:
Traceback (most recent call last):
File "foo.py", line 495, in <module>
report(login, password)
File "foo.py", line 430, in report
data = bar(login, password)
File "foo.py", line 113, in
ui.WebDriverWait(browser, 10).until(lambda browser: browser.find_elements_by_class_name("the-class-i-want"))
File "/Library/Python/2.7/site-packages/selenium/webdriver/support/wait.py", line 71, in until
raise TimeoutException(message)
selenium.common.exceptions.TimeoutException: Message: ''
代码如下:
from selenium import webdriver
import contextlib
from selenium.webdriver.common.keys import Keys
import selenium.webdriver.support.ui as ui
from selenium.webdriver.support.wait import WebDriverWait
with contextlib.closing(webdriver.PhantomJS('phantomjs')) as browser:
browser.get('mywebsite')
login_form = browser.find_element_by_id('login-form')
email = browser.find_element_by_name('login')
password = browser.find_element_by_name('password')
email.send_keys(login)
password.send_keys(password)
password.send_keys(Keys.RETURN)
ui.WebDriverWait(browser, 10).until(lambda browser: browser.find_elements_by_class_name("the-class-i-want"))
我也试过这个:
wait_count = 0
while wait_count < 6:
print wait_count
ui.WebDriverWait(browser, 10).until(lambda browser: browser.find_elements_by_class_name("the-class-i-want"))
if browser.find_elements_by_class_name("the-class-i-want"):
break
wait_count += 1
我也遇到了同样的异常.
I get the same exception.
我目前正在尝试:
wait_count = 0
while wait_count < 6:
try:
ui.WebDriverWait(browser, 10).until(lambda browser: browser.find_elements_by_class_name("the-class-i-want"))
if browser.find_elements_by_class_name("the-class-i-want"):
break
except:
wait_count += 1
continue
我还没到它失败的地步,我还在测试它.
I haven't got to the point where it fails, I'm still testing it.
抱歉,这很长.但我想为那些随机超时找到一个 Pythonic 和干净的解决方案.
Sorry this is very long. But I'd like to find a pythonic and clean solution to those random timeouts.
另一个有用的信息:登录过程有时很长,但即使等待几分钟,它也会抛出异常.
Another info that could help too: the signing in process is sometimes very long, but even with a several minutes wait, it throws the exception.
推荐答案
这是我联系 Adam Goucher 后得到的答复:
Here is the answer I got after contacting Adam Goucher:
from selenium import webdriver
import contextlib
from selenium.webdriver.common.keys import Keys
import selenium.webdriver.support.ui as ui
from selenium.webdriver.support.wait import WebDriverWait
def waiter(browser):
elements = browser.find_elements_by_class_name('the-class-i-want')
if len(elements) != 0:
return elements
return False
with contextlib.closing(webdriver.PhantomJS('phantomjs')) as browser:
browser.get('mywebsite')
login_form = browser.find_element_by_id('login-form')
email = browser.find_element_by_name('login')
password = browser.find_element_by_name('password')
email.send_keys(login)
password.send_keys(password)
password.send_keys(Keys.RETURN)
ui.WebDriverWait(browser, 10).until(waiter)
这工作得很好!
这篇关于Selenium 随机超时异常,没有任何消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!