JavascriptExecutor SyntaxError: Неожиданный идентификатор.Зачем? - PullRequest
0 голосов
/ 07 февраля 2019

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');, поэтому я не вижу, в чем проблема.

1 Ответ

0 голосов
/ 07 февраля 2019

Действительно, в вашем коде JavaScript есть некоторые ошибки.

Первая ошибка в третьей строке window.sleep = funtion() { return new Promise(resolve => setTimeout(resolve, 2000)); } - неправильное написание function.

Вторая ошибка - это выне следует использовать await, если в определении функции нет async.Вот в чем дело, async гарантирует, что функция возвращает обещание и оборачивает в него не обещания.Ключевое слово await заставляет JavaScript ждать, пока это обещание выполнится и вернет его результат.await работает только внутри async функций.Таким образом, вы можете избежать их полного использования или отформатировать его соответствующим образом.

Третья ошибка заключается в том, что вы пытаетесь выполнить return true; из цикла for условия if, которое в принципе не разрешено, потому что ононе заключен в функцию.

Четвертая ошибка заключается в том, что вы не вызываете функцию 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);

Надеюсь, это поможет ...

...