6

自動化に python+selenium webdriver を使用しています。WebDriverWait と共に ImplicitlyWait を使用しました。

質問:

  1. 1 つのスクリプトで ImplicitlyWait と WebDriverWait の両方を使用することは良い方法ですか?

  2. ImplicitlyWait の値が 20 で、WebDriverWait の値が 10 秒であるとします。WebDriverWait は、特定の要素を待機するときに 20 をオーバーライドしますか? ImplicitlyWait 値が WebDriverWait より小さい場合はどうなりますか?

提案してください。インターネットでこの答えを見つけようとしましたが、完全な証拠や説得力のある答えは得られませんでした。

4

1 に答える 1

5

最初の点については、おそらく個人的な選択です。implicit waitingSelenium が待機している場所と待機していない場所を制御したいという理由だけで、私はまったく使用しません。を設定するimplicit waitと、やみくもに Selenium に通知されます。私の要素が見つからない場合は、できるまで一定時間待ちます。それが何であろうと、結果であろうと、どのページであろうと、それを見つけるか、20 秒が経過するまで待ちます。

それがあなたの望む方法であればそれで問題ありませんが、私にとって問題は、要素がページに表示されるまでに 30 秒かかる場合に発生し、とにかくそれ自体が問題です。Selenium はそれを隠すだけで、問題をカバーできます。

ただし、要素が表示されて「準備が整う」までに時間がかかる場合があり、それが登場するexplicit waitingときです。あなたそれを期待するとき。

待機に関しては、最初に何が起こるかは、WebDriverWaitヒットしたときに実行され、要素を見つけようとします。Selenium はあなたがimplicit waitセットを持っていることを確認するので、最大 20 秒間その要素を見つけようとします。

これは、舞台裏で「無料」で行われます。

それが期限切れにWebDriverWaitなると、応答が返され、implicit waitタイムアウトがタイムアウトよりも大きいためWebDriverWait、例外 (タイムアウト例外) でフォールオーバーします。

値が値(コメントの例)WebDriverWaitよりも高い場合、プロセスは次のようになります。implicit wait

  1. 最初に WebDriverWait を実行する
  2. .FindElementコールにヒット
  3. Selenium はこれを内部的に 10 秒間実行します
  4. 最初の 10 秒後にWebDriverWait、応答が返されます。
  5. 要素が見つからない場合は、ステップ 1 から再度実行されます。
  6. ステップ 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;
}

WebDriverWait20 秒の と10implicit wait秒の があります。

それはヒットします:

return w.FindElement(By.Id("something")).Displayed;

初めて。Selenium は、内部的に.FindElementを 10 秒間実行します。この 10 秒が経過した後、WebDriverWait状態を確認します ( .Displayed)。これが満たされない場合WebDriverWait、同じコード行が再度実行されます。繰り返しますが、Selenium は以前と同じように動作し、10 秒間実行します。そこから戻ってきて、条件が満たされていない場合は、WebDriverWaitが合計 20 秒待機してからエラーがスローされます。

于 2013-07-24T09:20:59.387 に答える