Исполнитель javascript selenium javascript, возвращающий пустой массив

Я пытаюсь запустить функцию 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

При размещении кода, пожалуйста, найдите минутку, чтобы использовать украшение, такое как beautifier.io и т. д. Это упрощает чтение и понимание кода.

JeffC 30.10.2018 15:52

@JeffC спасибо, не знал об этом, буду использовать это в будущем.

BashLaneUp 01.11.2018 11:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
170
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы выполняете только сценарий 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 30.10.2018 09:18

Возврат не требуется размещать в начале. Смотрите мои правки @BashLaneUp

Selaron 30.10.2018 09:40

Vielen vielen Dank! Большое спасибо!

BashLaneUp 30.10.2018 09:56

При размещении кода, пожалуйста, найдите минутку, чтобы использовать средство красоты, такое как beautifier.io и т. д. Это упрощает чтение и понимание кода.

JeffC 30.10.2018 15:52

Другие вопросы по теме