Playwright测试:验证auth.json有效性,避免重复执行setup依赖
解决方案:让Playwright仅在认证会话失效时重新执行2FA登录
核心思路是改造你的global-setup.ts文件,让它先尝试复用已有的auth.json会话,通过访问一个需要登录权限的页面来校验会话有效性,只有当会话失效(比如跳转到登录页、返回未授权状态)时,才重新执行2FA登录流程。
具体实现步骤
- 修改
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;
- 保持
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
相关产品推荐
相关产品推荐

