Karate 1.4中feature定义变量无法在js文件中访问的问题求助
问题解决:Karate 1.4+中JS函数无法访问Feature变量的问题
问题原因
Karate 1.4版本对JavaScript函数的执行上下文做了严格隔离,默认情况下,Feature文件中定义的变量不会自动注入到外部JS文件的函数作用域中,这就是升级后出现“变量未定义”错误的原因。另外注意你的JS代码里有拼写错误:karae.log应该改为karate.log,这个也可能引发额外问题。
解决方案
方案1:通过karate.map传递额外参数
这是最直接的方式,把需要的变量作为额外参数传给karate.map,同时修改JS函数接收该参数:
- 修改Feature文件中的
karate.map调用:
Scenario: * def sampleItem = "tests" * def sampleitems = locateAll("#item") * def itemMap = karate.map(sampleitems, getItem, sampleItem)
- 更新
test.js中的函数,新增参数接收sampleItem:
function fn(itemVal, sampleItem) { // 你的业务代码 karate.log(sampleItem); }
方案2:使用karate.bind绑定变量到函数上下文
通过karate.bind将Feature变量绑定到JS函数的执行环境中,这样函数可以直接访问该变量,不需要修改函数参数:
Scenario: * def sampleItem = "tests" * def sampleitems = locateAll("#item") * def boundGetItem = karate.bind(getItem, { sampleItem: sampleItem }) * def itemMap = karate.map(sampleitems, boundGetItem)
test.js保持原有逻辑即可(记得修正karate.log的拼写):
function fn(itemVal) { // 你的业务代码 karate.log(sampleItem); }
方案3:将JS函数内联到Feature文件中
如果函数逻辑不复杂,可以直接在Feature文件中定义函数,这样函数能直接访问当前作用域的变量:
Scenario: * def sampleItem = "tests" * def sampleitems = locateAll("#item") * def getItem = function(itemVal) { // 你的业务代码 karate.log(sampleItem); } * def itemMap = karate.map(sampleitems, getItem)
内容的提问来源于stack exchange,提问作者Subitha
相关产品推荐
相关产品推荐

