当前位置: 首页 > 知识库问答 >
问题:

如何从Selenium Webdriver获取异步Javascript响应

史昱
2023-03-14
$(document).on("application:subapp:rendered", function(){console.log("foo");});
driver.set_script_timeout(30)
response =  driver.execute_async_script("$(document).on(\"application:subapp:rendered\", function(){return \"foo\";});"

TimeoutException:消息:异步脚本超时:30秒内未返回结果(会话信息:chrome=41.0.2272.118)(驱动程序信息:chromedriver=2.11.298604(75EA2FDB5C87F133A8E1B8DA16F6091FB7D5321E),平台=Windows NT 6.1 SP1x86_64)

共有1个答案

东博瀚
2023-03-14

当您调用execute_async_script时,Selenium将作为最后一个参数传递给JavaScript代码,您必须调用回调来指示异步代码已经执行完毕,如果您在调用execute_async_script时没有在脚本后面传递参数,那么这将作为JavaScript中的参数[0]进行访问。无论传递给此回调函数的值是execute_async_script将返回的值,因此:

response = driver.execute_async_script("""
    var done = arguments[0];
    $(document).one('application:subapp:rendered', 
        function(){
           done('foo');
    });
""")

在上面的代码中,我将回调分配给done。那正是我喜欢做的方式。请注意如何通过调用done(“foo”)来设置响应的值。

还要注意,我使用的是.one()而不是.on()。我发现Selenium(至少在2.45之前)从不认为为execute_async_script创建的旧回调是“过时的”,所以如果在上面的JavaScript执行完毕后,事件有可能再次发生,那么它将再次调用回调,Selenium将再次执行该调用。如果当时正好有另一个execute_async_script在运行,那么这个虚假调用将终止另一个execute_async_script调用,返回值为“foo”。我在一个测试套件中遇到过这种情况。它导致了非常离奇的失败。

 类似资料:
  • 问题内容: 我有一个发出Ajax请求的函数。我如何从中返回响应? 我尝试从回调中返回值,以及将响应分配给函数内部的局部变量并返回该局部变量,但这些方法均未真正返回响应。 问题答案: 问题 在一中的Ajax代表异步。这意味着发送请求(或更确切地说接收响应)已从正常执行流程中删除。在你的示例中,立即返回并且在调用;作为回调传递的函数之前执行下一条语句。 这是一个类比,希望可以使同步流和异步流之间的区别

  • 问题内容: 我有一个发出异步请求的函数。我如何从中返回响应/结果? 我尝试从回调中返回值,以及将结果分配给函数内部的局部变量并返回该局部变量,但这些方法均未真正返回响应(它们都返回或变量的初始值为任意值) 。 使用jQuery函数的示例: 使用node.js的示例: 使用承诺块的示例: 问题答案: 在 一 中的Ajax代表 异步 。这意味着发送请求(或接收响应)已从正常执行流程中删除。在您的示例中

  • 使用promise的块的示例:

  • 我有一个AWS lambda函数,我可以用下面的代码同步调用并返回结果 响应有效负载的类型为<代码> 现在,我需要异步调用我的lambda,所以我使用更改调用类型 它给我一个与以前相同类型的有效载荷的响应,,但我在这一行得到错误- 错误消息说 我错过了什么?如果响应负载与同步调用的类型相同,那么为什么会出现此解析错误?有什么建议吗? 编辑 为清楚起见,我理解如果调用类型为Event,那么我们只能得

  • 我试图以异步方式获取获取结果,如下所示: 但是当我看控制台时,我得到了这个: 所以我觉得当谈到console.logpromise仍然悬而未决?(有一个工具提示说“刚才评估了下面的值”,所以我猜它是在promise解决时更新的?当然,下面的代码(此处未显示)不起作用,因为它需要读取的返回值。我甚至不知道如何访问PromiseValue。 进行异步读取调用的正确方法是什么? 附言:我用的是香草JS。

  • 问题内容: 我正在尝试从Web读取JSON数据,但是该代码返回空结果。我不确定我在做什么错。 问题答案: 理想的方法 不是 使用,而是直接在阅读器上使用解码器。这是一个不错的函数,它获取url并将其响应解码到结构上。 使用示例: 您不应该在生产中使用默认结构,如最初回答的那样!(/ etc调用的是哪个)。原因是默认客户端没有设置超时。如果远程服务器无响应,那将是糟糕的一天。