升级Karate至1.4.0后JavaScript工具函数执行失败求助
问题解决:Karate 1.4.0升级后JS工具函数sleep报错
问题描述
API测试用例在Karate 1.3.1版本运行正常,升级至1.4.0后,调用utils.sleep(30)触发以下报错:
org.graalvm.polyglot.PolyglotException: TypeError: invokeMember (sleep) on {now={}, toDate={}, getToday={}, dateAdd={}, formatDate={}, sleep={}, logResult={}} failed due to: Message not supported. - <js>.:program(Unnamed:1)
原因分析
Karate 1.4.0开始默认使用GraalJS作为JavaScript引擎,替换了此前的Nashorn引擎。GraalJS对Java与JS的互操作规则做出调整,原代码中直接在JS函数内调用java.lang.Thread.sleep(millis)的方式不再兼容。
解决方案
方案1:使用Karate内置sleep方法(推荐)
Karate本身提供了开箱即用的karate.sleep()方法,可直接替代自定义sleep函数,无需修改工具类,直接调整测试用例中的调用代码:
* karate.sleep(30)
该方式符合Karate官方最佳实践,完全规避引擎差异带来的兼容性问题。
方案2:修改自定义utils.js中的sleep函数
若需保留自定义工具类结构,可调整sleep函数的实现逻辑,通过Karate封装的karate.exec()来执行Java代码:
function addUtils(config) { config['utils'] = { sleep: function(millis) { karate.exec(function(){ java.lang.Thread.sleep(millis); }); } // 其他工具函数... } return config; }
也可使用GraalJS的Java类型导入语法实现:
function addUtils(config) { const Thread = Java.type('java.lang.Thread'); config['utils'] = { sleep: function(millis) { Thread.sleep(millis); } // 其他工具函数... } return config; }
方案3:强制切换回Nashorn引擎(不推荐)
若暂时不想调整代码,可通过配置强制使用旧的Nashorn引擎,但这仅为临时方案,Karate后续会逐步淘汰对Nashorn的支持。在karate-config.js中添加如下配置:
karate.configure('jsEngine', 'nashorn');
验证
修改完成后重新运行测试用例,sleep函数即可正常执行,不再抛出类型错误。
内容的提问来源于stack exchange,提问作者Ketaki
相关产品推荐
相关产品推荐

