SOAP-UI:如何获取断言的 CDATA XPath?

SOAP-UI: How to get CDATA XPath for an assertion?

我有一个 SOAP UI 项目,它具有以下 Web 服务响应:

<env:Envelope env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <env:Header/>
   <env:Body>
      <m:invokeResponse xmlns:m="some namespace">
         <result xsi:type="xsd:string"><![CDATA[<?xml version="1.0" encoding="US-ASCII" standalone="yes"?><message><myVal>123</myVal></message>]]></result>
      </m:invokeResponse>
   </env:Body>
</env:Envelope>

我需要在 SOAP UI 中使用断言来查看 CDATA 部分 XML 中存在的 123。我不能简单地在 SOAP UI 断言中使用包含,因为 123 可能会在 CDATA 部分出现几次。所以我需要使用 XPath 断言。

现在,如果我添加断言 XPath 匹配

//result/text()

匹配

<?xml version="1.0" encoding="US-ASCII" standalone="yes"?><message><myVal>123</myVal></message>

但如果我将表达式更改为

//result[text()]/message/myVal[text()]

应该匹配 123 但失败了

如果我使用脚本断言使用 groovy 它有效(我只是使用 Groovy 看看它是否有效)

import com.eviware.soapui.support.XmlHolder

respXmlHolder = new XmlHolder(messageExchange.getResponseContentAsXml())
respXmlHolder.declareNamespace("ns1","http://www.webserviceX.NET")

CDATAXml = respXmlHolder.getNodeValue("//result/text()")
CDATAXmlHolder = new XmlHolder(CDATAXml)

myval = CDATAXmlHolder.getNodeValue("//message/myVal")
assert myval == "123"

但我想知道是否有一种方法可以在 SOAP UI 中使用 XPath 断言来执行此操作。我需要将项目交给不理解的业务 Groovy :)

看起来无法单独使用 XPath 来完成此操作。

正如 XPath to the tag inside CDATA 解释的那样,CDATA 部分未被解析,并且无法使用 XPath 表达式来测试元素是否存在于 CDATA 部分中

如果我使用脚本断言,它对我有用,希望它对你也有用

import com.eviware.soapui.support.XmlHolder
responsexmlholder = new XmlHolder(messageExchange.getResponseContentAsXml())
Cdataxml = responsexmlholder.getNodeValue("//*:payLoad")
log.info Cdataxml
Cdataxmlholder = new XmlHolder(Cdataxml.trim())
errorcode = Cdataxmlholder.getNodeValue("//*:ErrorCode")
log.info errorcode

这是我们可以想出的最直接的方法来验证测试用例断言的 CDATA 块中的数据。它将 xml 展平为字符串并仅查找字符串。不是 eloquent 但它完成了我们需要完成的工作。它还使用 groovy 脚本断言。

import com.eviware.soapui.support.GroovyUtils
def rawResponse = messageExchange.getRawResponseData()
def rawResponseAsString = new String(rawResponse)
log.info rawResponseAsString
assert rawResponseAsString.contains('<myVal>123</myVal>')