Я пытаюсь добавить 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 будет в точности как примеры выше.