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

如何使用Playwright在单个浏览器实例中运行所有spec文件的测试?

在单个Browser Context中运行所有Playwright测试用例

核心思路

通过自定义全局共享的固定装置(Fixture),让所有spec文件的测试复用同一个Browser Context,替代Playwright默认的每个测试隔离创建Context的行为。

具体实现步骤

1. 定义全局共享Fixture

在测试根目录创建fixtures.ts文件,扩展Playwright的基础测试逻辑,实现单个Context的全局复用:

// fixtures.ts
import { test as base } from '@playwright/test';

// 扩展基础测试,替换默认的Context创建逻辑
export const test = base.extend({
  context: async ({ browser }, use) => {
    // 创建唯一的Browser Context,供所有测试共用
    const sharedContext = await browser.newContext();
    // 将这个Context传递给所有测试用例
    await use(sharedContext);
    // 所有测试执行完毕后,再关闭Context
    await sharedContext.close();
  },
});

export { expect } from '@playwright/test';

2. 在测试文件中使用共享Fixture

所有spec测试文件里,不再导入Playwright默认的test,而是导入我们自定义的test:

// demo.spec.ts
import { test, expect } from './fixtures';

test('首页加载测试', async ({ page }) => {
  // 这里的page来自全局共享的Context
  await page.goto('/');
  await expect(page.locator('h1')).toHaveText('首页');
});

test('用户中心跳转测试', async ({ page }) => {
  // 复用同一个Context,保留之前的会话状态
  await page.click('#user-center-btn');
  await expect(page.url()).toContain('/user');
});

3. 关键注意事项

  • 由于所有测试共享同一个Context,测试执行顺序会直接影响结果,前一个测试修改的Cookie、LocalStorage等会话状态会保留到下一个测试
  • 如果需要在测试间重置部分状态(比如清空缓存),可以添加全局前置操作:
    test.beforeEach(async ({ page }) => {
      await page.evaluate(() => window.localStorage.clear());
      await page.context().clearCookies();
    });
    
  • 确保playwright.config.ts中没有配置强制隔离的Context选项,避免覆盖全局共享逻辑

替代方案:项目级全局Setup/Teardown

如果不想用Fixture,也可以通过全局启动/销毁脚本实现:

  1. 创建global-setup.ts初始化全局Context:
// global-setup.ts
import { FullConfig } from '@playwright/test';

declare global {
  var sharedContext: import('@playwright/test').BrowserContext;
}

export default async function globalSetup(config: FullConfig) {
  const browser = await config.projects[0].use.browserType.launch();
  global.sharedContext = await browser.newContext();
}
  1. 创建global-teardown.ts清理资源:
// global-teardown.ts
export default async function globalTeardown() {
  await global.sharedContext.close();
  await global.sharedContext.browser().close();
}
  1. 在playwright.config.ts中配置全局脚本:
// playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
  globalSetup: './global-setup.ts',
  globalTeardown: './global-teardown.ts',
  use: {
    // 禁用默认的Context自动创建
    context: undefined,
  },
});
  1. 测试文件中直接使用全局Context:
// demo.spec.ts
import { test, expect } from '@playwright/test';

test('购物车测试', async () => {
  const page = await global.sharedContext.newPage();
  await page.goto('/cart');
  // 测试逻辑
  await page.close(); // 仅关闭页面,不要关闭Context
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:05:00