9

これが私がやろうとしていることであり、ほとんどの場合成功しています。基本的には、Web サイトにサインインし、クラスがソースに含まれるのを待ってから、ソース コードを処理します。

私が得る例外:

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

コードは次のとおりです。

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

私もこれを試しました:

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

同じ例外が発生します。

私は現在これを試しています:

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

失敗するまでには至らず、まだテスト中です。

申し訳ありませんが、これは非常に長いです。しかし、これらのランダムなタイムアウトに対するPythonicでクリーンなソリューションを見つけたいと思います。

役立つ別の情報: サインイン プロセスは非常に長い場合がありますが、数分待っても例外がスローされます。

4

1 に答える 1

5

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)

そして、これは完全にうまく機能します!

于 2013-07-23T20:34:45.403 に答える