import { test, expect } from '@playwright/test'; test.describe('用户认证 E2E 测试', () => { test.beforeEach(async ({ page }) => { await page.goto('/login'); }); test('成功登录流程', async ({ page }) => { await expect(page).toHaveTitle(/登录/); await page.fill('input[placeholder*="用户名"]', 'admin'); await page.fill('input[type="password"]', 'admin123'); await page.click('button:has-text("登录")'); await page.waitForURL('**/dashboard'); await expect(page.locator('.user-info')).toContainText('admin'); }); test('登录失败 - 无效凭证', async ({ page }) => { await page.fill('input[placeholder*="用户名"]', 'invalid'); await page.fill('input[type="password"]', 'invalid'); await page.click('button:has-text("登录")'); await expect(page.locator('.error-message')).toBeVisible(); await expect(page.locator('.error-message')).toContainText('用户名或密码错误'); }); test('登录失败 - 缺少必填字段', async ({ page }) => { await page.fill('input[name="username"]', 'admin'); await page.click('button[type="submit"]'); await expect(page.locator('.error-message')).toBeVisible(); }); test('登出流程', async ({ page }) => { await page.fill('input[name="username"]', 'admin'); await page.fill('input[name="password"]', 'admin123'); await page.click('button[type="submit"]'); await page.waitForURL('**/'); await page.click('text=登出'); await page.waitForURL('**/login'); await expect(page).toHaveTitle(/登录/); }); });