8

Selenium 2のWebドライバーでJavaScriptを実行して戻り値を取得できることはわかっていますが、非同期の処理が非常に多く発生しているため、JavaScriptでSeleniumと通信する必要があります。私はいくつかの検索を行いましたが、このようなものは見つかりませんでした。人々は一般的に使用していimplicitly_waitますか?すべての時間を計ることができないので、それは失敗する可能性が高いようですか?完璧な例は、XHRが完了したとき、または実行時間が未定の非同期アニメーションをSeleniumに通知することです。

これは可能ですか?SaucelabsでPythonでSelenium2を使用しています。

4

4 に答える 4

8

execute_async_script()メソッド(JavaではJavascriptExecutor.executeAsyncScript、.NETではIJavaScriptExecutor.ExecuteAsyncScript())を調べる必要があります。これにより、コールバック関数を待つことができます。argumentsコールバック関数は、JavaScript関数の配列に自動的に追加されます。したがって、必要な条件まで待機するJavaScript関数がページに既にあると仮定すると、次のようなことができます(以下のJavaコード、C#とPythonコードは類似している必要があります)。

String script = "var callback = arguments[arguments.length - 1];"
    + "callback(myJavaScriptFunctionThatWaitsUntilReady());";

driver.manage().timeouts().setScriptTimeout(15, TimeUnit.SECONDS);
((JavascriptExecutor)driver).executeAsyncScript(script);

さらに賢く、適切なデータを返すイベントにコールバック関数を直接渡すことができる場合があります。executeAsyncScript()関数の詳細については、プロジェクトJavaDocsを参照してください。また、このためのサンプルコードは、プロジェクトのソースツリーを参照してください。このファイルのテストでは、XHRが完了するのを待つ良い例があります。

SauceLabsで使用できるPythonバインディングのバージョンでこれがまだ利用できない場合は、まもなく利用できるようになると思います。確かに、ある意味で、これはテストケースからJavaScriptに「望ましい状態のポーリング」をプッシュしますが、テストをより読みやすくします。

于 2011-04-13T19:18:05.413 に答える
3

理論上は可能ですが、お勧めしません。

このソリューションでは、おそらく、JavaScript の処理が終了したときに変数を true に設定する jQuery をサイトで実行する必要があります。

この変数が true になるまで getEval をループするように Selenium を設定してから、Selenium で何かを実行します。

それはあなたの要件を満たすでしょうが、それは本当に悪い考えです. 何らかの理由で jQuery がトリガー変数を true (または期待する状態) に設定しない場合、Selenium は無期限にそこに留まります。非常に長いタイムアウトを設定することもできますが、Selenium に getEval を実行させて特定の要素が表示されるのを待つだけで何が違うのでしょうか?

ソリューションをオーバーエンジニアリングしようとしているように聞こえますが、将来的にはより多くの苦痛を引き起こし、追加のメリットはほとんどありません.

于 2011-04-11T21:43:18.690 に答える
2

過度に率直に言ってはいけませんが、アプリがテストランナーと通信するようにしたい場合は、間違っています。

XHRが終了するのを待つ必要がある場合は、スピナーを表示してから、スピナーが消えたことをテストして、リクエストが成功したことを示すことができます。

アニメーションに関しては、アニメーションが完了すると、そのコールバックによって、アニメーションが終了したことを示すクラスが追加され、そのクラスの存在をテストできる可能性があります。

于 2011-04-08T20:03:52.457 に答える