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 documentationのexpected 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')
# 待ってくれる
お手軽。しかし、条件を細かく指定できないので万能でもない気がする。
コメント