2013-07-02 5 views
9

Hier ist, was ich versuche zu tun und die meiste Zeit gelingt mir: Grundsätzlich bin ich auf einer Website anmelden und warten dann auf eine Klasse in der Quelle zu sein , dann den Quellcode verarbeiten.Selen Random Timeout Ausnahmen ohne Nachricht

Die Ausnahme, die ich erhalten:

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

Hier ist der 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")) 

ich dies auch versucht:

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 

ich die gleiche Ausnahme erhalten.

Ich bin derzeit versucht, dies:

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 

ich nicht auf den Punkt bekommen haben, wo es fehlschlägt, teste ich es noch.

Entschuldigung das ist sehr lang. Aber ich würde gerne eine pythonische und saubere Lösung für diese zufälligen Timeouts finden.

Eine weitere Information, die auch helfen könnte: Der Anmeldevorgang ist manchmal sehr lang, aber selbst mit ein paar Minuten Wartezeit löst er die Ausnahme aus.

+0

Können Sie die vollständige Rückverfolgung der Ausnahme buchen? Sind Sie sicher, dass die von Ihnen angegebene Bedingung erfüllt ist? (sonst wird es nach 10 Sekunden Timeout) – jadkik94

+0

Beitrag bearbeitet, sorry – nnaelle

+0

Können Sie versuchen, einen anderen WebDriver zu verwenden, wo Sie tatsächlich sehen können, was auf der Seite passiert? Vielleicht ist es nur, dass die Bedingung, auf die Sie warten, nicht erfüllt wird. – jadkik94

Antwort

5

Hier ist die Antwort, die ich bekam, nachdem Adam Goucher kontaktieren:

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) 

Und das funktioniert völlig in Ordnung!

Verwandte Themen