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

求助:Playwright中不同test()间共享认证状态失败如何解决?

Playwright复用认证状态失败的问题解决

你遇到的核心问题是beforeAll中的page和测试用例的page不属于同一个浏览器上下文,Playwright默认每个测试用例会创建独立的上下文,所以beforeAll里的登录状态无法传递。另外使用storageState时,只生成了状态文件但没有正确配置加载,导致测试未复用该状态。

方案一:使用storageState生成并复用认证状态

这是Playwright官方推荐的方式,通过把登录状态保存到文件,让所有测试加载该文件复用状态。

步骤1:编写生成认证状态的测试

先单独写一个测试完成登录并保存状态到指定文件:

import { test } from '@playwright/test';
import { LoginPage } from '@pageRepo/login-page';
import { envConfig } from '@data/env-config';

test('生成认证状态', async ({ page }) => {
  const loginStep = new LoginPage(page);
  await loginStep.uiAuthentication('/', envConfig.userEmail, envConfig.userPassword);
  // 将当前上下文的认证信息(Cookie、LocalStorage等)保存到文件
  await page.context().storageState({ path: 'playwright/.auth/user.json' });
});

执行这个测试后,会在指定路径生成包含认证信息的JSON文件。

步骤2:配置测试加载认证状态

有两种配置方式:

  1. 全局配置:修改playwright.config.ts,让所有测试默认加载该状态:
import { defineConfig } from '@playwright/test';

export default defineConfig({
  use: {
    // 指定预保存的认证状态文件路径
    storageState: 'playwright/.auth/user.json',
    // 其他测试配置...
  },
});
  1. 单个测试配置:如果只想让特定测试复用状态,可在测试上单独配置:
test('访问仪表盘', async ({ page }) => {
  const loginPage = new LoginPage(page);
  await loginPage.navigateToUrl('/dashboard');
  // 可添加断言验证页面状态,比如检查仪表盘标题
}).use({ storageState: 'playwright/.auth/user.json' });

方案二:复用全局浏览器上下文

通过在beforeAll中创建一个已认证的浏览器上下文,所有测试用例都基于这个上下文创建页面,从而共享登录状态。

import { test } from '@playwright/test';
import { LoginPage } from '@pageRepo/login-page';
import { envConfig } from '@data/env-config';

// 全局变量存储已认证的上下文
let authenticatedContext;

test.beforeAll(async ({ browser }) => {
  // 创建新的浏览器上下文
  authenticatedContext = await browser.newContext();
  const page = await authenticatedContext.newPage();
  const loginStep = new LoginPage(page);
  // 完成登录操作
  await loginStep.uiAuthentication('/', envConfig.userEmail, envConfig.userPassword);
});

test('访问仪表盘', async () => {
  // 从已认证的上下文创建页面,自动继承登录状态
  const page = await authenticatedContext.newPage();
  const loginPage = new LoginPage(page);
  await loginPage.navigateToUrl('/dashboard');
});

test.afterAll(async () => {
  // 测试结束后关闭上下文
  await authenticatedContext.close();
});

常见错误说明

  1. beforeAll误用page参数:之前的代码中test.beforeAll(async ({ page })里的page是Playwright为beforeAll单独创建的临时页面,和每个测试用例的page属于不同上下文,登录状态自然无法共享。必须改用browser参数创建全局上下文。
  2. storageState未配置加载:只生成状态文件但没有在playwright.config.ts或测试中指定storageState路径,导致测试还是使用全新的上下文,不会加载已保存的认证信息。

内容的提问来源于stack exchange,提问作者Most Humayra Khanom Rime

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:05:20