微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Selenium和异步JavaScript调用

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

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

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

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

结果我只得到null.所以…不知何故,我必须“等待”回调函数,直到我返回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返回的值.

在上面的代码中,我通过将其置于匿名函数中来拼写完成调用,但代码可以更简洁地编写为:

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]);");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐