在SoapUI Groovy Script中自动获取XML的子节点

时间:2017-11-22 13:27:26

标签: xml groovy automated-tests soapui

我在SoapUI.groovy脚本步骤和SOAP请求步骤中有两个测试步骤。请求的正文如下:

<int:user>
     <name>James</name>
     <surname>Brown</surname>
     <age>100</age>
     <status>active </status>
</int:User>

我想在groovy脚本中生成一个字符串,它将包含正文的所有节点(在本例中为str = "namesurnameagestatus");和一个包含属性值的字符串; (在此示例中为str = "JamesBrown100active");我必须手动创建第一个字符串。对于第二个字符串我使用:

def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
    def holder = groovyUtils.getXmlHolder(step.getPropertyValue("request") )  
    holder.getNodeValue("//name");  //for the name attribute

我想在循环中自动执行此过程。

例如:

object =  Get Node Values of Body
count = object.size();
// some loop
for(count times){ 
     object.get(i).  get value;
     //other code
}

像这样的东西。有解决方案吗我深入研究了其他一些解决方案,但无法找到正确的代码/行为。

2 个答案:

答案 0 :(得分:2)

看起来你的用例是,你将结合所有属性,如姓名,姓氏等,以及他们的价值。

然后你会尝试检查是否实际=预期!!

让我们假设样本xml低于

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <ConversionRateResponse xmlns="http://www.webserviceX.NET/">
       <name>James</name>
     <surname>Brown</surname>
     <age>100</age>
     <status>active </status>
      </ConversionRateResponse>
   </soap:Body>
</soap:Envelope>

以下groovy代码将所有值组合在一起。只需更换&#34;第一步&#34;用你的步骤

的名字
def gu=new com.eviware.soapui.support.GroovyUtils(context)
def res = context.expand('${First Step#response}')
//log.info res
def holder = gu.getXmlHolder(res)
def val=holder.getNodeValues("//*[local-name()='ConversionRateResponse']/*")
def  allvalues=""
for(values in val)
{
    allvalues=allvalues+values
}
log.info allvalues

上述代码的输出是

Sat Nov 25 15:57:31 IST 2017:INFO:JamesBrown100active 

请注意,如果没有传递属性或者是可选的,则脚本将失败,这将不是明天的正确验证方式。

答案 1 :(得分:1)

在Gaurav khurana的帮助下,我找到了解决方案。

如果我想获取body containter中的所有元素值。我这样做:

    def gu=new com.eviware.soapui.support.GroovyUtils(context)
    def res = context.expand('${First Step#request}')
    //log.info res
    def holder = gu.getXmlHolder(res)
    def val=holder.getNodeValues("//soap:Body/*")
    def  allvalues=""
    for(values in val)
    {
        allvalues=allvalues+values
    }
    log.info allvalues

获取元素名称的方法(在本例中为“姓氏年龄状态”)如下:

  def gal = holder.getDomNodes("//" + space + "/*");

  for (values in gal) {
  log.info(values.getTagName());
  }