Seleniumを使用してWebページを操作する際に、操作対象の要素がすべてロードされるまで待機するためには、WebDriverWaitクラスのExpectedConditionを使用することができます。
ExpectedConditionには、「要素が存在すること」を待つためのメソッド「presence_of_element_located」があります。 このメソッドを使用するには、まずWebDriverWaitクラスのインスタンスを作成し、そのインスタンスの「until」メソッドに「presence_of_element_located」を指定します。
ただし、「presence_of_element_located」メソッドには、要素を特定するためのlocatorを指定する必要があります。 locatorは、Selenium WebDriverでは以下の方法で要素を特定することができます。
- By.ID
- By.NAME
- By.CSS_SELECTOR
- By.XPATH
- By.CLASS_NAME
- By.LINK_TEXT
- By.PARTIAL_LINK_TEXT
- By.TAG_NAME
例えば、By.IDを使用して要素を特定する場合は、
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)
wait.until(EC.presence_of_element_located((By.ID, "element_id")))
以上のように記述することで、指定した要素がページに存在するまで待機することができます。 ただし、特に要素のロードが遅いなど、待機時間を調整する必要がある場合は、引数に指定するタイムアウト値を調整することで対応することができます。
前提知識とか無い方のために以下はサンプルコードです。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
URL = "任意のURL"
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
wait = WebDriverWait(driver, 30) #タイムアウト時間
driver.get(URL)
wait.until(EC.presence_of_element_located((By.XPATH, '~~')))
driver.find_element(By.XPATH, '~~').click()
driver.quit()
selenium全般のことは次の記事にまとめているので、必要でしたら参照してください。



コメント