Karate框架:从JS函数读取的XML片段中嵌入表达式无法替换
Karate框架中JS函数返回XML的表达式不替换问题解决方法
问题根源
Karate的#(变量)表达式替换仅在场景文件的Karate语法解析阶段生效,JavaScript函数内部返回的字符串中的#(customerNumber)会被当作普通文本处理,不会触发Karate的表达式解析逻辑,所以输出时无法替换成实际变量值。
解决方法一:将变量作为参数传入JS函数(最直接)
修改场景文件,调用JS函数时传入生成的customerNumber:
* def customerNumber = functions.getRandomNumber() * xml Security1 = functions.fetchPrimaryResiAddress(customerNumber) * print Security1
修改JS函数,接收参数并在模板字符串中替换:
function() { return { fetchPrimaryResiAddress: function(custNum) { var PrimaryResidentialAddress = `<Address> <StreetNo>${custNum}</StreetNo> <Street Type="Street">RAWSON</Street> <City>DEAKIN</City> <State Name="ACT"/> <Postcode>2600</Postcode> <Country ISO3166="AU"/> </Address>`; return PrimaryResidentialAddress; }, getRandomNumber: function() { var temp = ''; karate.repeat(14, function(){ temp += Math.floor(Math.random() * 9) + 1 }); return temp; } } }
利用JS模板字符串${custNum}直接在函数内部完成变量替换,返回的XML字符串已经是最终值。
解决方法二:在场景文件中用karate.replace()替换字符串
不需要修改JS函数,在场景中对返回的字符串做替换:
* def customerNumber = functions.getRandomNumber() * def addressStr = functions.fetchPrimaryResiAddress() * def replacedStr = karate.replace(addressStr, '#(customerNumber)', customerNumber) * xml Security1 = replacedStr * print Security1
通过Karate内置的karate.replace()方法,手动替换字符串中的表达式占位符。
解决方法三:使用Karate的外部文件模板(推荐复杂场景)
将XML片段单独存为外部文件(比如address.xml):
<Address> <StreetNo>#(customerNumber)</StreetNo> <Street Type="Street">RAWSON</Street> <City>DEAKIN</City> <State Name="ACT"/> <Postcode>2600</Postcode> <Country ISO3166="AU"/> </Address>
在场景文件中通过read()加载并自动解析表达式:
* def customerNumber = functions.getRandomNumber() * xml Security1 = read('address.xml') * print Security1
Karate加载外部文件时会自动解析其中的#(变量)表达式,完成替换,这种方式更适合复杂XML结构,便于维护。
内容的提问来源于stack exchange,提问作者Shreyas
相关产品推荐
相关产品推荐

