/** * 登录页面测试 * 覆盖: 页面渲染 / 正确登录 / 错误密码 / 空字段校验 / 跳转 */ import { test, expect } from '@playwright/test'; // 登录测试不使用全局 auth,独立登录 test.use({ storageState: { cookies: [], origins: [] } }); test.describe('登录页面', () => { test.beforeEach(async ({ page }) => { await page.goto('/login'); }); test('页面正确渲染', async ({ page }) => { // 标题 await expect(page.locator('.login-title')).toContainText('天津硕博霖 CRM 系统'); await expect(page.locator('.login-subtitle')).toContainText('v2.0'); // 表单元素 await expect(page.getByPlaceholder('用户名')).toBeVisible(); await expect(page.getByPlaceholder('密码')).toBeVisible(); await expect(page.getByRole('button', { name: '登 录' })).toBeVisible(); }); test('正确账密登录后跳转工作台', async ({ page }) => { await page.getByPlaceholder('用户名').fill('admin'); await page.getByPlaceholder('密码').fill('123456'); await page.getByRole('button', { name: '登 录' }).click(); // 等待跳转到首页 await page.waitForURL('/', { timeout: 10000 }); // 侧边栏菜单应出现 await expect(page.locator('.el-menu--vertical').first()).toBeVisible({ timeout: 5000 }); }); test('错误密码弹出错误提示', async ({ page }) => { await page.getByPlaceholder('用户名').fill('admin'); await page.getByPlaceholder('密码').fill('wrong123'); await page.getByRole('button', { name: '登 录' }).click(); // Element Plus 的 ElMessage 错误提示 await expect(page.locator('.el-message--error')).toBeVisible({ timeout: 5000 }); }); test('空字段显示校验提示', async ({ page }) => { // 直接点登录 await page.getByRole('button', { name: '登 录' }).click(); // el-form 校验提示 await expect(page.locator('.el-form-item__error')).toHaveCount(2); await expect(page.locator('.el-form-item__error').first()).toContainText('请输入用户名'); }); test('密码少于6位提示校验', async ({ page }) => { await page.getByPlaceholder('用户名').fill('admin'); await page.getByPlaceholder('密码').fill('123'); await page.getByRole('button', { name: '登 录' }).click(); await expect(page.locator('.el-form-item__error')).toContainText('密码至少 6 位'); }); test('未登录访问首页被重定向到登录页', async ({ page }) => { await page.goto('/'); await page.waitForURL(/\/login/); await expect(page.locator('.login-title')).toBeVisible(); }); });