2013-07-02 23 views
9

Ecco cosa sto cercando di fare e la maggior parte delle volte che riesco: Fondamentalmente sto accedendo a un sito Web e quindi attendo che una classe si trovi nella sorgente , quindi elaborare il codice sorgente.Eccezioni casuali di timeout del selenio senza alcun messaggio

L'eccezione ottengo:

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

Ecco il codice:

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

ho provato anche questo:

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 

ottengo la stessa eccezione.

Attualmente sto cercando questo:

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 

non ho al punto in cui viene a mancare, sto ancora testarlo.

Siamo spiacenti, questo è molto lungo. Ma mi piacerebbe trovare una soluzione pitonica e pulita a quei timeout casuali.

Un'altra informazione che potrebbe aiutare anche: la firma in corso è a volte molto lunga, ma anche con diversi minuti di attesa, si getta l'eccezione.

+0

Puoi pubblicare il traceback completo dell'eccezione? Inoltre, sei sicuro che la condizione specificata sia soddisfatta? (altrimenti, verrà timeout dopo "10" secondi) – jadkik94

+0

Post modificato, spiacente – nnaelle

+0

Puoi provare a utilizzare un altro WebDriver in cui puoi effettivamente vedere cosa sta succedendo sulla pagina? Forse è solo che la condizione che stai aspettando non viene soddisfatta. – jadkik94

risposta

5

Ecco la risposta che ho ricevuto dopo aver contattato 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) 

E questo funziona perfettamente bene!

Problemi correlati