2017-02-09 26 views
1

我有一个xml,我想从HotelOption节点推出'RatePlanCode',但诀窍是HotelOption节点中需要有一个HotelSupplement'代码'。如果有HotelSupplement'代码',那么我们不会为该酒店采用'RatePlanCode',而只是那个酒店的'RatePlanCode'。我的问题是如何执行此检查,以便取出正确的“RatePlanCode”?如何通过soapui检索正确的xml节点

下面是一个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&amp;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][email protected] 

testRunner.testCase.setPropertyValue('RatePlanCode', RatePlanCode) 

谢谢

+0

如果您在任何'HotelOption'中没有'HotelSupplement',该怎么办?或者多个HotelOption有HotelSupplement? – Rao

+0

如果在HotelOption中没有酒店补充,那么我们不会选择该酒店选项的rateplancode。对于多个HotelOption有HotelSuptionment,请从其中一个HotelOptions中选择一个随机rateplancode。其实你可以提供两个例子,一个挑选一个随机选择一个,然后我会决定使用哪一个? – Gudatama

回答

0

下面是Groovy脚本:

  • 脚本读取一个名为 “GetHotelAvailability” 步响应。
  • 看起来每个HotelOption,并检查是否有一个名为“HotelSupplement”的元素,它具有和属性“守则”,并得到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' && [email protected]} 
    if (res) return [email protected]() 
    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())