web-dev-qa-db-ja.com

暗黙的な待機と明示的な待機を組み合わせると、予期しない待機時間が発生します

私の2つのシナリオ-

1)最初に

@driver.manage.timeouts.implicit_wait = 30
@wait = Selenium::WebDriver::Wait.new(:timeout => 45) # Time greater than implicit
@wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")}

これにより、ドライバーはテキストを検索するのに45秒かかります(これは予想されます)

2)2番目

@driver.manage.timeouts.implicit_wait = 30
@wait = Selenium::WebDriver::Wait.new(:timeout => 5) # Time less than implicit
@wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")}

これにより、ドライバーにテキストを検索するためのが与えられます(予期されていません)

Seleniumをexplicit待機時間だけ待機させ、2つのうち大きい方を待機させない方法はありますか?

注-暗黙の待機時間を宣言しないことはオプションではありません。ドライバーが何かを見つけることができないたびにSeleniumをハングさせる余裕がないためです。

Seleniumバージョン30、ウィンドウ、ffを使用

15
Amey

暗黙的待機と明示的待機を混在させないでください。問題の一部は、暗黙の待機がWebDriverシステムの「リモート」側に実装されることが多い(ただし、常に実装されるとは限らない)ことです。つまり、IEDriverServer.exe、chromedriver.exe、匿名のFirefoxプロファイルにインストールされるWebDriver Firefox拡張機能、およびJavaリモートWebDriverサーバー(Selenium-server)に「焼き付け」られているということです。 -standalone.jar)明示的な待機は、「ローカル」言語バインディングでのみ実装されます。RemoteWebDriverを使用すると、システムのローカル側とリモート側の両方を複数回使用できるため、事態はさらに複雑になります。

これがどのように機能するかです:ローカルコード-> Javaリモートサーバー->ローカルJavaリモートサーバー上の言語バインディング->のような「リモート」コンポーネントFirefox拡張機能、chromedriver.exeまたはIEDriverServer.exe。グリッドの場合は、間に他のホップが存在する可能性があるため、さらに複雑になります。

したがって、暗黙的な待機と明示的な待機を混在させようとすると、「未定義の動作」に迷い込んでしまいます。その動作のルールが何であるかを理解できるかもしれませんが、ドライバーの実装の詳細が変更されると、それらは変更される可能性があります。だからそれをしないでください。

暗黙的な待機を使用していない場合、要素が見つからないときに「ハング」が発生することはありません。ドライバーはすぐにNoSuchElement例外をスローする必要があります。

49
JimEvans