You need to enable JavaScript to run this app. Karate DSL调用自定义JS文件函数运行报错该如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Karate DSL调用自定义JS文件函数运行报错该如何解决?

问题根因
  • 语法兼容问题:Karate底层使用GraalJS执行JS代码,不支持Node.js的CommonJS规范,你代码中的require('crypto-js')导入第三方包、module.exports = Encriptar;导出代码的写法都不符合Karate的JS运行要求。而且Karate读取外部JS文件时会自动将代码包裹成立即执行函数,你写的module.exports会被放到包裹函数的语法结构中间,直接触发语法报错,和你给出的错误日志完全匹配。
  • 调用逻辑错误:你在feature文件中用call关键字读取JS文件、后续用jsFunction.Encriptar()调用方法的写法不符合Karate的API规则。
修复方案

方案一:调整自定义JS写法(使用CryptoJS)

修改utils.js

首先删除require和module.exports相关代码,将CryptoJS的完整纯JS版本源码直接内嵌到utils.js开头,最终代码如下:

// 此处粘贴CryptoJS完整开源源码
function Encriptar(text, key) {
    var encoded = CryptoJS.AES.encrypt(text, key).toString();
    return encoded;
}
// 单函数场景直接返回函数即可,多函数场景可返回对象批量暴露方法
return Encriptar;

修改test.feature

调整调用语法,不需要加call关键字,直接读取后调用即可:

Feature: test javascript
Scenario: test javascript
* def encriptar = read('utils.js')
* def result = encriptar("text","key")
* print result

方案二:直接使用Karate内置加密能力(更简单,无需引入第三方包)

Karate已经内置了AES加密的工具方法,不需要额外引入CryptoJS,直接修改test.feature即可实现需求:

Feature: test javascript
Scenario: test javascript
// 参数依次为待加密文本、加密密钥、加密算法(AES为默认值可省略)
* def result = karate.encrypt('text', 'key', 'AES')
* print result

内容的提问来源于stack exchange,提问作者jorgeleon79

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 10:57:02