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)で待機処理をいれています
コメント