From b34c09bdaf63c519617053816ff3d88e081e0559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Tue, 7 Apr 2026 11:47:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(e2e):=20=E4=BF=AE=E5=A4=8D=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=99=BB=E5=BD=95=E7=8A=B6=E6=80=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - 测试用例之间没有共享登录状态 - 每个测试都创建新的浏览器上下文 - 导致后续测试无法访问已登录的页面 修复: - 添加auth.setup.ts文件保存登录状态 - 在playwright.config.ts中配置setup项目 - 配置storageState恢复登录状态 - 移除重复的登录测试 - 添加页面加载等待 优势: - 测试之间共享登录状态 - 减少重复登录操作 - 提高测试执行效率 - 更符合实际使用场景 --- novalon-manage-web/e2e/auth.setup.ts | 16 +++++++++ novalon-manage-web/e2e/helpers/auth.ts | 23 ++++++++++++ .../journeys/admin-complete-workflow.spec.ts | 35 +------------------ novalon-manage-web/playwright.config.ts | 6 ++++ 4 files changed, 46 insertions(+), 34 deletions(-) create mode 100644 novalon-manage-web/e2e/auth.setup.ts create mode 100644 novalon-manage-web/e2e/helpers/auth.ts diff --git a/novalon-manage-web/e2e/auth.setup.ts b/novalon-manage-web/e2e/auth.setup.ts new file mode 100644 index 0000000..a89c4d2 --- /dev/null +++ b/novalon-manage-web/e2e/auth.setup.ts @@ -0,0 +1,16 @@ +import { test as setup } from '@playwright/test'; + +const authFile = 'playwright/.auth/user.json'; + +setup('authenticate', async ({ page }) => { + await page.goto('/login'); + await page.waitForLoadState('networkidle'); + + await page.locator('input[placeholder*="用户名"]').fill('admin'); + await page.locator('input[placeholder*="密码"]').fill('admin123'); + await page.locator('button:has-text("登录")').click(); + + await page.waitForURL('**/dashboard', { timeout: 30000 }); + + await page.context().storageState({ path: authFile }); +}); diff --git a/novalon-manage-web/e2e/helpers/auth.ts b/novalon-manage-web/e2e/helpers/auth.ts new file mode 100644 index 0000000..ad323fa --- /dev/null +++ b/novalon-manage-web/e2e/helpers/auth.ts @@ -0,0 +1,23 @@ +import { Page } from '@playwright/test'; + +export async function loginAsAdmin(page: Page) { + await page.goto('/login'); + await page.waitForLoadState('networkidle'); + + await page.locator('input[placeholder*="用户名"]').fill('admin'); + await page.locator('input[placeholder*="密码"]').fill('admin123'); + await page.locator('button:has-text("登录")').click(); + + await page.waitForURL('**/dashboard', { timeout: 30000 }); + + const token = await page.evaluate(() => { + return localStorage.getItem('token') || ''; + }); + + return token; +} + +export async function saveAuthState(page: Page) { + const storage = await page.context().storageState(); + return storage; +} diff --git a/novalon-manage-web/e2e/journeys/admin-complete-workflow.spec.ts b/novalon-manage-web/e2e/journeys/admin-complete-workflow.spec.ts index 542fcb8..2576f75 100644 --- a/novalon-manage-web/e2e/journeys/admin-complete-workflow.spec.ts +++ b/novalon-manage-web/e2e/journeys/admin-complete-workflow.spec.ts @@ -8,43 +8,10 @@ test.describe('管理员完整工作流', () => { const roleKey = `test_role_${timestamp}`; const username = `testuser_${timestamp}`; - test('管理员登录', async ({ page }) => { - await test.step('访问登录页面', async () => { - await page.goto('/login'); - await expect(page).toHaveTitle(/登录/); - }); - - await test.step('等待页面加载完成', async () => { - await page.waitForLoadState('networkidle'); - await expect(page.locator('input[placeholder*="用户名"]')).toBeVisible({ timeout: 10000 }); - }); - - await test.step('输入管理员凭证', async () => { - const usernameInput = page.locator('input[placeholder*="用户名"]'); - const passwordInput = page.locator('input[placeholder*="密码"]'); - - await usernameInput.waitFor({ state: 'visible' }); - await usernameInput.fill('admin'); - - await passwordInput.waitFor({ state: 'visible' }); - await passwordInput.fill('admin123'); - }); - - await test.step('点击登录按钮', async () => { - const loginButton = page.locator('button:has-text("登录")'); - await loginButton.waitFor({ state: 'visible' }); - await loginButton.click(); - }); - - await test.step('验证登录成功', async () => { - await page.waitForURL('**/dashboard', { timeout: 30000 }); - await expect(page).toHaveURL(/.*dashboard/); - }); - }); - test('创建角色并分配权限', async ({ page }) => { await test.step('导航到角色管理', async () => { await page.goto('/dashboard'); + await page.waitForLoadState('networkidle'); await page.locator('text=系统管理').click(); await page.locator('text=角色管理').click(); await expect(page).toHaveURL(/.*roles/); diff --git a/novalon-manage-web/playwright.config.ts b/novalon-manage-web/playwright.config.ts index 75f906d..cb73140 100644 --- a/novalon-manage-web/playwright.config.ts +++ b/novalon-manage-web/playwright.config.ts @@ -53,12 +53,18 @@ export default defineConfig({ }, projects: [ + { + name: 'setup', + testMatch: /.*\.setup\.ts/, + }, { name: 'journeys', testDir: './e2e/journeys', testMatch: /.*\.spec\.ts/, + dependencies: ['setup'], use: { ...devices['Desktop Chrome'], + storageState: 'playwright/.auth/user.json', launchOptions: { args: [ '--disable-blink-features=AutomationControlled',