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
相关产品推荐
相关产品推荐

