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

如何使用jest-puppeteer在单个标签页中运行所有Puppeteer测试?

解决jest-puppeteer全局前置、页面冲突及并行问题

1. 先解决并行测试的冲突问题

jest默认并行执行测试用例,会导致每个测试启动独立的浏览器实例或标签页,互相干扰。直接禁用并行即可:

  • 修改jest.config.js,添加或调整配置:
    module.exports = {
      // 其他配置项...
      runInBand: true, // 强制串行执行所有测试
      // 或设置 testConcurrency: 1 限制并发数为1
    };
    
  • 或者运行测试时追加命令行参数:jest --runInBand

2. 配置全局前置步骤

要实现全局共享的beforeAll逻辑,需通过jest的setupFilesAfterEnv加载全局初始化文件:

  1. 在项目根目录创建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;
    
  2. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:48:14