2013-07-02 24 views
9

Yapmaya çalıştığım şey ve çoğu zaman başarılı olduğum şey: Temelde bir web sitesinde oturum açıp bir sınıfın kaynağında olmasını bekliyorum. sonra kaynak kodunu işleyin.Selenium rastgele zaman aşımı istisnaları, herhangi bir mesaj olmadan

istisna alıyorum:

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

Ben de bu çalıştı:

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 

Aynı durum almak İşte

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

kodudur.

Şu anda bu çalışıyorum: Ben hala onu test ediyorum, başarısız noktaya yok

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 

.

Üzgünüz, bu çok uzun. Ama bu rasgele zaman aşımlarına pythonic ve temiz bir çözüm bulmak istiyorum.

Ayrıca yardımcı olabilecek başka bir bilgi: işlemin imzalanması bazen çok uzun, ancak birkaç dakika beklese bile istisna atar.

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) 

Ve bu mükemmel çalışıyor:

+0

Özel durumun tam izini gönderir misiniz? Ayrıca, belirttiğiniz koşulun tatmin olduğundan emin misiniz? (aksi halde, 10 saniyeden sonra zaman aşımına uğrayacaktır) – jadkik94

+0

Post düzenlenmiş, üzgünüm – nnaelle

+0

Başka bir WebDriver'ı kullanmaya çalıştığınızda, sayfada neler olduğunu görebiliyor musunuz? Belki de sadece beklemekte olduğunuz koşul karşılanmamaktadır. – jadkik94

cevap

5

İşte Adam Goucher başvurarak sonra got cevap!