Cypress运行时报cannot set property name仅getter错误如何解决
问题根因
你更换的目标测试站点前端代码将原生Error原型的name属性设置为了仅可读(只有getter没有setter),而Cypress运行时接管页面错误逻辑时会尝试修改Error实例的name属性,因此触发权限报错,和你编写的测试代码无关。
定位验证步骤
- 手动打开浏览器访问你的测试URL,打开控制台执行
Object.getOwnPropertyDescriptor(Error.prototype, 'name'),如果返回结果中writable为false,或者存在get方法但无对应set方法,即可确认根因。 - 检查Cypress版本,12.x及以上版本的错误处理逻辑更容易触发该类兼容性问题。
解决方法
方案1(优先验证,修改成本最低)
在Cypress的support入口文件(通常为cypress/support/e2e.js)添加如下配置,既可以规避该报错,也不会影响正常测试逻辑:
// 阻止站点自身的未捕获异常导致测试中断 Cypress.on('uncaught:exception', (err, runnable) => { return false }) // 兜底重写Error.prototype.name为可写,兼容Cypress内部逻辑 Object.defineProperty(Error.prototype, 'name', { writable: true, value: 'Error' })
方案2(适用站点完全不可修改的场景)
在cypress.config.js中添加实验性配置,跳过对目标域名的Cypress前置脚本注入:
const { defineConfig } = require('cypress') module.exports = defineConfig({ e2e: { experimentalSkipDomainInjection: ['*.你的测试域名.com'] // 替换为实际测试站点的域名 } })
方案3
降级Cypress到10.x及以下版本,旧版本的错误处理逻辑没有修改Error属性的操作,不会触发该冲突。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

