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

转译Selenium-WebDriver后在Nashorn运行报错:无法重定义函数name属性

解决Nashorn运行转译后Selenium-JS的"Cannot redefine property 'name'"错误

我之前也碰到过类似的坑,Nashorn作为Java 8自带的ES5引擎,对属性的可配置性限制得特别严格,这个错误的根源其实很好理清:

在ES5规范里,函数的name属性默认是不可配置的,而你用Babel转译Selenium 3.6.0的ES6代码时,babel-preset-env里的transform-function-name插件会试图给转译后的类(比如Selenium里的By类对应的函数)手动设置name属性,这直接触发了Nashorn的报错机制。

下面是几个可行的解决步骤,按优先级排序:

1. 调整Babel配置,禁用函数name属性转译

这是最直接的根治方案,修改你的Babel配置(不管是.babelrc还是Webpack中babel-loader的配置),在babel-preset-env里排除transform-function-name插件:

{
  "presets": [
    ["env", {
      "targets": {
        // 明确指定目标为ES5环境,和Nashorn完全对齐
        "uglify": true
      },
      "exclude": ["transform-function-name"]
    }]
  ],
  "plugins": ["babel-polyfill"]
}

这样Babel就不会再生成修改函数name属性的代码,从根源上避免冲突。

2. 临时修改转译后的代码

如果调整配置后还有问题,可以直接定位到转译后报错的By函数相关代码,找到类似下面的语句并删除:

Object.defineProperty(By, "name", { value: "By" });

ES5环境中函数本身就会自带name属性,手动设置完全没必要,删掉这行就能立刻解决报错。

3. 降级到ES5原生支持的Selenium版本

Selenium 3.x系列开始大量使用ES6特性,转译起来容易踩各种兼容坑。你可以尝试切换到Selenium 2.x的最后几个稳定版本(比如2.53.1),这些版本原生就是基于ES5编写的,不需要转译就能直接在Nashorn上运行,省掉很多麻烦。

4. 应急:调整Nashorn启动参数(不推荐长期使用)

如果以上方案都来不及测试,可以尝试在启动Nashorn时加上--language=es6参数——Java 8的Nashorn对ES6有部分支持,可能会放宽对name属性的限制,但这个参数可能引入其他ES6特性的兼容性问题,只适合临时应急用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:05:53