2016-05-05 3 views
0

私はこのシナリオを持っています:自分のスレッド内のSelenium非同期スクリプトは他のスクリプトをブロックします

ブラウザ内で異なるスクリプトを実行する必要があります。それらのうちの1つは、あるブラウザから別のブラウザにメッセージを送信することです(WebRTC)。私は各操作の遅延を測定し、特にメッセージを送信したいと考えています。

これを達成するために、スクリプトを実行している各セレンドライバのスレッドを作成しました。さらに、スレッドを作成して、他のブラウザからの観測されたブラウザにメッセージが到着するのを待っています。あなたは、私は、ブラウザがメッセージを受信した場合、呼び出されるコールバックをお待ちしておりますご覧のよう

String message = (String) ((JavascriptExecutor) driver).executeAsyncScript(
"window.receivedMessage = function(message_id){" + 
            "arguments[arguments.length - 1](message_id);" + 
          "}"); 

:メッセージを待機するスレッドは、このような非同期のスクリプトを実行します。

不幸にも、この非同期スクリプトがブラウザに登録された後に実行したい他のすべてのスクリプトをブロックします(.executeScript()または.executeAsyncScript()の場合は関係ありません)。

メッセージが到着するのを常に待っていて、他のスクリプトをウェブドライバで実行する方法はありますか?ところで

EDIT

:ビジーウェイトが解すべきではありません。私はセレンに何らかの形でオペレーションが行われたことを知らせる方法を、運転手の結果を常にポーリングすることなく好むでしょう。

+0

メッセージがブラウザのUIで受信されたことを確認するオプションはありますか? – QVSJ

+0

@QVSJメッセージを受信したブラウザにアクセスできるのでしょうか?はい。私はブラウザのコードも変更できます。 – firsti

答えて

0

グローバル変数にメッセージを格納し、他のスクリプトが実行されるとメッセージを処理する方法もあります。次に例を示します。

JavascriptExecutor js = (JavascriptExecutor)driver; 
driver.manage().timeouts().setScriptTimeout(20, TimeUnit.SECONDS); 

// set a listener for the messages 
js.executeScript(
    "window._asyncResult = [];      " + 
    "window.receivedMessage = function(message_id) { " + 
    " window._asyncResult.push(message_id);   " + 
    "};            "); 

// send a message asynchroniously every second 
js.executeScript(
    "window._asyncTimer = setInterval(function(){  " + 
    " window.receivedMessage(Math.random());   " + 
    "}, 1000);          "); 

// wait for 5 messages and return the list 
List messages = (ArrayList)js.executeAsyncScript(
    "var callback = arguments[arguments.length - 1]; " + 
    "(function fn(){         " + 
    " if(window._asyncResult.length > 5) {   " + 
    " clearInterval(window._asyncTimer);   " + 
    " return callback(window._asyncResult);  " + 
    " }            " + 
    " setTimeout(fn, 30);       " + 
    "})();           "); 
+0

答えをありがとうが、私は私のためにはうまくいかないと思う。私はそれを試して、スクリプトはまだAsyncScriptによってブロックされています。問題は主に、2つのスクリプトをドライバと並行して実行できないように見えることです。それらのうちの1つがAsyncScriptであり、呼び出されるのを待っている関数であっても。ドライバは、次のスクリプトを実行する前にコールバックを待っているようです。 – firsti

関連する問題