Python3 Seleniumの要素取得時の待機

Seleniumの明示的待機について

以下のようなエラーが要素取得時に発生する。

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

要素がページ中にアタッチされてないそうだ。 5. Waits — Selenium Python Bindings 2 documentation が参考になる。2種類の待機がある。

明示的な待機

特定要素が特定の状態になるまで、要素の取得を待つというもの。

今までの要素の取得は、

# 待機しない例
element = driver.find_element_by_css_selector('CSS_SELECTOR')

だった。ここで要素がページにアタッチされてないと、上記のエラーが出る。 ここを

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)

element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'CSS_SELECTOR')))
# アタッチまで待ってくれる

のように変更すればいい。これだと、指定した要素に幅・高さが存在するようになるまで待機してくれる。 注意点としては、要素の指定は、(By.SOMETHING, 'PATH')で表されるタプルで行う。

また、7. WebDriver API — Selenium Python Bindings 2 documentationexpected conditionsを見ると、

elements = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'CSS_SELECTOR')))
# 指定した全ての要素が見えるまで待ってくれる
# elements = driver.find_elements_by_css_selector('CSS_SELECTOR')
# と待機以外ではほぼ同じ

のように、複数要素の取得もできるので便利。

暗黙的な待機

こちらは特に特別なことをしなくても、driver.find_element...()でも指定した秒数待ってくれる。

# これだけ
driver.implicitly_wait(10)

driver.get(URL)
driver.find_element_by_css_selector('CSS_SELECTOR')
# 待ってくれる

お手軽。しかし、条件を細かく指定できないので万能でもない気がする。

コメント

タイトルとURLをコピーしました