【问题标题】:Selenium random timeout exceptions without any messageSelenium 随机超时异常,没有任何消息
【发布时间】:2013-06-30 05:21:49
【问题描述】:

这是我正在尝试做的事情,而且大部分时间我都成功了: 基本上我在一个网站上登录,然后等待一个类在源中,然后处理源代码。

我得到的例外:

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

我遇到了同样的异常。

我目前正在尝试这个:

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

我还没到失败的地步,我还在测试它。

对不起,这很长。但我想为这些随机超时找到一个 Pythonic 且干净的解决方案。

另一个可能有帮助的信息:登录过程有时很长,但即使等待几分钟,它也会引发异常。

【问题讨论】:

  • 你能发布异常的完整回溯吗?另外,您确定满足您指定的条件吗? (否则会在10秒后超时)
  • 您可以尝试使用另一个 WebDriver 来实际查看页面上发生的情况吗?也许只是你等待的条件没有得到满足。
  • 从测试的角度来看,你真的想通过一个类的存在来断言登录成功吗?您是否考虑过验证文本或可见元素?
  • @amey 验证文本/可见元素是什么意思?
  • @jadkik94 这意味着登录操作不起作用?将尝试使用 Firefox 网络驱动程序并让您知道

标签: python selenium timeout


【解决方案1】:

这是我联系 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)

这非常好用!

【讨论】: