gpt4 book ai didi

javascript - Selenium 和异步 JavaScript 调用

转载 作者:数据小太阳 更新时间:2023-10-29 06:06:05 25 4
gpt4 key购买 nike

我对 Selenium 和 JavaScript 回调函数还很陌生,我有一个大问题我自己无法解决。我需要一个使用 JavaScript 的指定变量。如果我使用 GoogleChrome 打开页面并使用控制台输入我的 JavaScript 代码,我可以使用如下方式获取变量:

1. var myId;
2. getSomeIdStuffInfo("somestuff",function(docId)(myId = docId));
3. return myId;

如果我一步一步地输入这一行,我很容易得到正确的值 myId。但是,当然,如果我尽可能快地执行这三行代码,我会得到 null 作为返回值,因为当我返回 myId 时回调函数还没有完成。 SOOOO.. 如果我像这样使用 Selenium :

JavascriptExecutor js = (JavascriptExecutor) driver; 
String docInfoVal = (String) js.executeScript("" +
"var myId; " +
"getCurrentDocumentInfo(\"somestuff\"," +
"function(docId) {" +
"myId = docId;" +
"}" +
");" +
"return myId;");

结果我只得到空值。所以...不知何故,我必须“等待”回调函数,直到我返回 myId。我必须使用 executeAsyncScript 吗?如何使用?我坐在上面几个小时,尝试了不同的东西,但我就是找不到答案。

在此先感谢您的帮助!

最佳答案

对于异步代码,您必须使用 executeAsyncScript:

JavascriptExecutor js = (JavascriptExecutor) driver; 
String docInfoVal = (String) js.executeAsyncScript("" +
"var done = arguments[0]; " +
"getCurrentDocumentInfo(\"somestuff\"," +
"function(docId) {" +
"done(docId);" +
"}" +
");");

您使用 executeAsyncScript 调用的脚本会将回调添加到传递给它的参数列表中。由于您没有向脚本传递任何参数,因此 arguments[0] 包含回调。您的代码必须在完成工作后调用此回调。您赋予回调的值是 executeAsyncScript 返回的值。

在上面的代码中,我通过将它放在一个匿名函数中拼出了对 done 的调用,但代码可以更简洁地编写为:

JavascriptExecutor js = (JavascriptExecutor) driver; 
String docInfoVal = (String) js.executeAsyncScript("" +
"var done = arguments[0]; " +
"getCurrentDocumentInfo(\"somestuff\", done);");

甚至:

JavascriptExecutor js = (JavascriptExecutor) driver; 
String docInfoVal = (String) js.executeAsyncScript(
"getCurrentDocumentInfo('somestuff', arguments[0]);");

关于javascript - Selenium 和异步 JavaScript 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31208818/

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