2015-09-16 2 views
2

У меня есть следующий вывод запроса из сценария SoapUI:SoapUI - Передача несколько экземпляров элемента вывода запроса значения свойства

<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:[email protected]_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:[email protected]_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, в форме: ["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 

Но я обычно получаю «нулевой» ответ в окне передачи имущества. Я иду об этом неправильно, или есть способ сделать то, что я хочу?

+0

[См этой ссылке ...] (http://stackoverflow.com/questions/32338829/how-to-extract-valuesof-tags-in-a-nested-xml-using-groovy- in-soap-ui/32569397 # 32569397) Я предлагаю вам найти любые существующие вопросы, а затем спросить, не получите ли вы это :). Всегда рад помочь :) –

+0

Спасибо Eiston. Перед публикацией я просмотрел несколько вопросов и руководств, но кажется, что наличие строки getResponse: getResponse ... в XML отбрасывает все методы, которые я нашел до сих пор. Я попробую предложения по указанной вами ссылке. –

ответ

1

Первая проблема заключается в том, что запрос является недопустимой разметкой. Он содержит закрывающий тег <\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:[email protected]_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:[email protected]_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'] 
+0

Спасибо за указание отсутствующего открытия тег. Я удалил на самом деле много данных из исходного вывода, чтобы сконденсировать его достаточно, чтобы соответствовать здесь, и я случайно удалил это. –

+0

Где я могу поместить эти определения в SoapUI? Являются ли они XPath, XQuery или JSONpath? –

+0

Это Groovy GPath.Но в корне это код Groovy. Я понятия не имею, где это происходит в soapui. –

1

Здесь вы идете:

EDIT: ниже фрагмент кода можно использовать в качестве сценария утверждения на стадии запроса

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) 

Позже вы сможете получить значение из свойства Test Case «RESPONSE_RULES», которое представляет собой строку, разделенную запятой.

В запросе использовать его в качестве ${#TestCase#RESPONSE_RULES}

В заводной использовании она

- как строковые context.expand('${#TestCase#RESPONSE_RULES}')

- в виде списка или массива (может это то, что интересно вам)

def rulesWithComma = context.testCase.getPropertyValue('RESPONSE_RULES') 
def rules = rulesWithComma.split(',') 
rules.each { rule -> 
    print rule 
    //do other stuff here 
} 
+0

@Rusty Lemur, ваша проблема еще не решена, так как ни один из ответов не помечен как принятый ответ. Вы все еще ищете что-то еще? – Rao

Смежные вопросы