最初の点については、おそらく個人的な選択です。implicit waiting
Selenium が待機している場所と待機していない場所を制御したいという理由だけで、私はまったく使用しません。を設定するimplicit wait
と、やみくもに Selenium に通知されます。私の要素が見つからない場合は、できるまで一定時間待ちます。それが何であろうと、結果であろうと、どのページであろうと、それを見つけるか、20 秒が経過するまで待ちます。
それがあなたの望む方法であればそれで問題ありませんが、私にとって問題は、要素がページに表示されるまでに 30 秒かかる場合に発生し、とにかくそれ自体が問題です。Selenium はそれを隠すだけで、問題をカバーできます。
ただし、要素が表示されて「準備が整う」までに時間がかかる場合があり、それが登場するexplicit waiting
ときです。あなたがそれを期待するとき。
待機に関しては、最初に何が起こるかは、WebDriverWait
ヒットしたときに実行され、要素を見つけようとします。Selenium はあなたがimplicit wait
セットを持っていることを確認するので、最大 20 秒間その要素を見つけようとします。
これは、舞台裏で「無料」で行われます。
それが期限切れにWebDriverWait
なると、応答が返され、implicit wait
タイムアウトがタイムアウトよりも大きいためWebDriverWait
、例外 (タイムアウト例外) でフォールオーバーします。
値が値(コメントの例)WebDriverWait
よりも高い場合、プロセスは次のようになります。implicit wait
- 最初に WebDriverWait を実行する
.FindElement
コールにヒット
- Selenium はこれを内部的に 10 秒間実行します
- 最初の 10 秒後に
WebDriverWait
、応答が返されます。
- 要素が見つからない場合は、ステップ 1 から再度実行されます。
- ステップ 4 に到達すると、要素がまだ見つからない場合、タイムアウト例外がスローされます。
さらに説明するには (疑似 C# コード):
driver.Manage().Timeouts().SetImplicitWait(TimeSpan.FromSeconds(10));
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
wait.Until(w =>
{
return w.FindElement(By.Id("something")).Displayed;
}
WebDriverWait
20 秒の と10implicit wait
秒の があります。
それはヒットします:
return w.FindElement(By.Id("something")).Displayed;
初めて。Selenium は、内部的に.FindElement
を 10 秒間実行します。この 10 秒が経過した後、WebDriverWait
状態を確認します ( .Displayed
)。これが満たされない場合WebDriverWait
、同じコード行が再度実行されます。繰り返しますが、Selenium は以前と同じように動作し、10 秒間実行します。そこから戻ってきて、条件が満たされていない場合は、WebDriverWait
が合計 20 秒待機してからエラーがスローされます。