我有一个xml,我希望从HotelOption
节点推出'RatePlanCode',但诀窍是在HotelOption
节点内需要HotelSupplement
'代码”。如果当时有HotelSupplement
'代码',我们不会为该酒店采用'RatePlanCode',只会采用那些酒店。我的问题是如何执行此检查以便它取出正确的'RatePlanCode'?
下面是一个xml示例,您可以在其中看到第一个HotelOption
之间没有HotelSupplement
'代码',因此我们不会使用该酒店的'RatePlanCode'而是第二个HotelOption
确实有HotelSupplement
'代码'所以我们采用'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)
谢谢
答案 0 :(得分:0)
这是groovy脚本:
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())