javascript - 自己线程中的 Selenium 异步脚本会阻止其他脚本

标签 javascript java multithreading selenium asynchronous

我有这样的场景:

不同的脚本必须在浏览器中执行。其中之一是将消息从一个浏览器发送到另一个浏览器(WebRTC)。我想测量每个操作的延迟,特别是发送消息的延迟。

为了实现这一目标,我为每个 selenium 驱动程序创建了一个自己的线程,该线程正在执行脚本。此外,我还创建了另一个线程,该线程正在等待消息从其他浏览器到达观察到的浏览器。等待消息的线程执行如下异步脚本:

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

如您所见,如果浏览器收到消息,我正在等待调用的回调。

不幸的是,这会阻止在浏览器中注册此异步脚本后我想要执行的所有其他脚本(无论是 .executeScript() 还是 .executeAsyncScript() )。

是否有人知道如何不断等待消息到达并使用网络驱动程序执行其他脚本?

编辑

顺便说一句:忙碌的等待不应该是解决方案。我更喜欢一种以某种方式通知 selenium 操作已完成的方法,而无需不断轮询驱动程序的结果。

最佳答案

一种方法是将消息存储在全局变量中,并在执行其他脚本后处理它们。这是一个例子:

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);                            " +
    "})();                                            " );

关于javascript - 自己线程中的 Selenium 异步脚本会阻止其他脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37052804/

相关文章:

javascript - 是什么原因导致node.js处理移除多线程状态的阻塞状态?

javascript - 为什么控制台输出未定义?

java - requestScope 中的以下属性在哪里? "requestScope.shouldRender"

java - 从 Java 调用 Rust

c# - await 在转移到与调用者相同的线程之前是否在内部创建另一个线程(对于 UI 应用程序)

c++ - 在 C++ 中使用带有指针结构的 beginthread

php - swfupload:如何解析从 upload.php 脚本返回的数据?

java - 语法错误: missing ) after argument list while reading csv file and alerting in js

javascript - BxSlider 最小和最大幻灯片不起作用

java - 在Python中运行包含java命令的批处理文件