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 深入研究的第 3 天。任何帮助将不胜感激,提前致谢!
我认为您的代码中有两个问题,首先您必须使用 appendChild
方法,因为您试图在 <ns2:OperationName>
节点中添加一个子节点(而不是 appendNode
方法不存在于您的对象中),第二个问题是您将 XmlSlurper
类 与 XmlBeans
混合使用,因为您无法将 "nodes" 添加到从一个引擎到另一个引擎的对象。
您必须更改 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
我正在尝试通过添加具有不同值的重复子节点来修改 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 深入研究的第 3 天。任何帮助将不胜感激,提前致谢!
我认为您的代码中有两个问题,首先您必须使用 appendChild
方法,因为您试图在 <ns2:OperationName>
节点中添加一个子节点(而不是 appendNode
方法不存在于您的对象中),第二个问题是您将 XmlSlurper
类 与 XmlBeans
混合使用,因为您无法将 "nodes" 添加到从一个引擎到另一个引擎的对象。
您必须更改 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