Return junit 结果中的所有属性 xml 使用 xpath 和 Java DOM 解析器

Return all attributes in junit result xml using xpath and Java DOM Parser

我有一些自动化 Cucumber selenium 测试 运行 在不同的浏览器中使用 JUnit。

为了使结果更具可读性,我想更改 JUnit XML 输出,以便我可以将使用的浏览器附加到 XML 的名称属性。 我正在尝试 return 使用 XPath 标记为名称的所有属性。但是似乎 return 获取了错误的信息。

这里是 XML 的例子。

<?xml version="1.0" encoding="UTF-8"?>
<testsuite failures="1" name="cucumber.runtime.formatter.JUnitFormatter" skipped="0" tests="2" time="880.985693">
<testcase classname="ONLINE Regression Fibre Journey" name="ONLINE_Regression_Fibre_Naked_Journey_TC03" time="393.786644">
<system-out>
<![CDATA[
Given Im on the Spark Broadband Shop page...................................passed
 And select broadband plan...................................................passed
 And Add to cart accepting default selection.................................passed
 And Setup Tell us about where you live......................................passed
 And Delivery and Account setup..............................................passed
 And verify the confirmation page for Fiber new customer.....................passed
 And close the application...................................................passed
]]>
</system-out>
</testcase>
</testsuite>

下面是Java代码

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
org.w3c.dom.Document document = builder.parse(file);
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expression = xpath.compile("//testcase[@name]");
NodeList testsuite = (NodeList)expression.evaluate(document, XPathConstants.NODESET);

使用 inteliJ 调试器,我能够看到文档对象中的所有节点。然而,Nodelist 仅包含 XML 的 CDATA 部分中的文本。

我做错了什么?任何帮助将不胜感激。

您当前的 XPath //testcase[@name] 是 selecting 所有具有 name 属性的测试用例元素。

如果您想 select 测试用例元素中的所有名称属性,那么您的 XPath 应该是

//testcase/@name

然后您可以遍历名称属性并使用 getTextContent() 读取它的值并使用 setTextContent() 修改属性值。

XPathExpression expression = xpath.compile("//testcase/@name");
NodeList testcaseNames = (NodeList)expression.evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < testcaseNames.getLength(); i++) {
  Node name = testcaseNames.item(i);
  name.setTextContent("browser XYZ " + name.getTextContent());
}