Как удалить-добавить childNode (в частности, включающий атрибуты) в XML-запрос с использованием динамического скрипта groovy - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь добавить childNode в SOAP-запрос на каждом этапе тестирования SOAP-запроса в тестовом примере с groovy-скриптом в readyAPI. Я могу добавить childNode, включая префикс пространства имен. Но я не смог приблизиться к добавлению однострочного дочернего узла с атрибутами в нем.

Я не смог найти много полезной информации для атрибутов, которые могут быть использованы для меня. Вот мой отличный сценарий и что я получаю с ним, а также то, что я хочу получить.

Это полный скрипт, который я использую только с URL-адресом nameSpace, не включенным

import com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext
import com.eviware.soapui.support.XmlHolder
import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestRequestStep 
import groovy.xml.*

def myTestCase = testRunner. testCase
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )

def soapRequestList = []
assert soapRequestList.size() == 0

// Holding all SOAP request step names in an arrayList

log.info "Test Step Count : " + context.testCase.testStepCount(0..context.testCase.testStepCount-1).each{
    def step = context.testCase.testStepList[it]
    if ( step instanceof WsdlTestRequestStep) {
        soapRequestList.add(step.name)
    }
}

log.info "SOAP Request Count: " + soapRequestList.size()

// Nessesery parameter definitions

def holderWebServiceRequest
def holderDynamicRequest 
def holderDynamic

// Dynamic Request Creation

def nodeName = "transactionId"

for(int i=0; i<soapRequestList.size() ; i++){

    // Defining web service request variable for each step

    holderWebServiceRequest = soapRequestList[i] + "#Request#"
    holderDynamicRequest = soapRequestList[i] + "#Request"
    holderDynamic = groovyUtils.getXmlHolder(""+holderDynamicRequest+"")

    //Deleting all child nodes with defined nodeName parameter already exists in the requestHeader

    int tidCount=context.expand('${'+holderWebServiceRequest+'count(//*:transactionId)}').toInteger()

    if(tidCount != 0 ){

        for (index = 1; index <= tidCount; index++) {

            deleteChildNode("//*:requestHeader", "//*:requestHeader//*:transactionId", holderDynamic)

            }
    }

    //Adding new child node with a testCase-property, that is unique for each request

    i=i+1
    addChildNode("//*:requestHeader",'''<transactionId/>'''.stripMargin(), "//transactionId" , i , nodeName ,  holderDynamic)
    i=i-1

}

// Function Definitions

void deleteChildNode (def parentNode, def childNode, def holderDynamic) {

    def parentnodeDelete  = holderDynamic.getDomNode( parentNode)
    def childnodeDelete = holderDynamic.getDomNode(childNode) 
    parentnodeDelete.removeChild(childnodeDelete)
    holderDynamic.updateProperty()

}

void addChildNode (def parentNode, def childNode, def object, def ctidPrefix, def nodeName, def holderDynamic){

    def parentnodeAdd  = holderDynamic.getDomNode( parentNode)
    def nodeHolderchildNodeElement  = new com.eviware.soapui.support.XmlHolder( childNode )
    def childNodeElementItem    = nodeHolderchildNodeElement.getDomNode( object )
    def importChildNode  = parentnodeAdd.getOwnerDocument().importNode( childNodeElementItem, true )
    def ns = "URL FOR THE NAMESAPACE PREFIX DEFINED IN THE XML FILES"
    def child = parentnodeAdd.appendChild( parentnodeAdd.getOwnerDocument().createElementNS(ns, nodeName ))
    child.appendChild(parentnodeAdd.getOwnerDocument().createTextNode('''${#TestCase#transactionID_'''+ ctidPrefix +'''}'''))
    holderDynamic.updateProperty(true)

}

Например, если это часть XML-запроса с 6-го шага запроса SOAP в тестовом примере: у него более одного узла транзакции и у всех неправильный индекс свойства:

<webService xmlns:ns2="URL FOR THE NAMESAPACE PREFIX DEFINED IN THE XML FILES">
    <requestHeader>
        <ns2:application>${#Project#application}</ns2:application>
        <ns2:languageCode>${#Project#languageCode}</ns2:languageCode>
        <ns2:transactionId>${#TestCase#transactionID_2}</ns2:transactionId>
        <ns2:channel>${#Project#channel}</ns2:channel>
        <ns2:extraParameters key="USER_IP" value="${#Project#myIP}"/>
        <ns2:transactionId>${#TestCase#transactionID_3}</ns2:transactionId>
    </requestHeader>

Когда я запускаю свой скрипт, он удаляет все дочерние узлы транзакции и записывает новый со свойством nessessery. После этого это выглядит так:

<webService xmlns:ns2="URL FOR THE NAMESAPACE PREFIX DEFINED IN THE XML FILES">
    <requestHeader>
        <ns2:application>${#Project#application}</ns2:application>
        <ns2:languageCode>${#Project#languageCode}</ns2:languageCode>
        <ns2:channel>${#Project#channel}</ns2:channel>
        <ns2:extraParameters key="USER_IP" value="${#Project#myIP}"/>
        <ns2:transactionId>${#TestCase#transactionID_6}</ns2:transactionId>
    </requestHeader>

Пока все в порядке.

МОЙ ВОПРОС: Как я собираюсь заменить дочерний узел extraparameters, который включает атрибуты thous "key" и "value", как я это сделал для узлаactionId? То, что я ожидаю, что узел extraParameters будет в точности как примеры выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...