【问题标题】:How to get Asynchronous Javascript responses from Selenium Webdriver如何从 Selenium Webdriver 获取异步 Javascript 响应
【发布时间】:2015-06-13 14:09:10
【问题描述】:

我们已向我们的网站添加了一个异步 javascript 调用。我正在尝试让 Selenium Webdriver 等待调用的响应。

监听器如下所示:

$(document).on("application:subapp:rendered", function(){console.log("foo");});

我的 webdriver 代码(python):

driver.set_script_timeout(30)
response =  driver.execute_async_script("$(document).on(\"application:subapp:rendered\", function(){return \"foo\";});"

接下来我执行的页面应该让“foo”返回

不过这是我的回应...

TimeoutException:消息:异步脚本超时:结果未收到 在 30 秒内完成 (会话信息:chrome=41.0.2272.118) (驱动程序信息:chromedriver=2.11.298604(75ea2fdb5c87f133a8e1b8da16f6091fb7d532 1e),平台=Windows NT 6.1 SP1 x86_64)

【问题讨论】:

    标签: javascript python selenium asynchronous webdriver


    【解决方案1】:

    使用arguments[0] 作为回调:

    driver.execute_async_script("""
        $(document).on('application:subapp:rendered', arguments[0]);
    """)
    

    另见(应该有助于理解):

    【讨论】:

    • @user3249517 谢谢,请接受路易斯的回答——它更详细、更完整。
    【解决方案2】:

    当您调用execute_async_script 时,如果您在调用execute_async_script 时未在脚本之后传递参数,Selenium 将作为 JavaScript 代码的最后一个参数传递您必须调用的回调以指示异步代码已完成执行,那么这将在 JavaScript 中以 arguments[0] 的形式访问。无论您传递给此回调的任何值都是您的 execute_async_script 将返回的值,因此:

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

    在上面的代码中,我将回调分配给done。这就是我喜欢做的方式。请注意如何通过调用done("foo") 来设置response 的值。

    另请注意,我使用的是.one(),而不是.on()。我发现 Selenium(至少高达 2.45)不会认为为 execute_async_script 创建的旧回调是“过时的”,所以如果您的事件有可能在之后再次发生你上面的 JavaScript 已经完成执行,然后它会再次调用回调,Selenium 将再次响应调用。如果您当时碰巧有另一个 execute_async_script 正在运行,那么这个虚假调用将终止您的 other execute_async_script 调用并返回值“foo”。我在我的一个测试套件中发生过这种情况。它导致了非常奇怪的失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-24
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      相关资源
      最近更新 更多