如何通过 soapui 检索正确的 xml 节点
How to retreive correct xml node through soapui
我有一个 xml,我想从 HotelOption
节点输出一个 'RatePlanCode',但诀窍是在 HotelOption
节点内需要一个 HotelSupplement
'Code'。如果其中有 HotelSupplement
'Code',那么我们不会为该酒店选择 'RatePlanCode',只有那些有。我的问题是如何执行此检查以取出正确的 'RatePlanCode'?
下面是一个 xml 示例,您可以看到在第一个 HotelOption
之间没有 HotelSupplement
'Code' 所以我们不采用该酒店的 'RatePlanCode' 但第二个 HotelOption
确实有一个 HotelSupplement
'Code' 所以我们取 'RatePlanCode'。
<soap:Envelope>
<soap:Body>
<HotelAvailResponse>
<AvailabilityRS TimeStamp="2017-02-08T17:07:17.3372275+00:00" IntCode="TLqw0EfFwMZFNlFLjsETG67d66mZhioSdJ4oCcM1Hao=">
<Results>
<HotelResult>
<HotelOptions>
<HotelOption RatePlanCode="xxxxxxxrEsM=" Status="OK" NonRefundable="false">
<AdditionalElements>
<HotelOffers>
<HotelOffer>
<Description></Description>
</HotelOffer>
</HotelOffers>
</AdditionalElements>
</HotelOption>
<HotelOption RatePlanCode="xxxxxxxxxxGQjs=" Status="OK" NonRefundable="false">
<AdditionalElements>
<HotelSupplements>
<HotelSupplement Code="202964">
<Name>Bed&Breakfast</Name>
</HotelSupplement>
</HotelSupplements>
<HotelOffers>
<HotelOffer>
<Description></Description>
</HotelOffer>
</HotelOffers>
</AdditionalElements>
</HotelOption>
</HotelOptions>
</HotelResult>
</Results>
</AvailabilityRS>
</HotelAvailResponse>
</soap:Body>
</soap:Envelope>
下面是一个有效的静态版本,但它需要是动态的,以便如果在另一个示例中有更多酒店,我们将采用一个符合我们标准的 RatePlanCode。此代码存储在 属性.
中
import groovy.xml.XmlUtil
def response = testRunner.testCase.getTestStepByName("GetHotelAvailability").getProperty("Response").getValue();
def xml = new XmlParser().parseText( response )
def RatePlanCode = xml.'soap:Body'.HotelAvailResponse[0].AvailabilityRS[0].Results[0].HotelResult[0].HotelOptions[0].HotelOption[1].@RatePlanCode
testRunner.testCase.setPropertyValue('RatePlanCode', RatePlanCode)
谢谢
这是 groovy 脚本:
- 脚本从名为 "GetHotelAvailability" 的步骤读取响应。
- 查找每个 HotelOption,并检查是否存在名为 "HotelSupplement" 的元素并且它具有属性 "Code" 并获取 RatePlanCode
- "RatePlanCode" 的结果是列表 - 它可能有零个或多个 "RatePlanCode"。
- 如果在列表中未找到费率计划代码,则抛出断言错误。否则,选择第一个元素作为 "RatePlancde" 并分配到测试用例级别自定义 属性 "RatePlanCode".
def response = testRunner.testCase.getTestStepByName("GetHotelAvailability").getProperty("Response").getValue()
def parsedxml = new XmlSlurper().parseText(response)
//Get the HotelOptions
def hOptions = parsedxml.'**'.findAll { it.name() == 'HotelOption'}
//Get the rate plan codes
def getRatePlanCode = { option ->
def res = option.'**'.findAll {it.name() == 'HotelSupplement' && it.@Code}
if (res) return option.@RatePlanCode.text()
null
}
def planCodes = []
hOptions.each { if (getRatePlanCode(it)) planCodes << getRatePlanCode(it) }
log.info " plan codes : ${planCodes}"
//if no plan codes, then throw error
assert planCodes.size(), "No RatePlanCode present in the response"
//Assing rate plan code to test case custom property
context.testCase.setPropertyValue('RatePlanCode', planCodes[0].toString())
我有一个 xml,我想从 HotelOption
节点输出一个 'RatePlanCode',但诀窍是在 HotelOption
节点内需要一个 HotelSupplement
'Code'。如果其中有 HotelSupplement
'Code',那么我们不会为该酒店选择 'RatePlanCode',只有那些有。我的问题是如何执行此检查以取出正确的 'RatePlanCode'?
下面是一个 xml 示例,您可以看到在第一个 HotelOption
之间没有 HotelSupplement
'Code' 所以我们不采用该酒店的 'RatePlanCode' 但第二个 HotelOption
确实有一个 HotelSupplement
'Code' 所以我们取 'RatePlanCode'。
<soap:Envelope>
<soap:Body>
<HotelAvailResponse>
<AvailabilityRS TimeStamp="2017-02-08T17:07:17.3372275+00:00" IntCode="TLqw0EfFwMZFNlFLjsETG67d66mZhioSdJ4oCcM1Hao=">
<Results>
<HotelResult>
<HotelOptions>
<HotelOption RatePlanCode="xxxxxxxrEsM=" Status="OK" NonRefundable="false">
<AdditionalElements>
<HotelOffers>
<HotelOffer>
<Description></Description>
</HotelOffer>
</HotelOffers>
</AdditionalElements>
</HotelOption>
<HotelOption RatePlanCode="xxxxxxxxxxGQjs=" Status="OK" NonRefundable="false">
<AdditionalElements>
<HotelSupplements>
<HotelSupplement Code="202964">
<Name>Bed&Breakfast</Name>
</HotelSupplement>
</HotelSupplements>
<HotelOffers>
<HotelOffer>
<Description></Description>
</HotelOffer>
</HotelOffers>
</AdditionalElements>
</HotelOption>
</HotelOptions>
</HotelResult>
</Results>
</AvailabilityRS>
</HotelAvailResponse>
</soap:Body>
</soap:Envelope>
下面是一个有效的静态版本,但它需要是动态的,以便如果在另一个示例中有更多酒店,我们将采用一个符合我们标准的 RatePlanCode。此代码存储在 属性.
中import groovy.xml.XmlUtil
def response = testRunner.testCase.getTestStepByName("GetHotelAvailability").getProperty("Response").getValue();
def xml = new XmlParser().parseText( response )
def RatePlanCode = xml.'soap:Body'.HotelAvailResponse[0].AvailabilityRS[0].Results[0].HotelResult[0].HotelOptions[0].HotelOption[1].@RatePlanCode
testRunner.testCase.setPropertyValue('RatePlanCode', RatePlanCode)
谢谢
这是 groovy 脚本:
- 脚本从名为 "GetHotelAvailability" 的步骤读取响应。
- 查找每个 HotelOption,并检查是否存在名为 "HotelSupplement" 的元素并且它具有属性 "Code" 并获取 RatePlanCode
- "RatePlanCode" 的结果是列表 - 它可能有零个或多个 "RatePlanCode"。
- 如果在列表中未找到费率计划代码,则抛出断言错误。否则,选择第一个元素作为 "RatePlancde" 并分配到测试用例级别自定义 属性 "RatePlanCode".
def response = testRunner.testCase.getTestStepByName("GetHotelAvailability").getProperty("Response").getValue()
def parsedxml = new XmlSlurper().parseText(response)
//Get the HotelOptions
def hOptions = parsedxml.'**'.findAll { it.name() == 'HotelOption'}
//Get the rate plan codes
def getRatePlanCode = { option ->
def res = option.'**'.findAll {it.name() == 'HotelSupplement' && it.@Code}
if (res) return option.@RatePlanCode.text()
null
}
def planCodes = []
hOptions.each { if (getRatePlanCode(it)) planCodes << getRatePlanCode(it) }
log.info " plan codes : ${planCodes}"
//if no plan codes, then throw error
assert planCodes.size(), "No RatePlanCode present in the response"
//Assing rate plan code to test case custom property
context.testCase.setPropertyValue('RatePlanCode', planCodes[0].toString())