我正在尝试运行我编写的 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/