fix(e2e): 修复strict mode violation和登出按钮定位问题

问题:
- '操作日志'文本匹配到2个元素(菜单项和页面标题)
- table定位器匹配到2个元素(header和body)
- .el-dropdown-link元素找不到导致登出失败

修复:
- 使用menuitem角色定位菜单项
- 使用.el-table类定位表格容器
- 使用button:has-text('admin')定位用户下拉菜单
- 添加页面加载等待和超时设置

优势:
- 避免strict mode violation错误
- 提高定位器精确性
- 确保登出功能正常工作
This commit is contained in:
张翔
2026-04-07 13:42:11 +08:00
parent 5938c70b63
commit b835c27750
3 changed files with 24 additions and 12 deletions
@@ -72,9 +72,14 @@ test.describe('管理员完整工作流', () => {
test('验证新用户登录', async ({ page }) => {
await test.step('管理员登出', async () => {
await page.goto('/dashboard');
await page.locator('.el-dropdown-link').click();
await page.waitForLoadState('networkidle');
const dropdownButton = page.locator('button:has-text("admin")').first();
await dropdownButton.click();
await page.waitForTimeout(500);
await page.locator('text=退出登录').click();
await page.waitForURL(/.*login/);
await page.waitForURL(/.*login/, { timeout: 10000 });
});
await test.step('新用户登录', async () => {
@@ -94,8 +99,15 @@ test.describe('管理员完整工作流', () => {
test('清理测试数据', async ({ page }) => {
await test.step('管理员重新登录', async () => {
await page.goto('/dashboard');
await page.locator('.el-dropdown-link').click();
await page.locator('text=退出登录').click();
await page.waitForLoadState('networkidle');
const dropdownButton = page.locator('button:has-text("admin")').first();
if (await dropdownButton.isVisible()) {
await dropdownButton.click();
await page.waitForTimeout(500);
await page.locator('text=退出登录').click();
}
await page.goto('/login');
await page.locator('input[placeholder*="用户名"]').fill('admin');
await page.locator('input[placeholder*="密码"]').fill('admin123');
@@ -24,12 +24,12 @@ test.describe('审计工作流', () => {
await page.locator('text=审计中心').click();
await page.waitForTimeout(1000);
await page.locator('text=操作日志').click();
await page.locator('menuitem:has-text("操作日志")').click();
await page.waitForLoadState('networkidle');
await page.waitForTimeout(1000);
await expect(page).toHaveURL(/.*oplog/, { timeout: 10000 });
await expect(page.locator('table')).toBeVisible({ timeout: 10000 });
await expect(page.locator('.el-table')).toBeVisible({ timeout: 10000 });
});
await test.step('验证操作日志记录', async () => {
@@ -47,7 +47,7 @@ test.describe('审计工作流', () => {
await page.locator('text=审计中心').click();
await page.waitForTimeout(1000);
await page.locator('text=登录日志').click();
await page.locator('menuitem:has-text("登录日志")').click();
await page.waitForLoadState('networkidle');
await page.waitForTimeout(1000);
@@ -55,8 +55,8 @@ test.describe('审计工作流', () => {
});
await test.step('验证登录日志显示', async () => {
await expect(page.locator('table')).toBeVisible();
const logContent = await page.locator('table').textContent();
await expect(page.locator('.el-table')).toBeVisible({ timeout: 10000 });
const logContent = await page.locator('.el-table').textContent();
expect(logContent).toContain('admin');
});
});
@@ -69,11 +69,11 @@ test.describe('审计工作流', () => {
await page.locator('text=审计中心').click();
await page.waitForTimeout(1000);
await page.locator('text=操作日志').click();
await page.locator('menuitem:has-text("操作日志")').click();
await page.waitForLoadState('networkidle');
await page.waitForTimeout(1000);
await expect(page.locator('table')).toBeVisible({ timeout: 10000 });
await expect(page.locator('.el-table')).toBeVisible({ timeout: 10000 });
});
await test.step('按模块筛选', async () => {
@@ -14,7 +14,7 @@
},
{
"name": "token",
"value": "eyJhbGciOiJIUzM4NCJ9.eyJyb2xlcyI6W10sInVzZXJJZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInN1YiI6ImFkbWluIiwiaWF0IjoxNzc1NTM4NzgxLCJleHAiOjE3NzU2MjUxODF9.-YWMX8Fdyt8-W0rppNP5QT6t2KI2HMj95LTijW209EBAav4u1lNuZZvBLUp0mbhT"
"value": "eyJhbGciOiJIUzM4NCJ9.eyJyb2xlcyI6W10sInVzZXJJZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInN1YiI6ImFkbWluIiwiaWF0IjoxNzc1NTQwMTQ4LCJleHAiOjE3NzU2MjY1NDh9.4i6qWxQjh--zr9CD8HDtM2ewxuEd4dITICiclx9ukcbFGWwu9WhDfhTSC4vWycAQ"
}
]
}