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>')
我有一个 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>')