# 用户管理和角色管理测试修复设计文档

**日期**: 2026-04-15  
**作者**: 张翔  
**版本**: 1.0

## 1. 背景与问题

### 1.1 问题背景

在User Journey测试过程中，发现以下两个测试失败：
1. **导航到用户管理页面**: 测试超时失败
2. **导航到角色管理页面**: 测试超时失败

### 1.2 问题根因分析

**根本原因**: 用户管理和角色管理是"系统管理"菜单下的二级菜单项。在Element Plus的菜单组件中，当父菜单处于折叠状态时，子菜单项是不可见的。测试脚本直接尝试点击这些不可见的菜单项，导致超时失败。

**错误信息**:
```
locator.click: Timeout 30000ms exceeded.
Call log:
  - waiting for locator('text=用户管理').first()
    - locator resolved to <span>用户管理</span>
  - attempting click action
    - waiting for element to be visible, enabled and stable
      - element is not visible
```

**对比分析**:
- ✅ 系统配置测试：正确地先展开了系统管理菜单，测试通过
- ❌ 用户管理测试：直接尝试点击菜单项，测试失败
- ❌ 角色管理测试：直接尝试点击菜单项，测试失败

## 2. 解决方案设计

### 2.1 设计目标

修复用户管理和角色管理测试，使其能够正确展开系统管理菜单后再点击子菜单项，提高测试通过率。

### 2.2 技术方案

采用与系统配置测试相同的策略：先展开父菜单，再点击子菜单项。

### 2.3 实现细节

#### 2.3.1 修改用户管理测试

**文件**: `novalon-manage-web/user-journey-test.js`

**修改位置**: 第140-180行

**修改内容**:
```javascript
// 阶段2: 用户管理测试
console.log('\n📋 阶段2: 用户管理测试');
console.log('=====================================');

try {
  // 首先展开系统管理菜单（如果是折叠状态）
  const systemMenuSelector = '.el-sub-menu:has-text("系统管理")';
  const systemMenuElement = page.locator(systemMenuSelector).first();
  
  if (await systemMenuElement.count() > 0) {
    // 点击展开系统管理菜单
    await systemMenuElement.click();
    await page.waitForTimeout(500);
    
    // 然后点击用户管理菜单项
    const userMenuSelectors = [
      '.el-menu-item:has-text("用户管理")',
      'text=用户管理',
      'text=用户',
      '[data-menu="user"]',
      'a[href*="user"]'
    ];
    
    let navigated = false;
    for (const selector of userMenuSelectors) {
      const element = page.locator(selector).first();
      if (await element.count() > 0) {
        await element.click();
        navigated = true;
        break;
      }
    }
    
    if (navigated) {
      await page.waitForTimeout(1000);
      await captureStep(page, '04-user-management');
      logTest('导航到用户管理页面', true);
    } else {
      throw new Error('未找到用户管理菜单');
    }
  } else {
    throw new Error('未找到系统管理菜单');
  }
} catch (error) {
  logTest('导航到用户管理页面', false, error.message);
}
```

#### 2.3.2 修改角色管理测试

**文件**: `novalon-manage-web/user-journey-test.js`

**修改位置**: 第210-240行

**修改内容**:
```javascript
// ==================== 阶段3: 角色管理 ====================
console.log('\n📋 阶段3: 角色管理测试');
console.log('=====================================');

try {
  // 首先展开系统管理菜单（如果是折叠状态）
  const systemMenuSelector = '.el-sub-menu:has-text("系统管理")';
  const systemMenuElement = page.locator(systemMenuSelector).first();
  
  if (await systemMenuElement.count() > 0) {
    // 点击展开系统管理菜单
    await systemMenuElement.click();
    await page.waitForTimeout(500);
    
    // 然后点击角色管理菜单项
    const roleMenuSelectors = [
      '.el-menu-item:has-text("角色管理")',
      'text=角色管理',
      'text=角色',
      '[data-menu="role"]',
      'a[href*="role"]'
    ];
    
    let navigated = false;
    for (const selector of roleMenuSelectors) {
      const element = page.locator(selector).first();
      if (await element.count() > 0) {
        await element.click();
        navigated = true;
        break;
      }
    }
    
    if (navigated) {
      await page.waitForTimeout(1000);
      await captureStep(page, '05-role-management');
      logTest('导航到角色管理页面', true);
    } else {
      throw new Error('未找到角色管理菜单');
    }
  } else {
    throw new Error('未找到系统管理菜单');
  }
} catch (error) {
  logTest('导航到角色管理页面', false, error.message);
}
```

## 3. 验收标准

### 3.1 功能验收

- ✅ 用户管理测试能够成功导航到用户管理页面
- ✅ 角色管理测试能够成功导航到角色管理页面
- ✅ 测试通过率从80%提升到100%

### 3.2 质量验收

- ✅ 测试代码与系统配置测试保持一致的风格
- ✅ 测试代码包含清晰的注释
- ✅ 测试代码包含错误处理

### 3.3 测试验收

- ✅ User Journey测试全部通过（10/10）
- ✅ 新增Playwright测试全部通过（3/3）
- ✅ 测试报告生成成功

## 4. 影响范围

### 4.1 受影响的文件

- `novalon-manage-web/user-journey-test.js`: 修改用户管理和角色管理测试代码

### 4.2 不受影响的部分

- 前端代码：不修改
- 后端代码：不修改
- 数据库：不修改
- 其他测试：不修改

## 5. 风险评估

### 5.1 技术风险

- **风险等级**: 低
- **风险描述**: 修改仅涉及测试代码，不影响生产代码
- **缓解措施**: 修改后立即运行测试验证

### 5.2 业务风险

- **风险等级**: 无
- **风险描述**: 不涉及业务逻辑修改

## 6. 后续优化建议

1. **统一测试策略**: 将"先展开父菜单，再点击子菜单项"的策略应用到所有二级菜单测试中
2. **封装公共方法**: 将展开菜单的逻辑封装为公共方法，减少代码重复
3. **增加等待策略**: 使用更智能的等待策略（如等待元素可见）替代固定的timeout

## 7. 实施计划

1. 修改用户管理测试代码
2. 修改角色管理测试代码
3. 运行User Journey测试验证
4. 提交代码

**预计工作量**: 30分钟
