Java Selen Javascript Executor возвращает пустой массив - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь запустить функцию javascript , которую я написал, чтобы собрать все комментарии сайта HTML через xpath (требование).
Функция, вставленная в браузер, ofc. без оператора return отлично работает.
Но при выполнении через селен ' javascriptexecutor ' он возвращает пустой массив.
Я знаю, что вы должны поместить операторы javascript в форму " code " +, но для удобства чтения я отформатировал свой код, как показано ниже.
Я надеюсь, что кто-то может помочь мне с этим:)

ChromeDriver driver = new ChromeDriver();
String url = "AprivateSamplePage";
driver.get(url);
JavascriptExecutor js = (JavascriptExecutor) driver;
String text = (String)  js.executeScript("return nodes =[];
xPathResult=document.evaluate('//comment()',document,null,XPathResult.ANY_TYPE, null);
nodes =[]; 
node = xPathResult.iterateNext();
while (node) {nodes.push(node.textContent);
node =  xPathResult.iterateNext();}nodes;").toString();
System.out.print(text);

И вывод выглядит так:

Only local connections are allowed.
Okt 30, 2018 8:56:07 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFORMATION: Detected dialect: OSS
[]
Process finished with exit code 0

1 Ответ

0 голосов
/ 30 октября 2018

Вы выполняете сценарий только js.executeScript("return nodes =[];");. Остальная часть сценария игнорируется после этого оператора возврата. Следовательно вы получаете пустой массив.

Что касается executeScript(String) документации javaDoc, ваш код сценария упакован и выполняется как тело анонимной функции, подобной этой:

function f() {
    return nodes = [];
    xPathResult = document.evaluate('//comment()', document, null, XPathResult.ANY_TYPE, null);
    nodes = [];
    node = xPathResult.iterateNext();
    while (node) {
        nodes.push(node.textContent);
        node = xPathResult.iterateNext();
    }
    nodes;
}();

Как вы знаете, каждый оператор скрипта отделяется ";". Поскольку первый оператор является оператором return, функция заканчивается там и возвращает пустой массив в качестве результата.

В консоли браузера скрипт работает должным образом, поскольку он не останавливается на операторе return, а выводит значение nodes; финального оператора.

Вы должны переместить возврат от первого к последнему утверждению:

xPathResult = document.evaluate('//comment()', document, null, XPathResult.ANY_TYPE, null);
nodes = [];
node = xPathResult.iterateNext();
while (node) {
    nodes.push(node.textContent);
    node = xPathResult.iterateNext();
}

return nodes;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...