获取遍历第一个匹配的子节点的子属性值



每个类都有3个或更多的测试方法。

每种测试方法都可能通过或失败。

零,一个或多个方法可能失败。

要求遍历测试方法结果,当发现失败的方法(第一个匹配)时,获取"消息"的属性值并打印它。

如果没有一个方法失败,则打印空白。

我怎样才能做到这一点?


Input.xml
<testng-results>
<suite>
<test>
<class name="activities.ActivitiesListTest">
<test-method status="PASS" started-at="2019-02-07T18:24:47Z" name="initTest">
<reporter-output>
</reporter-output>
</test-method>
<test-method status="FAIL" started-at="2019-02-07T18:24:47Z" name="ActListsForContactShowsContactRelatedTasksTest">
<exception class="org.openqa.selenium.NoSuchElementException">
<message>
<![CDATA[Element with locator 123 not present']]>
</message>
</exception>
<reporter-output>
</reporter-output>
</test-method>
<test-method status="FAIL" started-at="2019-02-07T18:24:47Z" name="afterClass">
<exception class="org.openqa.selenium.NoSuchElementException">
<message>
<![CDATA[Message 3]]>
</message>
</exception>
<reporter-output>
</reporter-output>
</test-method>
</class>
</test>
</suite>
</testng-results>

预期结果:

<Suite>
<test failed_reason=" <![CDATA[Element with locator 123 not 
present']]>"/>
</Suite>

尝试(XSL):


<Suite>
<xsl:for-each select="/class">
<test>
<xsl:attribute name="failed_reason">
<xsl:choose>
<xsl:when test="*[@status='FAIL']">test-method[position() = current()]/exception/@message</xsl:when>
</xsl:choose>
</xsl:attribute>
</test>
</xsl:for-each>
</Suite>

异常消息的绝对路径示例:

suite/test/class[@name='ActivitiesListForContactShowsContactRelatedTasksTest']/test-method[@name='ActListsTest']/exception/message

但是,没用。

如何达到预期结果?

编辑:尝试迈克尔的解决方案。

这就是我的XSL当前的样子:


<xsl:template match="/">
<Suite>
<xsl:for-each select="testng-results/suite/test/class">
<test>
<xsl:attribute name="start-time">
<xsl:value-of select="test-method[1]/@started-at"/>
</xsl:attribute>
<xsl:attribute name="failed_reason">
{normalize-space(test-method[@status='FAIL'][1]/exception/message)}
</xsl:attribute>
</test>
</xsl:for-each>
</Suite>
</xsl:template>

我猜(!)你想做这样的事情:

<xsl:template match="/*">
<Suite>
<xsl:for-each select="class">
<test failed_reason="{normalize-space(test-method[@status='FAIL'][1]/exception/message)}"/>
</xsl:for-each>
</Suite>
</xsl:template>

注:

<xsl:for-each select="/class">

将不会选择任何内容,除非CCD_ 1是根元素。但是如果class是根元素,那么只有一个类,所以使用xsl:for-each没有意义。

相关内容

  • 没有找到相关文章

最新更新