Я пытаюсь запустить функцию javascript, которую я написал, чтобы собрать все комментарии HTML-сайта через xpath (требование) .
Функция вставлена в браузер, оф. без оператора return отлично работает.
Но при выполнении через селен javascriptexecutor возвращает пустой массив.
Я знаю, что вы должны поместить операторы javascript в форму «код» +, но для удобства чтения я отформатировал свой код, как показано ниже.
Надеюсь, кто-нибудь сможет мне с этим помочь :)
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
@JeffC спасибо, не знал об этом, буду использовать это в будущем.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы выполняете только сценарий js.executeScript("return nodes =[];");. Остальная часть сценария игнорируется после этого оператора возврата.
Следовательно, вы получаете пустой массив.
Что касается документации javaDoc executeScript(String), ваш код сценария обернут и выполняется как тело анонимной функции, например:
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;
Хорошо, случайно ли вы знаете, как обойти это, поскольку я получаю желаемый результат в консоли моего браузера. Если все правильно, javascriptExecutor требует возврата в начале ....
Возврат не требуется размещать в начале. Смотрите мои правки @BashLaneUp
Vielen vielen Dank! Большое спасибо!
При размещении кода, пожалуйста, найдите минутку, чтобы использовать средство красоты, такое как beautifier.io и т. д. Это упрощает чтение и понимание кода.
При размещении кода, пожалуйста, найдите минутку, чтобы использовать украшение, такое как beautifier.io и т. д. Это упрощает чтение и понимание кода.