import { test, expect } from '@playwright/test'; import { LoginPage } from './pages/LoginPage'; import { DashboardPage } from './pages/DashboardPage'; import { UserManagementPage } from './pages/UserManagementPage'; import { TestDataManager } from './utils/testDataManager'; import { TestHelper } from './utils/testHelper'; test.describe('用户管理异常场景测试', () => { let loginPage: LoginPage; let dashboardPage: DashboardPage; let userManagementPage: UserManagementPage; test.beforeEach(async ({ page }) => { loginPage = new LoginPage(page); dashboardPage = new DashboardPage(page); userManagementPage = new UserManagementPage(page); await loginPage.goto(); await loginPage.login('admin', 'admin123'); }); test('创建用户 - 重复用户名', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('尝试创建重复用户名的用户', async () => { await userManagementPage.clickCreateUser(); await TestHelper.waitForElementVisible(page, '.el-dialog'); const userData = { username: 'admin', nickname: '重复用户', email: 'duplicate@example.com', phone: '13800138000', password: 'Test123!@#', confirmPassword: 'Test123!@#', }; await userManagementPage.fillUserForm(userData); await userManagementPage.submitForm(); }); await test.step('验证错误消息', async () => { await TestHelper.waitForErrorMessage(page); const errorMessage = await TestHelper.getElementText(page, '.el-message__content'); expect(errorMessage).toContain('用户名已存在'); }); }); test('创建用户 - 无效邮箱格式', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('尝试创建无效邮箱的用户', async () => { await userManagementPage.clickCreateUser(); await TestHelper.waitForElementVisible(page, '.el-dialog'); const userData = { username: `testuser_${Date.now()}`, nickname: '测试用户', email: 'invalid-email', phone: '13800138000', password: 'Test123!@#', confirmPassword: 'Test123!@#', }; await userManagementPage.fillUserForm(userData); await userManagementPage.submitForm(); }); await test.step('验证表单验证错误', async () => { const emailInput = page.locator('input[name="email"]'); const hasError = await emailInput.evaluate(el => el.classList.contains('is-error')); expect(hasError).toBeTruthy(); }); }); test('创建用户 - 密码强度不足', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('尝试创建密码强度不足的用户', async () => { await userManagementPage.clickCreateUser(); await TestHelper.waitForElementVisible(page, '.el-dialog'); const userData = { username: `testuser_${Date.now()}`, nickname: '测试用户', email: 'test@example.com', phone: '13800138000', password: '123', confirmPassword: '123', }; await userManagementPage.fillUserForm(userData); await userManagementPage.submitForm(); }); await test.step('验证密码强度错误', async () => { const passwordInput = page.locator('input[name="password"]'); const hasError = await passwordInput.evaluate(el => el.classList.contains('is-error')); expect(hasError).toBeTruthy(); }); }); test('创建用户 - 密码不匹配', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('尝试创建密码不匹配的用户', async () => { await userManagementPage.clickCreateUser(); await TestHelper.waitForElementVisible(page, '.el-dialog'); const userData = { username: `testuser_${Date.now()}`, nickname: '测试用户', email: 'test@example.com', phone: '13800138000', password: 'Test123!@#', confirmPassword: 'DifferentPassword', }; await userManagementPage.fillUserForm(userData); await userManagementPage.submitForm(); }); await test.step('验证密码不匹配错误', async () => { const confirmPasswordInput = page.locator('input[name="confirmPassword"]'); const hasError = await confirmPasswordInput.evaluate(el => el.classList.contains('is-error')); expect(hasError).toBeTruthy(); }); }); test('创建用户 - 缺少必填字段', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('尝试创建缺少必填字段的用户', async () => { await userManagementPage.clickCreateUser(); await TestHelper.waitForElementVisible(page, '.el-dialog'); const userData = { username: '', nickname: '', email: '', phone: '', password: '', confirmPassword: '', }; await userManagementPage.fillUserForm(userData); await userManagementPage.submitForm(); }); await test.step('验证必填字段验证', async () => { const submitButton = page.locator('.el-dialog__footer button[type="submit"]'); const isDisabled = await submitButton.evaluate(el => el.disabled); expect(isDisabled).toBeTruthy(); }); }); test('创建用户 - 无效手机号格式', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('尝试创建无效手机号的用户', async () => { await userManagementPage.clickCreateUser(); await TestHelper.waitForElementVisible(page, '.el-dialog'); const userData = { username: `testuser_${Date.now()}`, nickname: '测试用户', email: 'test@example.com', phone: '123', password: 'Test123!@#', confirmPassword: 'Test123!@#', }; await userManagementPage.fillUserForm(userData); await userManagementPage.submitForm(); }); await test.step('验证手机号格式错误', async () => { const phoneInput = page.locator('input[name="phone"]'); const hasError = await phoneInput.evaluate(el => el.classList.contains('is-error')); expect(hasError).toBeTruthy(); }); }); test('编辑用户 - 不存在的用户ID', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('尝试编辑不存在的用户', async () => { await page.goto('/users/999999/edit'); await TestHelper.waitForPageLoad(page); }); await test.step('验证404错误或重定向', async () => { const currentUrl = page.url(); expect(currentUrl).toMatch(/(404|users)/); }); }); test('删除用户 - 不存在的用户ID', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('尝试删除不存在的用户', async () => { const response = await page.request.delete('http://localhost:8084/api/users/999999'); expect(response.status()).toBe(404); }); }); test('搜索用户 - 空搜索条件', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('执行空搜索', async () => { await userManagementPage.search(''); await TestHelper.waitForPageLoad(page); }); await test.step('验证显示所有用户', async () => { const userCount = await userManagementPage.getUserCount(); expect(userCount).toBeGreaterThan(0); }); }); test('搜索用户 - 不存在的用户名', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('搜索不存在的用户', async () => { await userManagementPage.search('nonexistentuser123456'); await TestHelper.waitForPageLoad(page); }); await test.step('验证无结果', async () => { const userCount = await userManagementPage.getUserCount(); expect(userCount).toBe(0); }); }); test('批量删除 - 未选择用户', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('尝试批量删除未选择的用户', async () => { await page.click('button:has-text("批量删除")'); }); await test.step('验证提示消息', async () => { await TestHelper.waitForErrorMessage(page); }); }); test('导出用户 - 无数据', async ({ page, request }) => { await test.step('清空用户数据', async () => { const response = await request.delete('http://localhost:8084/api/users/test/cleanup'); expect(response.ok()).toBeTruthy(); }); await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('尝试导出空数据', async () => { const downloadPromise = page.waitForEvent('download'); await page.click('button:has-text("导出")'); const download = await downloadPromise; expect(download.suggestedFilename()).toMatch(/users.*\.xlsx/); }); }); test('分页 - 超出范围页码', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('尝试访问超出范围的页码', async () => { await page.goto('/users?page=999999'); await TestHelper.waitForPageLoad(page); }); await test.step('验证显示最后一页或第一页', async () => { const currentPage = await userManagementPage.getCurrentPage(); expect(currentPage).toBeTruthy(); }); }); test('网络错误 - 创建用户时断网', async ({ page }) => { await test.step('导航到用户管理页面', async () => { await dashboardPage.navigateToUserManagement(); await TestHelper.waitForPageLoad(page); }); await test.step('模拟网络错误', async () => { await page.route('**/api/users', route => route.abort('failed')); }); await test.step('尝试创建用户', async () => { await userManagementPage.clickCreateUser(); await TestHelper.waitForElementVisible(page, '.el-dialog'); const userData = { username: `testuser_${Date.now()}`, nickname: '测试用户', email: 'test@example.com', phone: '13800138000', password: 'Test123!@#', confirmPassword: 'Test123!@#', }; await userManagementPage.fillUserForm(userData); await userManagementPage.submitForm(); }); await test.step('验证网络错误提示', async () => { await TestHelper.waitForErrorMessage(page); }); }); });