如何使用jest-puppeteer在单个标签页中运行所有Puppeteer测试?
解决jest-puppeteer全局前置、页面冲突及并行问题
1. 先解决并行测试的冲突问题
jest默认并行执行测试用例,会导致每个测试启动独立的浏览器实例或标签页,互相干扰。直接禁用并行即可:
- 修改
jest.config.js,添加或调整配置:module.exports = { // 其他配置项... runInBand: true, // 强制串行执行所有测试 // 或设置 testConcurrency: 1 限制并发数为1 }; - 或者运行测试时追加命令行参数:
jest --runInBand
2. 配置全局前置步骤
要实现全局共享的beforeAll逻辑,需通过jest的setupFilesAfterEnv加载全局初始化文件:
- 在项目根目录创建
jest.setup.js,写入全局前置逻辑:let globalPage; beforeAll(async () => { // 直接使用jest-puppeteer自动注入的全局browser对象 globalPage = await browser.newPage(); // 执行你的通用前置操作,比如打开基础页面、登录等 await globalPage.goto('你的基础业务URL'); await globalPage.waitForSelector('页面核心元素选择器'); }); afterAll(async () => { await globalPage.close(); await browser.close(); }); // 将page对象暴露给所有测试用例 global.globalPage = globalPage; - 修改
jest.config.js,关联全局setup文件:module.exports = { // 其他配置项... preset: 'jest-puppeteer', // 确保已配置该预设 setupFilesAfterEnv: ['./jest.setup.js'] };
之后所有测试用例都会共享这个全局page对象,无需重复编写前置步骤。
3. 全局browser对象获取页面失败的排查
如果仍无法通过全局browser获取页面,检查以下几点:
- 确认
jest-puppeteer预设已正确配置在jest.config.js中,它负责自动注入全局browser对象 - 全局setup文件中的
beforeAll必须是async函数,且所有异步操作都加了await,确保初始化完成后再执行测试 - 测试用例中不要重新创建browser实例,直接使用全局注入的browser
额外提示
若后续需要部分测试并行,可使用describe.concurrent包裹对应测试块,但前提是这些测试不会共享页面资源,否则仍会出现冲突。
内容的提问来源于stack exchange,提问作者Ricardo Silva
相关产品推荐
相关产品推荐

