You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置jest-puppeteer以同时运行2个Headless Chrome实例并行执行测试?

解决方案:Jest + Puppeteer 并行运行多浏览器实例

我之前在做Jest+Puppeteer并行测试时也踩过这个坑,跟你遇到的情况一模一样——明明设置了并行,却只有一个浏览器实例在干活。后来试了几个方法,终于搞定了,分享给你:

1. 确保每个测试用例拥有独立的浏览器实例

这是最关键的一点:不要全局共享一个浏览器实例,Jest的并行机制是基于worker的,每个worker会独立执行测试文件,所以要在每个测试的生命周期里单独创建和销毁浏览器。

步骤1:配置Jest的并行参数

修改你的jest.config.js,明确指定并行worker数量,同时延长测试超时时间(并行启动浏览器需要更多时间):

// jest.config.js
module.exports = {
  setupFilesAfterEnv: ['./jest.setup.js'],
  maxWorkers: 2, // 正好对应你要的2个并行实例
  testTimeout: 30000, // 把超时设长一点,避免启动浏览器时超时失败
  verbose: true, // 可选,方便查看每个worker的执行日志
};

步骤2:在测试前置文件中隔离浏览器实例

创建jest.setup.js,在beforeEach里初始化浏览器,afterEach里销毁,确保每个测试用例都有专属实例:

// jest.setup.js
const puppeteer = require('puppeteer');

beforeEach(async () => {
  // 每个测试用例启动全新的浏览器
  global.browser = await puppeteer.launch({
    headless: 'new', // 推荐用新版无头模式,兼容性更好
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-shm-usage', // 解决Linux环境下的内存不足问题
    ],
    // 不要手动指定--remote-debugging-port!否则并行时会端口冲突,让Puppeteer自动分配
  });
  global.page = await browser.newPage();
});

afterEach(async () => {
  // 测试结束后立即销毁资源,避免占用内存
  await global.page.close();
  await global.browser.close();
});

2. 拆分测试用例到不同文件

Jest默认对单个测试文件内的用例是串行执行的,如果你把两个测试用例放在同一个.test.js文件里,即使开了并行,也只会启动一个浏览器。解决方法很简单:

  • 把两个测试用例分别放到两个独立的测试文件(比如test1.test.js和test2.test.js)
  • 这样Jest的2个worker会同时执行这两个文件,每个文件启动自己的浏览器实例

3. 排查常见坑点

如果上面的方法还是不行,可以检查这些地方:

  • 端口冲突:不要手动设置--remote-debugging-port,Puppeteer默认会自动分配空闲端口
  • 系统资源不足:并行启动两个Chrome实例需要足够的内存,尤其是无头模式也会占用不少资源,可以关闭其他占用内存的程序试试
  • Puppeteer版本问题:确保你用的是较新的Puppeteer版本,旧版本可能在并行启动时存在bug

你可以先试试第一种方案,调整配置和前置文件,应该就能解决问题。如果还是有疑问,看看测试日志里有没有报错信息,比如浏览器启动失败的提示,能帮你更快定位问题。

内容的提问来源于stack exchange,提问作者Alexandra Pandelea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 00:37:31