JavascriptExecutor SyntaxError:意外的标识符。为什么?

时间:2019-02-07 03:12:36

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

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:意外的标识符”。

此代码尝试执行的操作是等待最长时间加载页面。我通常会返回document.readyState来检查这种情况,但是在特殊情况下,Chrome会突然停止加载页面,而document.readyState会挂起5分钟以上。这正在杀死我的代码,所以我试图开发单线程代码来模仿典型的多线程进程。

由于JavaScript是单线程的(对于像JavaScript这样的酷语言来说,这是令人失望的功能),所以我们必须具有创造力。

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

1 个答案:

答案 0 :(得分:1)

实际上,您的JavaScript代码中有一些错误。

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

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

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

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

第五件事是,我不知道resolve函数中未完成的window.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();

请尝试下面的Java代码,该Java代码在页面加载后会显示true

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

希望对您有帮助...