You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:05:04