javascript - Java selenium javascript 执行器返回空数组

标签 javascript java selenium selenium-webdriver xpath

我正在尝试运行我编写的 javascript 函数,以通过 xpath(要求)收集 HTML 网站的所有评论。
粘贴在浏览器中的函数,ofc。没有“return”声明,工作得很好。
但是当通过 selenium '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

最佳答案

您仅执行脚本 js.executeScript("return Nodes =[];");。 return 语句之后,脚本的其余部分将被忽略。 因此您会收到一个空数组。

关于 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 语句处停止,而是打印出 Finale 语句的 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;

关于javascript - Java selenium javascript 执行器返回空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53059901/

相关文章:

javascript - 消失面板

java - RemoteWebDriver.executeScript() 和 Selenium.getEval() 有什么区别?

selenium - Capybara,从下拉列表中选择第一个选项?

javascript - CSS动画汉堡包图标并删除滚动类?

javascript - HTML5 Canvas 上鼠标点击绘制矩形

java - 修改Android中的compareTo

java - JUnit:将 zip 文件从 res 复制到 Android 文件系统

java - 将 class.forName 创建的类作为参数传递

java - 如何在断言中将值写入字符串

javascript - 将一组默认选项传递给多个初始化器