5. Wait機能

最近、ほとんどのWebアプリケーションでAJAX技術が使用されています。ページがブラウザに読み込まれると、そのページ内の要素が異なる時間間隔で読み込まれることがあります。これは、要素がDOMに存在しない場合、 ElementNotVisibleException 例外を発生させます。待機を使用して、この問題を解決できます。 Waitingは、実行されたアクション間の時間間隔を提供します。ほとんどの場合、要素または他のすべての操作を要素に配置します。

Selenium Webdriverは暗黙的と明示的の2種類の待機を提供します。WebDriverを明示的に待機させると、WebDriverは特定の条件が発生するのを待ってからさらに処理を進めます。暗黙的な待機により、WebDriverは、要素の場所を特定しようとすると、一定時間DOMをポーリングします。

5.1. 明示的なWait機能

明示的待機とは、特定の条件が発生するのを待ってからコードを進めるコードです。これの最悪の場合は、time.sleep()であり、条件を待機する正確な時間に設定します。必要な時間だけ待つコードを書くのに役立つ便利なメソッドがいくつか用意されています。WebDriverWaitとExpectedConditionを組み合わせることで、これを実現できます。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

これは、TimeoutExceptionをスローする前に最大10秒間待機するか、要素が0〜10秒で返すことがわかった場合に待機します。WebDriverWaitは、デフォルトで正常に返されるまで500ミリ秒ごとにExpectedConditionを呼び出します。成功した戻り値はExpectedCondition型です。ブール型の場合はtrue、それ以外のExpectedCondition型の場合はnull戻り値です

期待される条件

Webブラウザを自動化する際に頻繁に発生する一般的な条件がいくつかあります。以下に、それぞれの実装を示します。Selenium Pythonバインディングにはconvienenceメソッドがいくつか用意されていますので、expected_conditionクラスを自分でコーディングしたり、独自のユーティリティパッケージを作成したりする必要はありません。

  • title_is
  • title_contains
  • presence_of_element_located
  • visibility_of_element_located
  • visibility_of
  • presence_of_all_elements_located
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable - it is Displayed and Enabled.
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))

The expected_conditions module contains a set of predefined conditions to use with WebDriverWait.

5.2. Implicit Waits

An implicit wait is to tell WebDriver to poll the DOM for a certain amount of time when trying to find an element or elements if they are not immediately available. The default setting is 0. Once set, the implicit wait is set for the life of the WebDriver object instance.

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")