5

ドキュメントのどこかで、WebDriver API がブロックされていないことを読みました (driver.get のようないくつかを除いて)。したがって、WebElement の click() または isDisplayed() の実行は、一般に非同期である必要があります (もちろん、ネイティブ イベントが有効になっていることが前提です)。

長い操作 (基本的に長いループ) を実行する単純な HTML ページがあります。JS の実行中、ブラウザが応答しなくなりますが、これは想定どおりです。しかし、ブラウザーがスクリプトの実行でビジーである限り、WebDriver API のような click()/isDisplayed()/executeScript() ブロックにも気付きました。

WebDriver は、合成された JS イベントではなく、クリックに対してネイティブ イベントを発行しているため、API がブロックされる理由がわかりません。現時点ではこの動作は気になりませんが、応答しないページに対してテストを実行するときに、このブロッキングの性質が信頼できるかどうかを知りたいですか? テストで条件付き待機を使用していますが、内部で何が起こっているのか、またこれがブラウザ/OS 固有のものかどうかを知りたいですか?

Windows 7 の InternetExplorerDriver (IE9) および ChromeDriver (Chrome 19) を使用した Selenium 2.20.0 でこの動作が見られます。

4

1 に答える 1

6

実際、ブロッキング API と非ブロッキング API の使用は、Selenium ライブラリの多くのユーザーにとって論争の的となっています。要素のクリックであっても、ライブラリが「最善の推測」でブロックしようとする場所はたくさんありますが、それは保証されていません。ブロッキングと非ブロッキングの間のこの緊張関係は、開発者コミュニティの間で長々と議論されており、FAQ の 1 つに反映されています。プロジェクトのウィキで。IE の場合、ドライバーは要素のクリックをブロックしようとします。ブロックに成功するかどうかは競合状態です。特定のページの場合、IE ドライバー (および Chrome のようです) がそのレースに「勝って」おり、操作が完了するまでブロックされています。ただし、ドライバーは他の場合でも簡単にその競合に負ける可能性があるため、コードの次のステップに進む前に、他のページの変更を明示的に待機することをお勧めします。

将来的に問題が発生した場合は、ページの読み込みタイムアウトを設定して次のステートメントに先に進むことで、これを軽減できる可能性があります。このアプローチの小さな課題の 1 つは、すべてのブラウザーが現在タイムアウトを実装しているわけではないことです (IE は実装していますが、Chrome については知りません)。

于 2012-06-20T16:10:18.517 に答える