如何使用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,也可以通过全局启动/销毁脚本实现:
- 创建
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(); }
- 创建
global-teardown.ts清理资源:
// global-teardown.ts export default async function globalTeardown() { await global.sharedContext.close(); await global.sharedContext.browser().close(); }
- 在
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, }, });
- 测试文件中直接使用全局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
相关产品推荐
相关产品推荐

