Angular CLI 1.6.6+Angular5在无头Ubuntu服务器运行ng test失败求助
我之前在Ubuntu无头服务器上跑Angular 5(搭配Angular CLI 1.6.6)的单元测试时,也碰到过和你一模一样的"No captured browser"报错,给你几个亲测有效的排查和修复步骤:
1. 补全Karma配置的核心细节
你已经配置了ChromeHeadless的customLaunchers,但大概率漏了两个关键配置:
- 要把
ChromeHeadless加入到browsers数组里,Karma才会调用这个启动器 - 必须加上
--no-sandbox和--disable-dev-shm-usage这两个flags,Ubuntu无头环境下Chrome默认没有沙箱权限,而且/dev/shm的默认空间可能不够导致进程崩溃
修改后的karma.conf.js关键部分应该是这样:
module.exports = function(config) { config.set({ // ... 其他原有配置 browsers: ['ChromeHeadless'], // **一定要加上这个!** customLaunchers: { ChromeHeadless: { base: 'Chrome', flags: [ '--headless', '--disable-gpu', '--remote-debugging-port=9222', '--no-sandbox', // Ubuntu无头环境必备 '--disable-dev-shm-usage' // 避免共享内存不足的问题 ] } }, // ... 其他原有配置 }); };
2. 确认服务器上的浏览器版本和类型
无头服务器上很多时候装的是Chromium而不是Chrome,如果是这种情况,需要把customLaunchers里的base改成Chromium:
ChromeHeadless: { base: 'Chromium', flags: [/* 保持原有flags不变 */] }
你可以先在服务器上执行命令确认浏览器版本:
# 检查Chrome google-chrome --version # 检查Chromium chromium-browser --version
3. 直接测试ChromeHeadless是否能正常启动
有时候问题出在Chrome本身而不是Karma,你可以在服务器上直接运行这条命令测试:
google-chrome --headless --disable-gpu --remote-debugging-port=9222 --no-sandbox https://www.google.com
如果这条命令能正常执行没有报错,说明Chrome本身没问题,继续排查Karma配置;如果报错,先解决Chrome的安装/权限问题。
4. 调整Angular CLI的测试命令
用ng test的时候,记得加上--watch=false(无头服务器不需要监听文件变化)和--browsers=ChromeHeadless(明确指定浏览器),避免使用默认配置:
ng test --watch=false --browsers=ChromeHeadless
5. 检查依赖版本兼容性
Angular CLI 1.6.6对应的Karma和karma-chrome-launcher版本比较旧,可能存在兼容性问题。你可以尝试更新一下karma-chrome-launcher到适配Angular 5的版本:
npm install karma-chrome-launcher@2.2.0 --save-dev
(2.2.0是亲测和Angular 5兼容的版本,不要更到太新的版本,避免出现不兼容问题)
按照上面的步骤逐一排查,应该就能解决无法捕获浏览器的问题了。
内容的提问来源于stack exchange,提问作者dman

