我有一个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中使用Assertion来查看存在的123,它位于CDATA部分的XML中。我不能简单地在SOAP UI断言中使用包含,因为123可能会在CDATA部分中出现。所以我需要使用XPath Assertion。
现在,如果我添加一个断言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 Assertion执行此操作。我需要将项目交给那些不懂Groovy的商家:)
答案 0 :(得分:1)
如果我使用脚本断言,那对我有用,希望它能为你效用
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
答案 1 :(得分:0)
看起来单独使用XPath是不可能的。
由于XPath to the tag inside CDATA解释说CDATA部分未被解析,因此无法使用XPath表达式来测试CDATA部分中是否存在元素
答案 2 :(得分:0)
这是我们可以用来验证CDATA块中的数据以用于测试用例断言的最直接的方法。它将xml压缩为字符串,然后仅查找字符串。并不是那么雄辩,但是它可以满足我们的需求。它还使用了常规脚本断言。
import com.eviware.soapui.support.GroovyUtils
def rawResponse = messageExchange.getRawResponseData()
def rawResponseAsString = new String(rawResponse)
log.info rawResponseAsString
assert rawResponseAsString.contains('<myVal>123</myVal>')