在SoapUI的XPath表达式中使用数据源属性

在SoapUI的XPath表达式中使用数据源属性,xpath,properties,soapui,Xpath,Properties,Soapui,我需要知道是否可以在XPath匹配配置的XPath表达式面板中使用datasource属性。例如,如果我们有以下XML文档: <ns1:Ions> <ns1:Ion>UI</ns1:Ion> <ns1:IonType>X</ns1:IonType> <ns1:StartDate>2010-05-10</ns1:StartDate> </ns1:Ions> <ns1:Ions>

我需要知道是否可以在XPath匹配配置的XPath表达式面板中使用datasource属性。例如,如果我们有以下XML文档:

<ns1:Ions>
  <ns1:Ion>UI</ns1:Ion>
  <ns1:IonType>X</ns1:IonType>
  <ns1:StartDate>2010-05-10</ns1:StartDate>
</ns1:Ions>
<ns1:Ions>
  <ns1:Ion>HH</ns1:Ion>
  <ns1:IonType>RI</ns1:IonType>
  <ns1:StartDate>1998-11-23</ns1:StartDate>
</ns1:Ions>
<ns1:Ions>
  <ns1:Ion>CF</ns1:Ion>
  <ns1:IonType>A</ns1:IonType>
  <ns1:StartDate>2000-06-10</ns1:StartDate>
</ns1:Ions>
预期结果(数据源输入类型为“A”)

运行测试将导致SoapUI[Pro]出现以下错误,缺少xpath声明的内容。如果我将
${DataSourceInput#ION}
替换为一个实际值,即“CF”,测试将相应地工作(我甚至尝试在
${DataSourceInput#ION}
周围加上单引号,但它不起作用)


在SoapUI中是否有其他方法可以实现这一点?

我尝试了您所做的,如果我在属性周围加上单引号,它对我很有用:

declare namespace ns1='http://my.namespace.com';
//ns1:Ions[ns1:Ion[text()='${DataSourceInput#ION}']]/ns1:IonType/text()
您是否检查了testStep名称是否与DataSourceInput完全相同?如果TestStep名称中有空格(即您的TestStep名称是数据源输入,您必须将
${Data Source Input}

无论如何,我为您提供了另一种方法,您可以在获得
响应的测试步骤之后添加groovy脚本类型的测试步骤,并在此处检查断言,如下所示:

// get xml holder
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);
def ionsHolder = groovyUtils.getXmlHolder("IonsTestStepName#response");

// generate xpath expression
def xpathExpression = "//*:Ions[*:Ion[text()='" + context.expand('${DataSourceInput#ION}') + "']]/*:IonType/text()";
log.info xpathExpression;

// get the node value
def nodeValue = ionsHolder.getNodeValue(xpathExpression);

// check expected value
assert nodeValue == context.expand('${DataSourceInput#ION_TYPE}'),'ERROR IONS VALUE';

希望这有帮助,

谢谢。我不知道为什么最初将属性放在一个引号中不起作用,但在实现了一个非常类似的Groovy脚本解决方案之后,我重新创建了一个断言匹配,并能够相应地提取数据。尽管如此,由于可能不提供属性的内容,也不希望由于属性的不存在值而导致断言失败,因此我必须在脚本中实现逻辑来处理这种情况。
declare namespace ns1='http://my.namespace.com';
//ns1:Ions[ns1:Ion[text()='${DataSourceInput#ION}']]/ns1:IonType/text()
// get xml holder
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);
def ionsHolder = groovyUtils.getXmlHolder("IonsTestStepName#response");

// generate xpath expression
def xpathExpression = "//*:Ions[*:Ion[text()='" + context.expand('${DataSourceInput#ION}') + "']]/*:IonType/text()";
log.info xpathExpression;

// get the node value
def nodeValue = ionsHolder.getNodeValue(xpathExpression);

// check expected value
assert nodeValue == context.expand('${DataSourceInput#ION_TYPE}'),'ERROR IONS VALUE';