【问题标题】:Return all attributes in junit result xml using xpath and Java DOM Parser使用 xpath 和 Java DOM Parser 返回 junit 结果 xml 中的所有属性
【发布时间】:2019-04-29 19:17:13
【问题描述】:

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

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

这是一个 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 部分中的文本。

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

【问题讨论】:

    标签: java xml xpath junit domparser


    【解决方案1】:

    您当前的 XPath //testcase[@name] 正在选择所有具有 name 属性的测试用例元素。

    如果您想从测试用例元素中选择所有名称属性,那么您的 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());
    }
    

    【讨论】:

    • 感谢 Mads 非常感谢。我仍然需要在循环语句之后使用转换器,以便在循环正确后将这些永久应用于文件?
    • 你的意思是,修改后保存那个XML文档?是的。对document 对象所做的更改将在内存中完成。如果要更新文件,则需要保存文档并覆盖文件。 stackoverflow.com/a/4561785/14419
    猜你喜欢
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多