2013-07-02 58 views
9

Đây là những gì tôi đang cố gắng làm và hầu hết thời gian tôi thành công: Về cơ bản tôi đang đăng nhập vào một trang web và sau đó đợi một lớp học , sau đó xử lý mã nguồn.Trường hợp ngoại lệ thời gian chờ ngẫu nhiên Selenium mà không có bất kỳ thông báo nào

Ngoại lệ tôi nhận được:

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

Đây là mã:

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

Tôi cố gắng này quá:

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 

tôi nhận được cùng một ngoại lệ.

Tôi hiện đang cố gắng này:

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 

tôi đã không nhận được đến điểm mà nó không thành công, tôi vẫn đang thử nghiệm nó.

Rất tiếc, quá trình này rất dài. Nhưng tôi muốn tìm một giải pháp tự nhiên và sạch sẽ cho những thời gian chờ ngẫu nhiên đó.

Một thông tin khác cũng có thể hữu ích: quá trình đăng nhập đôi khi rất dài, nhưng thậm chí với một vài phút chờ đợi, nó sẽ ném ngoại lệ.

+0

Bạn có thể đăng hoàn toàn truy nguyên ngoại lệ không? Ngoài ra, bạn có chắc chắn điều kiện bạn chỉ định được thỏa mãn không? (nếu không, nó sẽ hết thời gian sau '10' giây) – jadkik94

+0

Bài chỉnh sửa, xin lỗi – nnaelle

+0

Bạn có thể thử sử dụng một WebDriver khác nơi bạn có thể thực sự thấy những gì đang diễn ra trên trang không? Có thể đó chỉ là điều kiện bạn đang chờ đợi không được đáp ứng. – jadkik94

Trả lời

5

Dưới đây là câu trả lời tôi nhận được sau khi liên hệ với 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) 

Và này hoạt động hoàn toàn tốt đẹp!