jmeter调用js文件报错

问题

最近使用jmeter调取js文件总报错,升级降级了jdk版本都不行

报错信息

ERROR o.a.j.m.JSR223PreProcessor: Problem in JSR223 script, 加载进入房间js
javax.script.ScriptException: ReferenceError: “Symbol” is not defined in ./index.min.js at line number 9
at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470) ~[nashorn.jar:?]
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:426) ~[nashorn.jar:?]
at jdk.nashorn.api.scripting.NashornScriptEngine.access$300(NashornScriptEngine.java:73) ~[nashorn.jar:?]
at jdk.nashorn.api.scripting.NashornScriptEngine$3.eval(NashornScriptEngine.java:514) ~[nashorn.jar:?]
at javax.script.CompiledScript.eval(Unknown Source) ~[?:1.8.0_151]
at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:221) ~[ApacheJMeter_core.jar:4.0 r1823414]
at org.apache.jmeter.modifiers.JSR223PreProcessor.process(JSR223PreProcessor.java:44) [ApacheJMeter_components.jar:4.0 r1823414]
at org.apache.jmeter.threads.JMeterThread.runPreProcessors(JMeterThread.java:849) [ApacheJMeter_core.jar:4.0 r1823414]
at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:467) [ApacheJMeter_core.jar:4.0 r1823414]
at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:416) [ApacheJMeter_core.jar:4.0 r1823414]
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:250) [ApacheJMeter_core.jar:4.0 r1823414]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_151]
Caused by: jdk.nashorn.internal.runtime.ECMAException: ReferenceError: “Symbol” is not defined
at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:57) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:319) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:291) ~[nashorn.jar:?]
at jdk.nashorn.internal.objects.Global.noSuchProperty(Global.java:1441) ~[nashorn.jar:?]
at jdk.nashorn.internal.scripts.Script$Recompilation$1791$index_min.L:9-1$:split-2(./index.min.js:9) ~[?:?]
at jdk.nashorn.internal.scripts.Script$Recompilation$1704$391$index_min.L:9-1(./index.min.js:9) ~[?:?]
at jdk.nashorn.internal.scripts.Script$Recompilation$1703$189AA$index_min.L:9(./index.min.js:9) ~[?:?]
at jdk.nashorn.internal.scripts.Script$1702$index_min.:program(./index.min.js:9) ~[?:?]
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.Context.evaluateSource(Context.java:1222) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.Context.load(Context.java:839) ~[nashorn.jar:?]
at jdk.nashorn.internal.objects.Global.load(Global.java:1545) ~[nashorn.jar:?]
at jdk.nashorn.internal.scripts.Script$1701$^eval_.:program(:1) ~[?:?]
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393) ~[nashorn.jar:?]
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:421) ~[nashorn.jar:?]
… 10 more

环境

jmeter4.0+jdk1.8.0_151+ES6 JavaScript

你的错误提示表明你的脚本中使用了 “Symbol” 这个ES6才引入的特性,但是它在Nashorn JavaScript engine中并不可用。

Nashorn JavaScript引擎被用于在Java 8和Java 9中执行JavaScript代码.虽然它支持ECMAScript 5.1标准,但并不完全支持ES6的所有特性.这就是为什么你在尝试使用"Symbol"时遇到了ReferenceError.

解决方法有一下几个:

  1. 你可以尝试修改你的JavaScript代码,避免使用那些Nashorn不支持的ES6特性。

  2. 你也可以试一试GraalVM,它是一个高性能的运行环境,支持多种语言,包括完全支持ES6的JavaScript。

  3. 或者使用其他的ECMA脚本引擎,比如Rhino,它可能对ES6有更好的支持(需要验证)。

  4. 如果可能的话,可以尝试在自己的电脑上下载一个支持ES6的浏览器(如最新版本的Chrome或者Firefox),然后在浏览器的开发者工具中运行和测试你的JavaScript代码。

从Jmeter的角度来说,并没有一个简单易行的方法来解决这个问题,因为Jmeter的JSR223元素是依赖于JDK提供的脚本引擎,如果JDK的脚本引擎不支持,那么Jmeter也无法支持。
如果你的脚本代码中必须要用到 ES6 的特性,那么你可以使用Babel将你的ES6代码转译为ES5代码,因为 Nashorn 支持 ES5。

以下是具体的操作步骤:

  1. 在项目的根目录下安装 Babel 和必要的转译插件:

npm install --save-dev @babel/core @babel/cli @babel/preset-env

  1. 创建一个名为 .babelrc 的配置文件,在其中添加如下内容:

{
“presets”: [“@babel/preset-env”]
}

  1. 在项目的根目录下创建一个包含你的源码的 src 文件夹和一个用来存放转译后代码的 dist 文件夹。

  2. 在 package.json 文件中添加一个脚本命令来运行 Babel 转译:

“scripts”: {
“build”: “babel src -d dist”
}

  1. 运行 npm run build,这将会将 src 文件夹中的所有文件转译为 ES5 代码并存入 dist 文件夹。

  2. 然后在 JMeter 中引用转译后的 js 文件执行。

希望这个方法可以解决你的问题。