Selenium で指定した要素が見つかるまで待機する(タイムアウトの設定)

2021年9月25日土曜日

Python Selenium

t f B! P L

Selenium + Python で、指定した要素が見つかるまで待機する方法を紹介します。

Selenium でスクレイピングする時などで重要なのが「待ち」の処理で、例えばボタンをクリックして通信が行われた後に初めて表示されるような要素の場合、要素を Python からクリックした後に、目的の要素が生成するまで待機するケースはしばしばあります。

スポンサーリンク

WebDriverWait を使って待機してみる

WebDriverWait を使うことで、特定の ID、タグ または CSS のクラスが見つかるまで待機することが可能になります。time.sleep で待つ方法も考えられますが、待ったとしても目的の要素が生成されているかは未確定であるため、特定の要素が決まっている場合は WebDriverWait を使った待機処理を行った方が良いでしょう。

以下のサンプルコードは、myClassName という CSS クラスを持った要素が見つかるまで待機する例です。WebDriverWait で待機する場合はタイムアウト時間(単位:秒)を指定し、サンプル`ではタイムアウト時間を 10秒に設定しています。

指定したタイムアウト時間を経過しても、指定した要素が見つからなかった場合は例外が発生します。そのため、WebDriverWait で待ちを入れる場合は 「try - except - finally」で例外処理を入れておきましょう。

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.Chrome("/path/to/chromedriver") 
driver.get("http://somedomain/url_that_delays_loading")

try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "myClassName"))
    )
except:
  print("「myClassName」を持つ要素が見つからずタイムアウトしました")  
finally:
  driver.quit()

さまざまな待機条件

上のサンプルコードで紹介した presence_of_element_located は、指定の要素が見つかるまで待機する関数ですが、それ以外の待機条件(expected_conditions)を行う関数もあり、例えば要素がクリック可能になるまで待機する element_to_be_clickable や、要素が表示されるまで待機する visibility_of_element_located などの関数があります。

待機条件として使用できる関数の一覧は、次のとおりです。

  • 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
  • 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
スポンサーリンク

QooQ