【问题标题】:JavascriptExecutor SyntaxError: Unexpected identifier. Why?JavascriptExecutor SyntaxError:意外的标识符。为什么?
【发布时间】:2019-07-01 02:55:33
【问题描述】:

Java

JavascriptExecutor js = (JavascriptExecutor) driver;
Boolean ready = (Boolean)js.executeScript("the below JavaScript");

JavaScript

var ready = false;
window.onload = function() {
    ready = true;
}
window.sleep = function() {
    return new Promise(resolve => setTimeout(resolve, 2000));
}
for(var i = 0; i < 30; i++) {
    if(ready) {
           return true;
    }
    await sleep();
 }
 return false;

更新:抱歉,我的帖子中出现了之前的语法错误“功能”。那是一个错字,不在我的实际代码中。所有语法错误都应该消失了,但我仍然收到“SyntaxError: Unexpected identifier”。

这段代码试图做的是等待页面加载的最长时间。我通常返回 document.readyState 以检查该情况,但在特殊情况下,Chrome 会突然停止加载页面并且 document.readyState 挂起 5 分钟以上。这正在扼杀我的代码,因此我正在尝试开发单线程代码来模拟典型的多线程进程。

由于 JavaScript 是单线程的(对于 JavaScript 这样很酷的语言来说,这是一个令人失望的特性),我们必须要有创意。

如果您将return true; 替换为console.log('true'); 并将return false; 替换为console.log('false');,则此代码在浏览器控制台中有效,所以我看不出问题出在哪里。

【问题讨论】:

    标签: javascript java selenium browser-automation javascript-injection


    【解决方案1】:

    您的 JavaScript 代码确实有一些错误。

    第一个错误是,在第三行 window.sleep = funtion() { return new Promise(resolve =&gt; setTimeout(resolve, 2000)); }function 拼写错误。

    第二个错误是当你的函数定义中没有async 时,你不应该使用await。事情是这样的,async 确保函数返回一个承诺,并在其中包装非承诺。关键字await 让JavaScript 等待,直到该promise 完成并返回其结果。 await 仅在 async 函数内部工作。因此,您可以完全避免使用它们,或者您需要相应地对其进行格式化。

    第三个错误是,您试图从 if 条件的 for 循环中执行 return true;,这基本上是不允许的,因为它没有包装在函数内。

    第四个错误是,您没有调用window.onload 函数 - 结果,即使页面已加载,它也总是返回 false。

    第五件事是,我不知道不完整的resolvewindow.sleep函数中做了什么。

    第六件事是,你在最后返回return false;,没有任何参考,这完全没有意义。

    我已经修改了代码,避免了上面的错误,请查收。

    以下是修改后的 JavaScript 代码:

    var status = false;
    window.sleep = function() { 
        return setTimeout(() => {
            console.log("=> Waited for 2 seconds...");
        }, 2000);
    }
    var getStatus = function() {
        for(var i = 0; i < 30; i++) {
            if(window.onload = function() {
                return true;
                }) {
                status = true;
                console.log(i+"). Loaded ? "+status);
                break;
            } else {
                console.log(i+"). Loaded ? "+status);
                sleep();
            }
        }
        return status;
    }
    getStatus();
    

    尝试以下在页面加载后打印true 的Java 代码:

    System.setProperty("webdriver.chrome.driver", "C:\\NotBackedUp\\chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.google.com");
    JavascriptExecutor js = (JavascriptExecutor) driver;
    Boolean result = (Boolean) js.executeScript("var status = false;\r\n" + 
            "window.sleep = function() { \r\n" + 
            "   return setTimeout(() => {\r\n" + 
            "       console.log(\"=> Waited for 2 seconds...\");\r\n" + 
            "   }, 2000);\r\n" + 
            "}\r\n" + 
            "var getStatus = function() {\r\n" + 
            "   for(var i = 0; i < 30; i++) {\r\n" + 
            "       if(window.onload = function() {\r\n" + 
            "           return true;\r\n" + 
            "           }) {\r\n" + 
            "           status = true;\r\n" + 
            "           console.log(i+\"). Loaded ? \"+status);\r\n" + 
            "           break;\r\n" + 
            "       } else {\r\n" + 
            "           console.log(i+\"). Loaded ? \"+status);\r\n" + 
            "           sleep();\r\n" + 
            "       }\r\n" + 
            "   }\r\n" + 
            "   return status;\r\n" + 
            "}\r\n" + 
            "return getStatus();");
    System.out.println(result);
    

    希望对你有帮助……

    【讨论】:

    • 感谢您对错字的帮助。不是这样的。我认为你的逻辑与我想要的有点不同。我简化了我的帖子以便于阅读。这有点乱。你是说我需要打电话给executeAsyncScript()吗?我必须在早上试一试。除非您在谈论 sleep() 方法。在这种情况下,sleep() 将是异步的,因为函数中的承诺,因此您将使用 await sleep()
    • 我认为您收到SyntaxError: await is only valid in async function 错误不是您上面提到的错误,您可以再检查一次吗?
    • 我不是说你需要调用executeAsyncScript(),但是你需要在await对应的promise函数中包含async
    • 如果可能的话,能否分享一下堆栈跟踪,以便于追查原因
    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2017-10-11
    • 1970-01-01
    • 2018-03-09
    • 2018-03-29
    • 2018-07-19
    相关资源
    最近更新 更多