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

Playwright如何定义全局函数在testHooks中自动执行?

在Playwright中全局复用测试钩子的正确方式

核心方案:扩展自定义Test对象并注入全局钩子

你可以通过扩展Playwright的test对象,把全局的beforeAll、beforeEach、afterEach、afterAll逻辑封装进去,所有测试文件直接使用这个自定义test对象即可,完全不需要重复写钩子代码,且能正常访问test对象的所有属性。

步骤1:创建全局测试工具文件

在项目根目录创建比如tests/utils/test-global.ts的文件,内容如下:

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

// 扩展base test对象,后续可添加自定义fixture
export const test = base.extend({});

// 全局beforeAll:所有测试执行前仅运行一次
test.beforeAll(async ({ browser }) => {
  // 你的全局前置操作,比如初始化测试数据、预登录管理员账号等
  console.log('全局beforeAll执行,可访问browser等fixture');
});

// 全局beforeEach:每个测试用例执行前运行一次
test.beforeEach(async ({ page, context }) => {
  // 你的单例前置操作,比如清空本地存储、导航至测试首页等
  console.log('全局beforeEach执行,可访问page、context等资源');
});

// 全局afterEach:每个测试用例执行后运行一次
test.afterEach(async ({ page }) => {
  // 你的单例后置操作,比如用例失败截图、收集错误日志等
  console.log('全局afterEach执行');
});

// 全局afterAll:所有测试执行后仅运行一次
test.afterAll(async () => {
  // 你的全局后置操作,比如清理测试数据、关闭第三方资源等
  console.log('全局afterAll执行');
});

// 同步导出expect,保持测试语法一致
export { expect } from '@playwright/test';

步骤2:在测试文件中使用自定义test对象

所有.spec.ts测试文件不再导入Playwright原生test,而是导入自定义的全局test对象:

// 替换原生test导入为自定义全局test
import { test, expect } from './utils/test-global';

test('示例测试用例', async ({ page }) => {
  await page.goto('/');
  await expect(page).toHaveTitle('测试首页');
});

常见问题排查

如果你之前扩展test对象未成功,大概率是忽略了以下细节:

  • 确保所有测试文件统一使用自定义test对象,不要混合原生test和自定义test,否则全局钩子不会生效
  • 全局钩子中可直接接收fixture参数(如browser、page),完全满足你访问test对象关联资源的需求
  • 若需针对特定测试组添加额外钩子,可在自定义test对象上继续叠加,或创建分层扩展的test对象

配置文件钩子的局限性说明

Playwright的playwright.config.ts中也支持定义全局钩子,但这类钩子无法直接访问test对象和fixture,仅能执行无依赖的全局操作(如设置环境变量),因此不适合你的场景,优先使用自定义test对象方案即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:02:26