How to dynamically add children to a SOAP request in SOAPUI using groovy script

I have a request that takes 1..n items to add to the cart. the request by default has one item item with some children, I want to add N no items with a child. I can add an Item parent using creaeElementNS. Now I want to add children to the "item" as shown below, can someone shed some light on this

<basket:item> <basket:itemId>222</basket:itemId> <basket:itemCode>DEF</basket:itemCode> <basket:item> 

Groovy script

 def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context ) def holder = groovyUtils.getXmlHolder( "createBasket#Request" ) def parentnode = holder.getDomNode( "//basket:createBasketRequest" ) def basketTotal= holder.getDomNode( "//basket:itemsTotal" ) def itemsTag = requestDoc.createElementNS(parentnode.getNamespaceURI(), "item") parentnode.insertBefore(itemsTag , basketTotal) holder.updateProperty() 

Current output

 <basket:createBasketRequest> <basket:item> <basket:itemId>111</basket:itemId> <basket:itemCode>ABC</basket:itemCode> </basket:item> <basket:item> </basket:item> <basket:itemsTotal>500.00</basket:itemsTotal> </basket:createBasketRequest> 

Desired output

 <basket:createBasketRequest> <basket:item> <basket:itemId>111</basket:itemId> <basket:itemCode>ABC</basket:itemCode> </basket:item> <basket:item> <basket:itemId>222</basket:itemId> <basket:itemCode>DEF</basket:itemCode> <basket:item> <basket:itemsTotal>500.00</basket:itemsTotal> </basket:createBasketRequest> 

EDIT: I use the soapUI and TestCase parameters, GroovyScript step is required before adding the basket, groovy script prepares the basket request before sending the request, for example, if there is 1 element in my test document, it should request one element by default, so I don’t have to worry about adding other Item elements, but when my test file says I have two elements, I need to create Second Items elements (along with the child elements) and prepare the request for the add basket using the groovy script. actually sending a basket request

+6
source share
2 answers

Not sure if it will work (I do not use SoapUI), but does it help?

 def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context ) def holder = groovyUtils.getXmlHolder( "createBasket#Request" ) def parentnode = holder.getDomNode( "//basket:createBasketRequest" ) def basketTotal = holder.getDomNode( "//basket:itemsTotal" ) def nodeText = '''<basket:item> | <basket:itemId>222</basket:itemId> | <basket:itemCode>DEF</basket:itemCode> |</basket:item>'''.stripMargin() def nodeHolder = new com.eviware.soapui.support.XmlHolder( nodeText ) def nodeItem = nodeHolder.getDomNode( "//basket:item" ) def importNode = requestDoc.importNode( nodeItem, true ) parentnode.insertBefore( importNode, basketTotal ) holder.updateProperty() 
+4
source

Send Scott Davis a message about creating XML with groovy

I used MarkupBuilder to create XML that looks exactly the way you want.

 def sw = new StringWriter() def xml = new groovy.xml.MarkupBuilder(sw) xml."basket:createBasketRequest"(){ "basket:item"(){ "basket.itemId"("111") "basket:itemCode"("ABC") } "basket:item"(){ "basket.itemId"("222") "basket:itemCode"("DEF") } "basket:itemsTotal"("500.00") } log.info sw 

I got the output:

 <basket:createBasketRequest> <basket:item> <basket.itemId>111</basket.itemId> <basket:itemCode>ABC</basket:itemCode> </basket:item> <basket:item> <basket.itemId>222</basket.itemId> <basket:itemCode>DEF</basket:itemCode> </basket:item> <basket:itemsTotal>500.00</basket:itemsTotal> </basket:createBasketRequest> 

Updating the response as some part of the XML already exists and the nodes just need to be added to the root.

Try this code ...

 import org.custommonkey.xmlunit.Diff import org.custommonkey.xmlunit.XMLUnit import groovy.xml.StreamingMarkupBuilder def root = new XmlSlurper().parseText(orgXML) root.appendNode { "basket:item"{ "basket:itemID"("222") "basket:itemCode"("DEF") } } log.info groovy.xml.XmlUtil.serialize( root ) 
0
source

Source: https://habr.com/ru/post/952285/


All Articles