0. 概要
Seleniumを使用してブラウザの相互作用を自動化する際に、要素が利用可能になるか特定の条件が満たされるまで待つシナリオに頻繁に直面します。
Seleniumの待機方法には 'Time.sleep()' 'Implicit Wait' 'Explicitly Wait' があります。
しかし、どれを使用すべきでしょうか?
三つの違いをそれぞれの利点と欠点を通じて詳しく比較してみましょう。
1. Time.sleep()
これはスクリプトに固定の遅延を導入するPythonの基本的な方法です。time.sleep(秒)が呼び出されると、全体のスクリプトの実行が指定された秒数だけ一時停止します。
1.1. Time.sleep()の利点
使用が簡単で設定が不要です。
スクリプトが待つ時間を正確に知ることができます。
1.2. Time.sleep()の欠点
大抵の場合、固定された遅延は必要なものよりも長くなり、テストの実行時間が増えます。
待っている作業が睡眠時間よりも長い時間内に完了した場合、テストが失敗する可能性があります。
2. Implicit Wait
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # WebDriver will wait for up to 10 seconds for an element to appear
driver.get('<https://example.com>')
element = driver.find_element_by_id('some-id')
요소가 웹 페이지에 나타나지 않는 경우 "해당 요소 예외 없음"을 발생시키기 전에 지정된 시간 동안 기다리도록 Selenium WebDriver에 지시합니다.
2.1. Implicit Waitの利点:
WebDriverは要素が早く利用可能になった場合、全体の時間を待たずにすみます。
time.sleep()を使用するよりも速度が速いです。
WebDriver全体のセッションに適用されます。
2.2. Implicit Waitの欠点
Implicit WaitはWebDriverが進行するか失敗する前に実際にどれだけ長い間待ったかを確信できないため、デバッグが困難になる可能性があります。
Implicit WaitとExplicitly Waitを組み合わせると予測できない待機時間が発生する可能性があります。
3. Explicitly Wait
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()
driver.get('<https://example.com>')
# Waiting for up to 10 seconds until an element with the specified ID becomes visible
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, 'some-id'))
)
3.1. Explicitly Waitの利点
要素の有無だけでなく、さまざまな条件を指定できます。例えば、要素がクリック可能であるか表示されるか、特定のテキストが表示されるまで待ちます。
WebDriver全体のセッション設定ではないため、動作や要件に応じてさまざまな要素に対してさまざまな待機を定義できます。
テスト期間を不必要に延長しません。条件が満たされればスクリプトが進行します。
より良いエラーメッセージを提供し、テストが失敗した場合に何が間違っているかをより簡単に理解できます。
3.2. Explicitly Waitの欠点
Implicit Waitと異なり、必要に応じて待機条件を設定する必要があります。
AJAXやさまざまな時間間隔でロードされるWeb要素を処理する場合にのみ適しています。
4. 結論: 状況に応じた待機方法を選択しましょう。
Implicit Waitは設定された期間内にすべての要素を利用できるように広い網を張ることに似ていますが、Explicitly Waitは特定の条件の特定の要素を対象とする釣り竿を使用することに似ています。
実際にはImplicit WaitとExplicitly Waitを混ぜて使用しない方が良いです。ランダムに混ぜて使用すると、予測不可能な動作が発生する可能性が高くなります。
主に細かい制御が可能なExplicitly Waitが複雑なWebアプリケーション環境で好まれる選択肢となることが多いです。
上記の内容をよく参照して機能を適切に活用してください。
この記事も一緒に読んでみてください:
データ収集、今度は自動化しましょう
コーディングなしで5分で開始・5,000以上のウェブサイトをクロールした経験




