Spectron调用app.start()无法启动应用 触发Jest异步回调超时问题
问题排查解决步骤
1. 补全缺失的依赖导入
你提供的test1.js代码中未引入Spectron的Application类,这是导致app初始化失败、启动超时的最直接原因,在文件头部添加导入语句:
const { Application } = require('spectron');
另外你混用了import和require两种模块导入语法,如果出现模块解析报错,可以把import "regenerator-runtime/runtime";改为CommonJS写法:
require("regenerator-runtime/runtime");
2. 对齐超时配置参数
你当前beforeEach的Jest超时设置为15000ms,低于Spectron配置的startTimeout: 20000ms,会导致Spectron还没完成启动,Jest就先触发了超时中断,调整beforeEach的超时阈值大于等于Spectron的启动超时:
beforeEach(() => { return app.start() }, 30000) // 调整为30s,覆盖Spectron的20s启动超时
也可以全局配置Jest默认超时,在package.json中新增jest配置段:
"jest": { "testTimeout": 30000 }
3. 修正Electron入口路径
你的package.json中main字段配置为build/electron.js,执行测试前必须先运行npm run build生成对应的构建产物,否则Electron启动时找不到入口文件会静默挂起。如果需要测试开发环境,需要先启动前端开发服务npm run start-browser,再调整Spectron的启动参数指向开发地址。
4. 查看日志定位深层问题
你已经配置了日志输出路径,触发超时后可以直接查看日志定位具体错误:
- 查看
chrome_log文件确认Chromedriver启动是否正常 - 查看webdriver日志确认和Electron的连接失败原因
最小用例验证
可以先运行下方简化的测试用例排除其他代码干扰:
const { Application } = require('spectron'); const path = require('path'); const electronPath = require('electron'); require("regenerator-runtime/runtime"); describe('最小启动测试', () => { let app; beforeEach(async () => { app = new Application({ path: electronPath, args: [path.join(__dirname, '..')], startTimeout: 30000 }); await app.start(); }, 30000); afterEach(async () => { if (app && await app.isRunning()) await app.stop(); }); test('启动成功', async () => { const count = await app.client.getWindowCount(); expect(count).toBeGreaterThan(0); }); });
内容的提问来源于stack exchange,提问作者JMArmbruster
相关产品推荐
相关产品推荐

