動的待機の取り扱いは、特にコンテンツが頻繁に出現し、瞬時に変更される現代のウェブアプリケーションにおいて、UI自動化の重要な課題です。
問題の歴史
初期の自動化バージョンでは、sleepのハードウェイトが使用されており、テストが遅すぎるか、アプリケーションの読み込みが通常よりも長引くとフレーキーテストが発生しました。これはSPAと大量のJSの時代の問題となりました。
問題 静的な遅延の使用は不安定なテストと時間の浪費を引き起こします:自動テストは遅くなったり、偶発的に「失敗」したりします。さらに、テストのスケーラビリティとメンテナンスも影響を受けます。
解決策
動的(明示的)な待機を使用します:たとえば、SeleniumのWebDriverWait、CypressやPlaywrightのwaitFor関数など。
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) # 最大待機時間は10秒 wait.until(EC.visibility_of_element_located((By.ID, 'my-element')))
主な特徴:
動的待機があるのに何でsleepが必要ですか?
time.sleep()の使用はデバッグや緊急時のみ正当化されます。実際の自動テストでは常に明示的な待機を行う方が良いです。
待機を使用することでフレーキーテストを完全に排除できますか?
いいえ、待機条件が不適切に記述されている場合(たとえば、属性が出現するのを待っているが、データが完全に読み込まれるのを待っていない場合)、フレーキーテストは残ります。
すべてのテストに対して1つのグローバル待機を設定できますか?
いいえ。要素が出現する条件は異なります。待機は必要な手順にのみ厳格に適用する必要があります。
sleepを使用するすべての自動テストは「クリック」と検証の間にsleep(2)がありました。ページが更新された後、ユーザーは遅延を訴え、テストは時々遅いインターネットのせいで落ちました。
利点:
欠点:
必要な要素が出現した後にクリック可能になるように明示的な待機を配置しました。sleepを排除し、すべてのテストが安定して迅速に通過します。
利点:
欠点: