Angular8从Protractor迁移到Cypress后执行ng e2e报getProjectMetadata不存在错误
问题根因
@cypress/schematic 高版本依赖的@angular-devkit/core版本 >=9.x,而Angular 8对应的@angular-devkit系列包最高只有0.803.x版本,该版本不存在getProjectMetadata内置任务接口,所以调用ng e2e时会触发找不到任务的报错,仅切换@angular-devkit/build-angular的次版本无法解决该问题。
解决方案
方案1:降级@cypress/schematic到适配Angular8的版本
- 卸载当前已安装的高版本schematic
npm uninstall @cypress/schematic --save-dev
- 安装兼容Angular 8的2.x版本
npm install @cypress/schematic@2.3.0 --save-dev
- 清理缓存并重装依赖
rm -rf node_modules package-lock.json npm cache clean --force npm install
- 重新执行
ng e2e验证功能是否正常
方案2:跳过Angular CLI调用,直接使用原生Cypress命令执行测试(更稳定)
该方案不需要修改现有依赖,完全避开CLI和devkit的版本兼容问题:
- 检查项目根目录是否存在
cypress.config.js配置文件,不存在则手动新增:
const { defineConfig } = require('cypress') module.exports = defineConfig({ e2e: { baseUrl: 'http://localhost:4200', // 与你本地ng serve启动的服务地址保持一致 supportFile: 'cypress/support/e2e.js', // 按你实际的support文件路径配置 } })
- 在
package.json的scripts字段中新增Cypress执行命令:
{ "scripts": { "cypress:open": "cypress open", // 打开GUI界面执行测试 "cypress:run": "cypress run" // 无头模式执行测试 } }
- 执行测试时,先打开一个终端窗口运行
ng serve启动项目,再打开另一个终端窗口执行npm run cypress:open即可调用Cypress运行测试用例,效果和ng e2e完全一致。
补充检查项
如果执行上述方案后仍报错,检查全局安装的Angular CLI版本是否为8.x版本,全局版本过高也会触发devkit兼容问题,可执行以下命令降级全局CLI:
npm install -g @angular/cli@8.3.29
内容的提问来源于stack exchange,提问作者Wael
相关产品推荐
相关产品推荐

