【问题标题】:Java selenium javascript executor returning empty arrayJava selenium javascript执行程序返回空数组
【发布时间】:2019-04-03 05:38:23
【问题描述】:

我正在尝试运行我编写的 javascript 函数,以通过 xpath(requirement) 收集 HTML 站点的所有 cmets。
粘贴在浏览器中的函数,ofc。没有'return'语句,工作得很好。
但是当通过 selenium '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

【问题讨论】:

  • 发布代码时,请花一点时间使用beautifier.io等美化工具,让代码更容易阅读和理解。
  • @JeffC 谢谢,不知道这个以后会用这个。

标签: javascript java selenium selenium-webdriver xpath


【解决方案1】:

您只执行脚本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; 值。

您应该将 return 从第一个语句移到最后一个语句:

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 在开始时需要“返回”....
  • return 不需要放在开头。查看我的编辑@BashLaneUp
  • Vielen vielen Dank!非常感谢!
  • 发布代码时,请花一点时间使用beautifier.io等美化工具,让代码更容易阅读和理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2023-03-23
  • 2012-05-29
  • 1970-01-01
相关资源
最近更新 更多