17

私の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) セカンド

@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")}

これにより、ドライバーはテキストを検索するために30 秒かかります (予期されていません)。

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

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

Selenium バージョン 30、windows、ff の使用

4

2 に答える 2

59

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

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

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

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

于 2013-03-02T13:24:22.223 に答える