JavascriptExecutor SyntaxError: Unexpected identifier. Why?
JavascriptExecutor SyntaxError: Unexpected identifier. Why?
Java
JavascriptExecutor js = (JavascriptExecutor) driver;
Boolean ready = (Boolean)js.executeScript("the below JavaScript");
Java脚本
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;
更新:抱歉我的 post 中之前的语法错误 "funtion"。那是我实际代码中没有的错字。所有语法错误都应该消失了,但我仍然得到 "SyntaxError: Unexpected identifier".
这段代码试图做的是等待最长时间来加载页面。我通常 return document.readyState 检查该情况,但在特殊情况下 Chrome 会突然停止加载页面并且 document.readyState 挂起 5 分钟以上。这正在杀死我的代码,所以我试图开发单线程代码来模拟典型的多线程进程。
由于 JavaScript 是单线程的(对于像 JavaScript 这样的酷语言来说,这是一个令人失望的特性),我们必须要有创意。
如果您将 return true;
替换为 console.log('true');
并将 return false;
替换为 console.log('false');
,则此代码在浏览器控制台中有效,所以我看不出问题所在。
您的Java脚本代码确实有一些错误。
第一个错误是,在第三行
window.sleep = funtion() { return new Promise(resolve => setTimeout(resolve, 2000)); }
,function
拼写错误
第二个错误是当你的函数定义中没有 async
时你不应该使用 await
。事情是这样的,async
确保函数 returns 是一个承诺,并将非承诺包装在其中。关键字 await
使脚本 Java 等待该承诺确定并 returns 它的结果。 await
仅在 async
函数中有效。所以你可以避免完全使用这些或者你需要相应地格式化它。
第三个错误是,您试图从 if 条件的 for 循环执行 return true;
,这基本上是不允许的,因为它没有包含在函数中。
第四个错误是,您没有调用 window.onload
函数 - 因此,即使页面已加载,它也总是 returns false。
第五件事是,我不知道resolve
在window.sleep
函数中做了什么。
第六件事是,你在最后返回return false;
,没有任何参考,这是完全没有意义的。
我修改了代码,避免了上面的错误,请查收。
下面是修改后的Java脚本代码:
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);
希望对您有所帮助...
Java
JavascriptExecutor js = (JavascriptExecutor) driver;
Boolean ready = (Boolean)js.executeScript("the below JavaScript");
Java脚本
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;
更新:抱歉我的 post 中之前的语法错误 "funtion"。那是我实际代码中没有的错字。所有语法错误都应该消失了,但我仍然得到 "SyntaxError: Unexpected identifier".
这段代码试图做的是等待最长时间来加载页面。我通常 return document.readyState 检查该情况,但在特殊情况下 Chrome 会突然停止加载页面并且 document.readyState 挂起 5 分钟以上。这正在杀死我的代码,所以我试图开发单线程代码来模拟典型的多线程进程。
由于 JavaScript 是单线程的(对于像 JavaScript 这样的酷语言来说,这是一个令人失望的特性),我们必须要有创意。
如果您将 return true;
替换为 console.log('true');
并将 return false;
替换为 console.log('false');
,则此代码在浏览器控制台中有效,所以我看不出问题所在。
您的Java脚本代码确实有一些错误。
第一个错误是,在第三行
window.sleep = funtion() { return new Promise(resolve => setTimeout(resolve, 2000)); }
,function
拼写错误
第二个错误是当你的函数定义中没有 async
时你不应该使用 await
。事情是这样的,async
确保函数 returns 是一个承诺,并将非承诺包装在其中。关键字 await
使脚本 Java 等待该承诺确定并 returns 它的结果。 await
仅在 async
函数中有效。所以你可以避免完全使用这些或者你需要相应地格式化它。
第三个错误是,您试图从 if 条件的 for 循环执行 return true;
,这基本上是不允许的,因为它没有包含在函数中。
第四个错误是,您没有调用 window.onload
函数 - 因此,即使页面已加载,它也总是 returns false。
第五件事是,我不知道resolve
在window.sleep
函数中做了什么。
第六件事是,你在最后返回return false;
,没有任何参考,这是完全没有意义的。
我修改了代码,避免了上面的错误,请查收。
下面是修改后的Java脚本代码:
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);
希望对您有所帮助...