【问题标题】:SOAP-UI: How to get CDATA XPath for an assertion?SOAP-UI:如何为断言获取 CDATA XPath?
【发布时间】:2015-02-10 13:47:03
【问题描述】:

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

<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 断言中使用 contains,因为 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 的企业 :)

【问题讨论】:

  • 请检查这是否有帮助? stackoverflow.com/questions/19745210/…
  • 如果一切都失败了,请尝试文档:soapui.org/functional-testing/working-with-cdata.html
  • @SiKing 文档解释了我在示例中所做的,使用 Groovy,通过使用脚本获取 CDATA 节点,然后创建一个新的 XmlHolder。并再次使用它和 XPath 来获得所需的值。
  • @Rao - 谢谢,但这只会选择 CDATA 部分作为字符串。我想在 CDATA 字符串中获取一个值,它是一个 XML :)
  • 您看到“4. XPath 断言和 CDATA”部分了吗?

标签: xml xpath groovy soapui assertions


【解决方案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

【讨论】:

    【解决方案2】:

    看起来单独使用 XPath 是不可能做到这一点的。

    XPath to the tag inside CDATA 解释说 CDATA 部分没有被解析,并且不可能使用 XPath 表达式来测试 CDATA 部分中是否存在元素

    【讨论】:

    • 这就是我发给你的链接中提到的内容。还有一些方法可以获得价值,但不是你想要的方式。
    • @Rao 你是绝对正确的。不是我想要的方式......如果你制定一个答案,我会接受:)
    • 您发布的回复说这是来自 的字符串。所以 xpath 不能应用于字符串。是什么阻止了您“将项目移交给企业”?我认为只要您在“结果”元素中发送有效响应就可以了。或者您想考虑更改响应类型的架构(不在结果中封装 xml),以便用户可以在其上应用 xpath?
    【解决方案3】:

    这是我们可以想出的最直接的方法来验证 CDATA 块中的数据以进行测试用例断言。它将 xml 展平为字符串并仅查找字符串。不是那么雄辩,但它得到了我们需要做的事情。它还使用了一个 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>')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多