2013-07-02 10 views
9

Oto, co próbuję wykonać: i przez większość czasu wykonuję następujące polecenia: Zasadniczo loguję się na stronie internetowej, a następnie czekam, aż klasa znajdzie się w źródle , następnie przetwarzaj kod źródłowy.Wyjątki losowe losowania Selenium bez żadnej wiadomości

Wyjątkiem uzyskać:

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

Oto kod:

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

Próbowałem to zbyt:

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 

uzyskać ten sam wyjątek.

Obecnie próbuję to:

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 

nie mam do punktu, w którym nie udaje, jestem ciągle sprawdzając je.

Niestety to bardzo długo. Ale chciałbym znaleźć pytonowe i czyste rozwiązanie tych losowych limitów czasu.

Kolejne informacje, które mogą pomóc: proces rejestracji jest czasami bardzo długi, ale nawet po kilku minutach oczekiwania wyrzuca wyjątek.

+0

Czy możesz zamieścić pełne informacje o wyjątku? Ponadto, czy jesteś pewien, że określony warunek jest spełniony? (w przeciwnym razie upłynie limit czasu po "10" sekundach) – jadkik94

+0

Post edytowany, przepraszam – nnaelle

+0

Czy możesz spróbować użyć innego WebDrive, w którym rzeczywiście możesz zobaczyć, co dzieje się na stronie? Może po prostu warunek, na który czekasz, nie jest spełniony. – jadkik94

Odpowiedz

5

Oto odpowiedź dostałem po skontaktowaniu 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) 

I to działa perfekcyjnie!

Powiązane problemy