gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:31:21 27 4
gpt4 key购买 nike

我们在我们的网站上添加了一个异步 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: Message: asynchronous script timeout: result was not recei ved in 30 seconds (Session info: chrome=41.0.2272.118) (Driver info: chromedriver=2.11.298604 (75ea2fdb5c87f133a8e1b8da16f6091fb7d532 1e),platform=Windows NT 6.1 SP1 x86_64)

最佳答案

当您调用 execute_async_script 时,Selenium 会将您必须调用的回调作为最后一个参数传递给 JavaScript 代码,以指示异步代码已完成执行,如果您没有在脚本之后传递参数您调用 execute_async_script,然后这将在 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” .我在我的一个测试套件中遇到过这种情况。它导致了非常奇怪的失败。

关于javascript - 如何从 Selenium Webdriver 获取异步 Javascript 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29517675/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com