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

如何使用单个Puppeteer浏览器实例运行全部Jest测试文件

Jest + Puppeteer 共享单个浏览器实例解决方案

针对你提出的两个核心问题,以下是具体实现方案:

一、跨测试文件共享浏览器实例

Node.js不支持异步导出,但可以借助Jest的全局生命周期钩子实现:

  1. 创建全局配置文件
    新建jest-puppeteer-setup.js,用于统一管理浏览器的启动与销毁:
const puppeteer = require('puppeteer');

module.exports = {
  globalSetup: async () => {
    // 启动浏览器并挂载到全局对象
    global.browser = await puppeteer.launch({ headless: false });
  },
  globalTeardown: async () => {
    // 所有测试完成后关闭浏览器
    await global.browser.close();
  },
  testEnvironment: 'node'
};
  1. 配置Jest加载全局钩子
    修改jest.config.js,引入上述全局配置:
module.exports = {
  // 保留原有配置
  preset: './jest-puppeteer-setup.js'
};
  1. 在测试文件中复用实例
    每个测试文件直接从全局对象获取浏览器,创建新标签页执行测试:
describe('用户登录测试', () => {
  let page;

  beforeAll(async () => {
    // 每个测试套件创建独立标签页
    page = await global.browser.newPage();
  });

  afterAll(async () => {
    // 测试套件结束后关闭当前标签页
    await page.close();
  });

  test('验证登录流程', async () => {
    await page.goto('/login');
    // 编写具体测试逻辑
  });
});

二、自动关闭浏览器及失败处理

  • 自动关闭浏览器:通过globalTeardown钩子,Jest会在所有测试(无论成功/失败)执行完毕后自动触发该函数,无需手动判断最后一个测试。
  • 测试失败处理:可在测试文件的afterEach钩子中检测测试状态,执行自定义操作:
afterEach(async () => {
  const testState = expect.getState();
  if (testState.failedTests.length > testState.numPassedTests) {
    // 测试失败时截图留存
    await page.screenshot({ path: `failed-${Date.now()}.png` });
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:20:41