Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
420 views
in Technique[技术] by (71.8m points)

python - 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.

The exception I get:

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: '' 

Here is the code:

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"))

I tried this too:

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.

I am currently trying this :

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.

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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)

And this works perfectly fine!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...