如何调用;“动态”;空手道中使用count()的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节点列表如何调用;“动态”;空手道中使用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表达式字符串 这对于检
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!