如何将beforeAll中的testContext传递给Playwright其他测试用例?
解决Playwright+TypeScript中beforeAll与测试用例testContext实例不一致的问题
核心原因
Playwright的beforeAll是套件级钩子,它接收的testContext属于整个测试套件;而每个测试用例的testContext是独立的用例级实例,默认相互隔离,所以两者不是同一个对象。
方案一:用test.extend扩展全局testContext共享前置状态
通过自定义扩展test函数,把登录后的状态注入到所有测试用例的testContext中,既保证只执行一次前置操作,又让每个用例能拿到共享的认证数据。
// 定义要扩展的上下文类型 type TestContextExtension = { authenticatedHomePage: HomePage; }; // 扩展test函数,注入共享的认证状态 const testWithAuth = test.extend<TestContextExtension>({ authenticatedHomePage: async ({ testContext }, use) => { // 只初始化一次认证页面 if (!globalThis.authenticatedHomePage) { const authApi = await testContext.getApi(AuthApi); await authApi.login(configProvider.loginEmail, configProvider.loginPassword); globalThis.authenticatedHomePage = await testContext.getPage(HomePage, { shouldNavigate: true, }); } // 将共享实例传递给测试用例 await use(globalThis.authenticatedHomePage); }, }); // 使用扩展后的test函数写用例 testWithAuth('Test1 - create', async ({ testContext, authenticatedHomePage }) => { // 直接用authenticatedHomePage,testContext也能正常做用例级操作 }); // 测试结束后清理全局变量 test.afterAll(() => { delete globalThis.authenticatedHomePage; });
方案二:模块级变量存储共享数据,用例中复用
如果不想扩展test函数,可把beforeAll中拿到的关键数据(比如登录token)存在模块变量里,在每个用例的testContext中复用这些数据,避免重复执行登录。
// 模块级变量存认证token let authToken: string; test.beforeAll(async ({ testContext }) => { const authApi = await testContext.getApi(AuthApi); const res = await authApi.login( configProvider.loginEmail, configProvider.loginPassword ); // 保存登录token authToken = res.data.token; }); test('Test1 - create', async ({ testContext }) => { // 用保存的token初始化API,跳过登录 const authApi = await testContext.getApi(AuthApi); authApi.setToken(authToken); // 用已认证状态初始化HomePage const homePage = await testContext.getPage(HomePage, { shouldNavigate: true, authToken: authToken, }); // 测试逻辑 });
关键提醒
不要直接把beforeAll中的testContext或页面实例赋值给全局变量后在测试用例中使用,会导致上下文冲突,引发不可预料的错误。
内容的提问来源于stack exchange,提问作者Tal Angel
相关产品推荐
相关产品推荐

