如何调用;“动态”;空手道中使用count()的XPath?

如何调用;“动态”;空手道中使用count()的XPath?,xpath,karate,Xpath,Karate,我试图在空手道中调用一个“动态”XPath,它使用XPath count()函数返回一个数字(或字符串表示) [使用Karate0.9.2]我试图在XML文档上调用“动态”XPath表达式(最初从基于JSON的配置文件读取) 有(可能)多个XPath表达式,所以我使用Karate的Karate.forEach()在Karate中重复调用XPath实用程序Javascript函数 在嵌入式Javascript函数中,我使用karate.xmlPath()调用“动态”XPath表达式字符串 这对于检

我试图在空手道中调用一个“动态”XPath,它使用XPath count()函数返回一个数字(或字符串表示)

[使用Karate0.9.2]我试图在XML文档上调用“动态”XPath表达式(最初从基于JSON的配置文件读取)

有(可能)多个XPath表达式,所以我使用Karate的Karate.forEach()在Karate中重复调用XPath实用程序Javascript函数

在嵌入式Javascript函数中,我使用karate.xmlPath()调用“动态”XPath表达式字符串

这对于检索单个节点、节点列表等非常有效,但是当表达式使用XPath的count()函数时,它会失败,因为结果是一个数字,而不是XML节点或XML节点列表

Feature:  General XPath based evaluator
Scenario: ....

 # Omitting details around performing HTTP request to obtain XML response....
  * xml payload = ..... $.requests[0].body ... 
 #
 # A JS Function to invoke each XPath Query in our query dictionary 
 #
 # queryDictionaryItem has a single XPath query in it with an expected 
 value
 # { "xpath": <query>, "expectedValue", <string> } 
 # 
  * def checkXPathQueryFn =
  """
    function(queryDictionaryItem) {
      var requestXML = karate.get("payload");

      var xpathQuery = queryDictionaryItem.xpath;
      var expectedValue = queryDictionaryItem.expectedValue;

      // [!!] This will blow up if the xpathQuery is of the form:
      // "count(........)" 
      // --> Cannot return a NUMERIC value rather than a NODELIST
      var actualValue = karate.xmlPath( requestXML, xpathQuery );

      var match = karate.match( actualValue, expectedValue );

      if (!match.pass) 
      { 
          karate.abort("Failed to match expectation..."); }
      }
  """

 # queryDictionary is a list of JSON objects of the form:
 # { "xpath": <query>, "expectedValue", <string> } 

    * eval karate.forEach(queryDictionary, checkXPathQueryFn)

对于Intuit空手道开发者:[@ptrthomas]

在空手道核心的v0.9.2版本中,有关于在脚本#evalXmlPathOnXmlNode()中的XPath中使用count()的规定:

L367

但当我们使用动态XPath时,调用序列不使用“保护”,而是使用ScriptBridge#xmlPath()

L230

此方法具有以下行:

Node result=XmlUtils.getNodeByPath((Node)o,path,false);
当XPath表达式不返回节点集形状的数据时引发RuntimeException


L152.

确认此空手道框架问题已通过最新(2019-04-23)的空手道核心(开发分支构建)修复

此修复程序计划在中发布

Java/KarateSource进一步详细介绍了该问题以及通过直接Java XPath互操作的可选(临时)Java本机解决方案,如下所示:

注意:上述项目中XPathHelper的行为与karate.xmlPath()DSL服务的行为略有不同


特别是在检索单个XML元素时,空手道DSL自动提取底层的text()节点,而Java本机帮助程序需要显式引用XML元素中的嵌入式文本节点。

确认此空手道框架问题已通过最新的(2019-04-23)空手道核心(开发分支构建)修复

此修复程序计划在中发布

Java/KarateSource进一步详细介绍了该问题以及通过直接Java XPath互操作的可选(临时)Java本机解决方案,如下所示:

注意:上述项目中XPathHelper的行为与karate.xmlPath()DSL服务的行为略有不同


特别是对于检索单个XML元素,空手道DSL自动提取底层text()节点,而Java本机帮助程序需要显式引用XML元素中嵌入的文本节点。

回答自己的问题是完全正确的。但不要在问题本身上这样做。谢谢你的礼仪建议。我很乐意接受基于当前空手道版本的工作建议。我(对框架作者)的建议是:*尝试从Java的XPathAPI捕获类型强制XPathException并在不使用假定的NodeList返回类型的情况下重新调用,或者,*允许开发人员提供返回类型的提示,类似于XPathAPI。您可以为您的建议创建一个请求,或者更好地创建一个请求。谢谢Peter。我正在整理一个代码示例,以重现空手道指南中建议的场景,并将提出一个问题。@MattHavilah感谢错误报告,它应该在
develope
中修复。您回答自己的问题是完全正确的。但不要在问题本身上这样做。谢谢你的礼仪建议。我很乐意接受基于当前空手道版本的工作建议。我(对框架作者)的建议是:*尝试从Java的XPathAPI捕获类型强制XPathException并在不使用假定的NodeList返回类型的情况下重新调用,或者,*允许开发人员提供返回类型的提示,类似于XPathAPI。您可以为您的建议创建一个请求,或者更好地创建一个请求。谢谢Peter。我正在整理一个代码示例,以重现空手道指南中建议的场景,并将提出一个问题。@MattHavilah感谢错误报告,它应该在
develope
javax.xml.xpath.XPathExpressionException: com.sun.org.apache.xpath.internal.XPathException: Can not convert #NUMBER to a NodeList!

javascript evaluation failed: karate.forEach(requestExpectations, oldCheckExpectation), javax.xml.xpath.XPathExpressionException: com.sun.org.apache.xpath.internal.XPathException: Can not convert #NUMBER to a NodeList!