我有SoapUI脚本的以下Request输出:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cai3g="http://schemas.test.com/cai3g1.2/">
<S:Header>
<cai3g:SessionId>aaaa6227cc81d</cai3g:SessionId>
<cai3g:TransactionId>333</cai3g:TransactionId>
<cai3g:SequenceId>85966385</cai3g:SequenceId>
</S:Header>
<S:Body>
<ns2:GetResponse xmlns:ns2="http://schemas.test.com/cai3g1.2/">
<ns2:Attributes>
<getResponse:getResponse publicId="sip:+12345678901@test_domain.org" xmlns="http://schemas.test.com/testnode/UserData/TEST_NODE/" xmlns:getResponse="http://schemas.test.com/testnode/UserData/TEST_NODE/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<publicId>sip:+12345678901@test_domain.org</publicId>
<services>
<incoming-communication-barring>
<icb-user-configuration>
<active>true</active>
<icb-ruleset>
<icb-rule id="rule1">
<id>rule1</id>
</icb-rule>
<icb-rule id="rule2">
<id>rule2</id>
</icb-rule>
<icb-rule id="rule3">
<id>rule3</id>
</icb-rule>
</icb-ruleset>
</icb-user-configuration>
</incoming-communication-barring>
</services>
</getResponse:getResponse>
</ns2:Attributes>
</ns2:GetResponse>
</S:Body>
</S:Envelope>
我想以某种方式从中提取规则名称,例如“rule1”,“rule2”和“rule3”,并将它们存储在一个字符串中。理想情况下,我会将它们存储在Test Case的Properties中的属性值中,格式如下: [“rule1”,“rule2”,“rule3”]以便在以后的TestStep中我可以在for循环中迭代这些值。
我希望在以后的TestStep
中实现以下内容String rules = ${Properties#rulesFromPropertyTransfer}
rules.each {
//do something with each rule
}
然而,我无法弄清楚如何提取甚至publicId并将其存储在变量中,更不用说从树到icb规则了。
我尝试过各种变体:
declare namespace ns2='http://schemas.test.com/cai3g1.2/';
declare namespace getResponse='http://schemas.test.com/testnode/UserData/TEST_NODE/';
//ns2:GetResponse/ns2:Attributes/getResponse:getResponse/publicId
但我通常在属性转移窗口中得到“null”响应。我是不是错了,或者有办法做我想做的事情?
答案 0 :(得分:0)
第一个问题是请求是无效标记。它包含一个没有开始<\services>
标记的结束<services>
标记。 XML解析器将对象。
修复后,你可以得到这样的规则:
def data = '''
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cai3g="http://schemas.test.com/cai3g1.2/">
<S:Header>
<cai3g:SessionId>aaaa6227cc81d</cai3g:SessionId>
<cai3g:TransactionId>333</cai3g:TransactionId>
<cai3g:SequenceId>85966385</cai3g:SequenceId>
</S:Header>
<S:Body>
<ns2:GetResponse xmlns:ns2="http://schemas.test.com/cai3g1.2/">
<ns2:Attributes>
<getResponse:getResponse publicId="sip:+12345678901@test_domain.org" xmlns="http://schemas.test.com/testnode/UserData/TEST_NODE/" xmlns:getResponse="http://schemas.test.com/testnode/UserData/TEST_NODE/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<publicId>sip:+12345678901@test_domain.org</publicId>
<incoming-communication-barring>
<icb-user-configuration>
<active>true</active>
<icb-ruleset>
<icb-rule id="rule1">
<id>rule1</id>
</icb-rule>
<icb-rule id="rule2">
<id>rule2</id>
</icb-rule>
<icb-rule id="rule3">
<id>rule3</id>
</icb-rule>
</icb-ruleset>
</icb-user-configuration>
</incoming-communication-barring>
</getResponse:getResponse>
</ns2:Attributes>
</ns2:GetResponse>
</S:Body>
</S:Envelope>'''
def xml = new XmlSlurper().parseText(data)
def rules = xml.Body.GetResponse.Attributes.getResponse.'incoming-communication-barring'.'icb-user-configuration'.'icb-ruleset'.'icb-rule'.id.list()
assert rules == ['rule1', 'rule2', 'rule3']
答案 1 :(得分:0)
你走了:
编辑:以下代码段可用作请求步骤的脚本断言
itemobj
稍后您将能够从Test Case属性“RESPONSE_RULES”中获取值,该值是逗号分隔的字符串。
在请求中,请将其用作import com.eviware.soapui.support.XmlHolder
def xml = new XmlHolder(context.response)
def responseRules = xml.getNodeValues("//*:icb-rule/@id").join(",")
assert responseRules instanceof String
log.info responseRules
context.testCase.setPropertyValue('RESPONSE_RULES', responseRules)
在常规中使用它
- 作为字符串
${#TestCase#RESPONSE_RULES}
- 作为列表或数组(这可能是您感兴趣的)
context.expand('${#TestCase#RESPONSE_RULES}')