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

Playwright测试:验证auth.json有效性,避免重复执行setup依赖

解决方案:让Playwright仅在认证会话失效时重新执行2FA登录

核心思路是改造你的global-setup.ts文件,让它先尝试复用已有的auth.json会话,通过访问一个需要登录权限的页面来校验会话有效性,只有当会话失效(比如跳转到登录页、返回未授权状态)时,才重新执行2FA登录流程。

具体实现步骤

  1. 修改global-setup.ts,加入会话校验逻辑:
import { chromium, FullConfig } from '@playwright/test';
import fs from 'fs';

async function globalSetup(config: FullConfig) {
  const authFile = './auth.json';
  // 先检查auth.json是否存在
  if (fs.existsSync(authFile)) {
    const browser = await chromium.launch();
    const context = await browser.newContext({ storageState: authFile });
    const page = await context.newPage();

    try {
      // 访问一个只有登录用户才能进入的页面(比如个人中心、仪表盘)
      await page.goto('/dashboard');
      // 根据页面特征判断是否处于登录状态,示例为检查用户头像元素
      const isLoggedIn = await page.locator('.user-avatar').isVisible({ timeout: 5000 });
      
      if (isLoggedIn) {
        console.log('✅ 已有的认证会话有效,跳过重新登录');
        await browser.close();
        return;
      }
    } catch (error) {
      console.log('⚠️ 已有的认证会话失效,将重新执行登录');
    } finally {
      await browser.close();
    }
  }

  // 走到这里说明没有有效会话,执行原本的2FA登录流程
  const browser = await chromium.launch({ headless: false }); // 2FA需手动输入时保持非无头
  const context = await browser.newContext();
  const page = await context.newPage();

  // 你的2FA登录逻辑:输入账号、密码,处理2FA验证等
  await page.goto('/login');
  await page.fill('#username', 'your-username');
  await page.fill('#password', 'your-password');
  await page.click('#submit');
  // 处理2FA步骤,示例为填写验证码
  await page.fill('#2fa-code', '用户输入或自动获取的验证码');
  await page.click('#verify-2fa');

  // 等待登录完成,确保进入登录后的页面
  await page.waitForURL('/dashboard');

  // 保存新的认证状态到auth.json
  await context.storageState({ path: authFile });
  await browser.close();
}

export default globalSetup;
  1. 保持playwright.config.ts的配置不变,依然将setup项目作为其他项目的依赖:
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  projects: [
    {
      name: 'setup',
      testMatch: /global-setup\.ts/,
    },
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'], storageState: 'auth.json' },
      dependencies: ['setup'],
    },
    // 其他项目...
  ],
});

关键细节说明

  • 会话校验逻辑调整:你需要根据自己的应用修改isLoggedIn的判断条件——可以检查登录后专属的页面元素、页面URL是否为登录页,或者调用后端校验接口返回的状态码。
  • 2FA自动化适配:如果你的2FA支持自动拉取验证码(比如从邮件、内部接口获取),可以把这部分逻辑写入代码实现全自动化;如果必须手动输入,保持headless: false即可,仅在会话失效时弹出浏览器让你输入验证码。
  • 性能优化:会话校验只是快速访问一个页面做状态判断,耗时极短,远比重走完整登录流程高效。

你的疑问解答

完全没必要每次运行测试都重新执行2FA登录,只要会话还在有效期内,就可以直接复用auth.json里的状态。上面的方案就是帮你实现这个逻辑——仅在会话失效时才触发完整的登录+2FA流程,平时直接复用已有会话,节省大量测试时间。

内容的提问来源于stack exchange,提问作者ntr-make

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:43:13