【问题标题】:Understanding the usage of executeAsyncScript in Selenium了解 Selenium 中 executeAsyncScript 的用法
【发布时间】:2018-06-03 13:55:16
【问题描述】:

我试图在此处 (https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/JavascriptExecutor.html) 了解 Selenium 的 executeAsyncScript 的文档,例如在他们的第一个示例中:

  long start = System.currentTimeMillis();
   ((JavascriptExecutor) driver).executeAsyncScript(
       "window.setTimeout(arguments[arguments.length - 1], 500);");
   System.out.println(
       "Elapsed time: " + System.currentTimeMillis() - start);

现在据我了解,第一个参数应该是脚本,而最后一个是回调函数,但是在这个例子中没有回调,所以这里发生了什么(arguments[] 为空对吧?)。

如果我想要一个返回承诺的函数,然后打印承诺,比如doSomething().then(function(result) { return result;)});,这将如何与executeAsyncScript 函数一起使用?

谢谢

【问题讨论】:

    标签: javascript selenium


    【解决方案1】:

    您必须使用 Selenium 函数为您提供的回调。想象一下,当您使用 executeAsyncScript 时,脚本被包装在这样的 Selenium 函数中:

    (function(args,,, callbackToServer){
        window.setTimeout(arguments[arguments.length - 1], 500);
    })(args,,, callbackToServer);
    

    如您所见,arguments[arguments.length - 1] 实际上引用了 callbackToServer 函数。

    例如,您的承诺如下所示:

    doSomething().then(function(result) { 
        arguments[arguments.length - 1](result);
    )});
    

    【讨论】:

    • 抱歉,您指的是什么 Selenium 函数?
    • 查看示例代码。第一行和第三行是 selenium 函数正在完成的工作。第二行是你注入的内容。
    • 你能回答我问题的第二部分吗,恐怕我很困惑。
    • 我更新了你的承诺示例。您显然必须跟踪服务器回调。也许将它设置为一个变量。
    • 类似 ((JavascriptExecutor) driver).executeAsyncScript("var callback = arguments[arguments.length-1]; doSomething().then(function(result){callback(result);} ));");
    猜你喜欢
    • 2016-04-29
    • 1970-01-01
    • 2020-01-21
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多