JavascriptExecutor SyntaxError : Unexpected identifier. 为什么?

标签 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;

更新:对我的帖子中之前的语法错误“funtion”感到抱歉。这是一个错字,不在我的实际代码中。所有语法错误都应该消失,但我仍然收到“SyntaxError:意外的标识符”。

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

由于 JavaScript 是单线程的(对于 JavaScript 这样的酷语言来说,这是一个令人失望的功能),因此我们必须发挥创造力。

如果将 return true; 替换为 console.log('true');return false;,则此代码可在浏览器控制台中运行> 与 console.log('false'); 所以我不明白问题是什么。

最佳答案

您的 JavaScript 代码中确实存在一些错误。

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

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

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

第四个错误是,你没有调用 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 代码,它会打印 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);

希望对你有帮助...

关于JavascriptExecutor SyntaxError : Unexpected identifier. 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54565750/

相关文章:

java - 用户界面 :repeat inside a ui:repeat and LazyInitException

java - 制作一个jar文件,应用程序被java安全阻止

java - 我在读这个堆栈跟踪吗?

java - 通过WebDriverEventListener打印WebElement变量名

java - 如何用新文件覆盖 log4j2.xml 中指定的日志文件名?

python - 如何使用 Python 在 Selenium 中以编程方式使 Firefox headless ?

javascript - 使用 JQuery 加载 IMDB 海报不起作用

javascript - Electron - 拦截所有渲染器进程请求并添加额外的 header

javascript - 蒙戈错误: filter parameter must be an object

javascript - 有些东西阻止了 addEventListener(type, handler) 在 DOM 中工作