Seleniumで待機処理するお話


Seleniumで待機処理するお話

Webページを開く

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
from selenium.common.exceptions import TimeoutException

#ここではEdgeを使っています
driver = webdriver.Edge(executable_path='C:\\...\\MicrosoftWebDriver.exe')
driver.get('https://www.yahoo.co.jp/')

Webページ上のコンテンツを基準にした待機例

# ページ上のすべての要素が読み込まれるまで待機(15秒でタイムアウト判定)
WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)

# ID指定したページ上の要素が読み込まれるまで待機(15秒でタイムアウト判定)
WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.ID, 'ID名')))

# CLASS名指定したページ上の要素が読み込まれるまで待機(15秒でタイムアウト判定)
WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.CLASS_NAME, 'CLASS名')))

# try/catch例
try:
    WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)
except TimeoutException as te:
    ### 例外処理

時間指定の待機例

# 一度設定すると find_element 等の処理時に、
# 要素が見つかるまで指定時間繰り返し探索するようになります。
driver.implicitly_wait(10) # 秒
targetElement = driver.find_element_by_id("ID名")

よくある Stale Element Reference Exception

この例外は、Webページ上のロードが不完全な場合に、Seleniumで要素を触りにいった時に発生します。基本的には、上記の待機処理で試行錯誤するお話になりますが、Seleniumで捉えきれない動的なコンテンツや要素である場合には、HTMLのコードをSeleniumよりに修正するか、最終手段としてtime.sleep()を使うかも検討しています。

参考