selenium 待機処理

Python

seleniumによる処理は非常に高速のため、何も考えずにプログラムを実行すると、サーバーに負荷をかけたり、要素が取得できないことがあります

必ず待機処理を使用します

・環境

python 3.12.0

selenium 4.25.0

windows 11

・待機処理の種類

まずは暗黙的な待機です

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

#暗黙的待機(最大10秒待機)
driver.implicitly_wait(10)

# アクセス
driver.get('https://')

#要素指定 クリック
driver.find_element(By.ID, 'btn').click()

driver.quit()

ドライバーを立ち上げた後に一度書けば、その後ずっと適用されます

find_element()メソッドを使うときに要素が見つかるまで最大10秒待機してくれます

見つからなければ NoSuchElementException のエラーが出ます

次に明示的待機です

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

# 明示的待機を作成(最大10秒)
wait = WebDriverWait(driver=driver, timeout=10)

# アクセス
driver.get('https://')

# id="btn"の要素が現れるまで待機
wait.until(EC.presence_of_element_located((By.ID, 'btn')))

# 要素をクリック
driver.find_element(By.ID, 'btn').click()

driver.quit()

最初に明示的待機 wait を作成し、指定した要素が見つかるまで待機します

find_element()メソッドを使うときに、毎回要素を指定して待機処理を書く必要があります

ほかにも wait.until(EC.presence_of_all_elements_located) とすれば、アクセスしたページ内のすべての要素が見つかるまで、タイムアウトまで待機します

最後に time.sleep() による待機です

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()

# アクセス
driver.get('https://')

# 1秒待機
time.sleep(1)

#要素指定 クリック
driver.find_element(By.ID, 'btn').click()

driver.quit()

これはサーバーへの負荷を考えて強制的に待機する場合がほとんどかと思います

繰り返しページにアクセスする場合等に大体1秒の待機処理を入れます

また、テスト段階で実際にドライバー見ながら確認したいときとかに10秒くらいスリープして様子見たりします

自分はいつも最初に driver.implicitly_wait(10) で待機処理を設定し、ページにアクセスするときに time.sleep(1)で待機処理をいれています

コメント