いくつかのテストをSeleniumからWebDriverに移動しています。私の問題は、selenium.wait_for_conditionに相当するものが見つからないことです。Pythonバインディングには現時点でこれがありますか、それともまだ計画されていますか?
3 に答える
現在、WebDriverでwait_for_conditionを使用することはできません。Pythonセレンコードは、古いセレンメソッドにアクセスするためのDrivenSeleniumクラスを提供しますが、wait_for_conditionを実行することはできません。 セレンウィキにはそれに関するいくつかの情報があります。
最善の策は、WebDriverWaitクラスを使用することです。これは、Trueが返されるのを待つ関数を定期的に実行するヘルパークラスです。私の一般的な使用法は
driver = webdriver.Firefox()
driver.get('http://example.com')
add = driver.find_element_by_id("ajax_button")
add.click()
source = driver.page_source
def compare_source(driver):
try:
return source != driver.page_source
except WebDriverException:
pass
WebDriverWait(driver, 5).until(compare_source)
# and now do some assertions
このソリューションは決して理想的ではありません。試行/例外は、ページの要求/応答サイクルが遅延して、いくつかのajaxアクティビティが完了するのを待つ場合に必要です。要求/応答サイクルの途中でcompare_sourcegetが呼び出されると、WebDriverExceptionがスローされます。
WebDriverWaitのテストカバレッジも確認するのに役立ちます。
これが私のバージョンのGregSadetskyの答えで、関数に入れられます:
def click_n_wait(driver, button, timeout=5):
source = driver.page_source
button.click()
def compare_source(driver):
try:
return source != driver.page_source
except WebDriverException:
pass
WebDriverWait(driver, timeout).until(compare_source)
ボタンをクリックし、DOMが変更されるのを待ってから、戻ります。
Javaバインディングには、Waitクラスが含まれています。このクラスは、タイムアウトに達するまで、条件を繰り返しチェックします(間にスリープがあります)。通常のAPIを使用してJavascriptの完了を検出できる場合は、同じアプローチを取ることができます。