簡體   English   中英

SOAPUI:修改請求:Groovy:appendNode適用的參數

[英]SOAPUI: Modify Request: Groovy: appendNode applicable arguments

我試圖通過添加具有不同值的重復子節點來修改SOAP請求。

這是我到目前為止的內容:

請求:

<soapenv:Envelope xlmns:ns1 = "..." xlmns:ns2 = "..." xlmns:ns3 = "..." xlmns:ns4 = "...">
   <soapenv:Body>
       <ns2:OperationName>
          <ns3:CuteN>77777</ns3:CuteN>
          <ns3:RaveN>666</ns3:RaveN>
       </ns2:OperationName>
   </soapenv:Body>
</soapenv:Envelope>

請求修改為:(填充xml標簽並添加另一個具有<RaveN></RaveN>標簽的值)

<soapenv:Envelope xlmns:ns1 = "..." xlmns:ns2 = "..." xlmns:ns3 = "..." xlmns:ns4 = "...">
   <soapenv:Body>
       <ns2:OperationName>
          <ns3:CuteN>77777</ns3:CuteN>
          <ns3:RaveN>666</ns3:RaveN>
          <ns3:RaveN>888</ns3:RaveN>
       </ns2:OperationName>
    </soapenv:Body>
 </soapenv:Envelope>

使用的代碼:

/* Groovy Utilities Declaration */
def groovyUtils = new ns4.eviware.soapui.support.GroovyUtils(context)

/* Request Holder Setup */
def request      = context.expand('${RequestStepName#Request}')
def requestHolder    = groovyUtils.getXmlHolder("request")

/* Declaring Namespaces */
requestHolder.namespaces["soapenv"] = "http://schemas.xmlsoap.org/soap/envelope/"
requestHolder.namespaces["ns2"]     = "..."
requestHolder.namespaces["ns3"]     = "..."
requestHolder.namespaces["ns4"]     = "..."

/* Set few string names */
def soapEnvXString       = "//soapenv:Envelope"
def soapBodyXString      = "/soapenv:Body"
def operXString          = "/ns2:OperationName"
def raveNumXString       = "/ns3:RaveNum"

/* create object of Request nodes */
def parentNode       = requestHolder.getDomNode(soapEnvXString + soapBodyXString + operXString)

def reqRaveNumTwo = "888"

if(reqRaveNumTwo != null && reqRaveNumTwo != "")
{
    /* create new node */   
    def secondRaveNumNode = new XmlSlurper(false,false).parseText("""<ns3:RaveNum>${reqRaveNumTwo}</ns3:RaveNum>""")
    parentNode.appendNode(secondRaveNumNode)
}

/* Update the request holder properties */
requestHolder.updateProperty(true)

錯誤:

groovy.lang.MissingMethodException: No signature of method: org.apache.xmlbeans.impl.store.Xobj$ElementXobj.appendNode() is applicable for argument types: (groovy.util.slurpersupport.NodeChild) values: [888]

我知道我在這里錯過了一些東西,這是我Groovy深入學習的第三天。 任何幫助將不勝感激,在此先感謝!

我認為您的代碼中存在兩個問題,首先您必須使用appendChild方法,因為您試圖在<ns2:OperationName>節點(不是對象中不存在的appendNode方法)內添加一個子對象,第二個問題是這是因為您將XmlSlurper類與XmlBeans混合使用,因為您無法將“節點”添加到對象從一個引擎到另一個引擎。

您必須在if語句中更改代碼以適合這些更正,因此可以使用類似以下內容的代碼:

if(reqRaveNumTwo != null && reqRaveNumTwo != "")
{
    /* create new node */   
    def nodeHolder  = groovyUtils.getXmlHolder("<ns3:RaveNum xmlns:ns3=\"...\">${reqRaveNumTwo}</ns3:RaveNum>")
    def itemNode = nodeHolder.getDomNode( "//ns3:RaveNum" )
    // import the node
    def secondRaveNumNode = parentNode.getOwnerDocument().importNode(itemNode,false)
    // and finally append it
    parentNode.appendChild(secondRaveNumNode)
}

代替:

if(reqRaveNumTwo != null && reqRaveNumTwo != "")
{
    /* create new node */   
    def secondRaveNumNode = new XmlSlurper(false,false).parseText("""<ns3:RaveNum>${reqRaveNumTwo}</ns3:RaveNum>""")
    parentNode.appendNode(secondRaveNumNode)
}

這段使用XmlBeans創建新節點的代碼看起來不太直觀,但是這種方式有效:)

此外,我在您的代碼中看到了這一點: def groovyUtils = new ns4.eviware.soapui.support.GroovyUtils(context) ,我想這只是一個typo但它必須是def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)

希望這可以幫助,

代碼已更新如下,以使其能夠正常工作:

/* Groovy Utilities Declaration */
def groovyUtils = new ns4.eviware.soapui.support.GroovyUtils(context)

/* Request Holder Setup */
def request      = context.expand('${RequestStepName#Request}')
def requestHolder    = groovyUtils.getXmlHolder("request")

/* Declaring Namespaces */
requestHolder.namespaces["soapenv"] = "http://schemas.xmlsoap.org/soap/envelope/"
requestHolder.namespaces["ns2"]     = "..."
requestHolder.namespaces["ns3"]     = "..."
requestHolder.namespaces["ns4"]     = "..."

/* Set few string names */
def operXString          = "//ns2:OperationName"
def raveNumXString       = "//ns3:RaveNum"

/* create object of Request nodes */
def parentNode = requestHolder.getDomNode(operXString)

def reqRaveNumTwo = "888"

if(reqRaveNumTwo != null && reqRaveNumTwo != "")
{
    /* create new node */   
    def nodeHolder  = groovyUtils.getXmlHolder("<ns3:RaveNum xmlns:ns3=\"ns3\">${reqRaveNumTwo}</ns3:RaveNum>")
    def itemNode = nodeHolder.getDomNode(raveNumXString)
    // import the node
    def secondRaveNumNode = parentNode.getOwnerDocument().importNode(itemNode,false)
    // and finally append it
    parentNode.appendChild(secondRaveNumNode)
}

/* Update the request holder properties */
requestHolder.updateProperty(true)
context.requestContent = requestHolder.xml

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM