2017-02-09 2 views
1

У меня есть XML, где я хочу Бип оттуда «» RatePlanCode из HotelOption узла, но хитрость заключается в том, что в пределах HotelOption узла там должна быть HotelSupplement «Кодексом». Если есть HotelSupplement «Код», тогда мы не берем «RatePlanCode» для этого отеля, только те, которые делают. Мой вопрос заключается в том, как выполнить эту проверку, чтобы получить правильный «RatePlanCode»?Как извлечь правильный узел XML через SoapUI

Ниже приведен пример 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

Что делать, если у вас нет 'HotelSupplement' в любом' HotelOption'? или несколько HotelOption имеют HotelSupplement? – Rao

+0

Если в отеле HotelOption нет отелей, тогда мы не берем тарифный план для этого отеля. Для нескольких HotelOption есть HotelSupplement, выберите случайный тарифный план из одного из этих HotelOptions. На самом деле вы можете привести два примера: один выбор случайных и один выбор всех из них, а затем я решу позже, какой из них использовать? – Gudatama

ответ

0

Вот заводной сценарий:

  • Сценарий прочитал ответ от шага с именем "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()) 
Смежные вопросы