# 用户管理和角色管理测试修复实现计划

> **面向 AI 代理的工作者：** 必需子技能：使用 superpowers:subagent-driven-development（推荐）或 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框（`- [ ]`）语法来跟踪进度。

**目标：** 修复用户管理和角色管理测试，使其能够正确展开系统管理菜单后再点击子菜单项，将测试通过率从80%提升到100%

**架构：** 采用与系统配置测试相同的策略：先展开父菜单，再点击子菜单项。修改测试脚本中的用户管理和角色管理测试代码，增加展开系统管理菜单的步骤。

**技术栈：** Playwright, JavaScript, Element Plus

---

## 文件结构

### 测试脚本文件
- **修改**: `novalon-manage-web/user-journey-test.js`
  - **职责**: 修复用户管理和角色管理测试，增加展开菜单的步骤

---

## 任务 1：修改用户管理测试

**文件：**
- 修改：`novalon-manage-web/user-journey-test.js:140-180`

- [ ] **步骤 1：修改用户管理测试代码**

将以下代码：

```javascript
try {
  const userMenuSelectors = [
    '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('未找到用户管理菜单');
  }
} catch (error) {
  logTest('导航到用户管理页面', false, error.message);
}
```

替换为：

```javascript
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：验证修改**

运行：`cat novalon-manage-web/user-journey-test.js | grep -A 30 "阶段2: 用户管理测试"`
预期：显示修改后的代码，包含展开系统管理菜单的逻辑

---

## 任务 2：修改角色管理测试

**文件：**
- 修改：`novalon-manage-web/user-journey-test.js:210-240`

- [ ] **步骤 1：修改角色管理测试代码**

将以下代码：

```javascript
try {
  const roleMenuSelectors = [
    '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('未找到角色管理菜单');
  }
} catch (error) {
  logTest('导航到角色管理页面', false, error.message);
}
```

替换为：

```javascript
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);
}
```

- [ ] **步骤 2：验证修改**

运行：`cat novalon-manage-web/user-journey-test.js | grep -A 30 "阶段3: 角色管理测试"`
预期：显示修改后的代码，包含展开系统管理菜单的逻辑

---

## 任务 3：运行测试验证

**文件：**
- 无文件修改

- [ ] **步骤 1：运行User Journey测试**

运行：`cd novalon-manage-web && node user-journey-test.js`
预期：
- 总测试数: 10
- 通过: 10
- 失败: 0
- 通过率: 100%

- [ ] **步骤 2：检查测试报告**

运行：`cat /tmp/user-journey-report.json`
预期：JSON格式的测试报告，所有测试状态为"passed"

---

## 任务 4：提交代码

**文件：**
- 无文件修改

- [ ] **步骤 1：查看修改**

运行：`git diff novalon-manage-web/user-journey-test.js`
预期：显示用户管理和角色管理测试的修改内容

- [ ] **步骤 2：提交修改**

```bash
git add novalon-manage-web/user-journey-test.js
git commit -m "test: 修复用户管理和角色管理测试

- 增加展开系统管理菜单的步骤
- 修复菜单元素不可见导致的测试失败
- 测试通过率从80%提升到100%"
```

预期：提交成功，显示commit hash

- [ ] **步骤 3：验证提交**

运行：`git log --oneline -1`
预期：显示最新的commit信息

---

## 验收标准

### 功能验收

- ✅ 用户管理测试能够成功导航到用户管理页面
- ✅ 角色管理测试能够成功导航到角色管理页面
- ✅ 测试通过率达到100%（10/10）

### 质量验收

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

### 提交验收

- ✅ Git提交信息清晰
- ✅ 代码变更符合预期
