# 执行计划 - 登录模块测试用例优化

## 一、执行概述

### 1.1 执行目标
优化登录模块测试用例，解决超时失败问题，提高测试通过率至90%以上。

### 1.2 执行范围
- 优化8个登录模块测试用例
- 修改playwright_executor.py代码
- 验证优化效果

### 1.3 执行时间
- 开始时间：2026-07-12
- 预计工期：3.5小时
- 完成时间：2026-07-12

---

## 二、执行任务分解

### 任务1：优化"登录功能-正常登录"用例 ⭐高优先级

**执行内容：**
- 删除步骤8的URL断言
- 修改步骤7为元素等待
- 确保config中auto_login=false

**详细步骤：**
```python
# 原步骤（8步）：
步骤1: 打开登录页面 (navigate)
步骤2: 等待登录表单加载 (wait, 10秒)
步骤3: 输入用户名 (fill)
步骤4: 输入密码 (fill)
步骤5: 输入验证码 (fill)
步骤6: 点击登录按钮 (click)
步骤7: 等待页面跳转 (wait, 5秒)
步骤8: 验证登录成功 (assert url) ❌ 删除此步骤

# 优化后（7步）：
步骤1: 打开登录页面 (navigate)
步骤2: 等待登录表单加载 (wait, 10秒)
步骤3: 输入用户名 (fill)
步骤4: 输入密码 (fill)
步骤5: 输入验证码 (fill)
步骤6: 点击登录按钮 (click)
步骤7: 等待页面跳转完成 (wait "text=统一管理平台", 10秒) ✅ 改用元素等待
```

**执行方式：**
- 使用API或脚本更新用例

**验收标准：**
- ✅ 用例只有7个步骤
- ✅ 最后一步是元素等待
- ✅ config中auto_login=false
- ✅ 执行不超时，结果准确

**预计耗时：** 30分钟

---

### 任务2：优化"登录功能-页面访问验证"用例 ⭐高优先级

**执行内容：**
- 增加显式等待步骤
- 优化元素选择器
- 确保config中timeout=60000

**详细步骤：**
```python
# 优化后（3步）：
步骤1: 打开登录页面 (navigate, timeout=60秒)
步骤2: 等待页面加载 (wait "body", 10秒)  ✅ 新增等待步骤
步骤3: 验证页面标题 (assert title)
```

**执行方式：**
- 使用API更新用例

**验收标准：**
- ✅ 有显式等待步骤
- ✅ config中timeout=60000
- ✅ 执行通过

**预计耗时：** 20分钟

---

### 任务3：优化其他登录用例 ⭐中优先级

**执行内容：**
- 统一超时配置为60秒
- 优化选择器，避免使用nth-of-type
- 确保所有用例auto_login=false

**涉及用例：**
1. 登录功能-用户名为空（5步）
2. 登录功能-密码为空（5步）
3. 登录功能-错误密码（7步）
4. 登录功能-记住密码勾选框（4步）
5. 登录功能-忘记密码链接（3步）
6. 登录功能-立即注册链接（3步）

**选择器优化清单：**
```python
# 优化前 → 优化后
"input[placeholder*='用户']" → "input[type='text']"
"input[type='text']:nth-of-type(3)" → "input[type='text']" (最后一个)
"text=忘记密码" → "text=忘记密码" (保持)
```

**执行方式：**
- 批量更新脚本

**验收标准：**
- ✅ 所有用例config统一
- ✅ 选择器稳定
- ✅ 执行通过

**预计耗时：** 40分钟

---

### 任务4：修改playwright_executor.py代码 ⭐高优先级

**执行内容：**
- 改进URL断言逻辑，添加等待机制
- 添加选择器降级策略
- 优化错误提示

**代码修改点：**

**修改1：URL断言添加等待**
```python
# 文件：backend/app/executors/playwright_executor.py
# 行号：709-712

# 原代码：
elif assert_type == "url":
    current_url = self._page.url
    if expected_value not in current_url:
        raise AssertionError(f"断言失败: 当前URL '{current_url}' 不包含 '{expected_value}'")

# 优化后：
elif assert_type == "url":
    # 等待URL变化（最多等待5秒）
    max_wait = 5000
    start_time = datetime.now()
    while (datetime.now() - start_time).total_seconds() * 1000 < max_wait:
        current_url = self._page.url
        if expected_value in current_url:
            break
        self._page.wait_for_timeout(500)
    else:
        current_url = self._page.url
        if expected_value not in current_url:
            raise AssertionError(f"断言失败: 当前URL '{current_url}' 不包含 '{expected_value}'")
```

**修改2：添加选择器降级策略**
```python
# 在 _do_click 方法中添加降级逻辑

def _do_click(self, params: dict) -> None:
    selector = params.get("selector", "")
    if not selector:
        raise ValueError("选择器不能为空")
    
    # 主选择器
    try:
        self._page.wait_for_selector(selector, state="visible", timeout=5000)
        self._page.click(selector, timeout=5000)
        return
    except Exception:
        pass
    
    # 降级：尝试在iframe中查找
    for frame in self._page.frames:
        if frame != self._page.main_frame:
            try:
                frame.wait_for_selector(selector, state="visible", timeout=3000)
                frame.click(selector, timeout=5000)
                logger.debug(f"在iframe中点击成功: {selector}")
                return
            except Exception:
                continue
    
    raise Exception(f"无法点击元素: {selector}")
```

**验收标准：**
- ✅ URL断言有等待机制
- ✅ 选择器支持降级
- ✅ 错误提示清晰

**预计耗时：** 30分钟

---

### 任务5：测试验证 ⭐高优先级

**执行内容：**
- 执行所有优化后的登录用例
- 记录执行结果
- 分析失败原因（如有）

**验证步骤：**
1. 在前端界面选择所有登录用例
2. 点击"执行选中"
3. 观察浏览器执行过程
4. 查看执行结果报告
5. 连续执行3次，统计通过率

**验证清单：**
```
[ ] 用例1：登录功能-正常登录 - 通过/失败
[ ] 用例2：登录功能-页面访问验证 - 通过/失败
[ ] 用例3：登录功能-用户名为空 - 通过/失败
[ ] 用例4：登录功能-密码为空 - 通过/失败
[ ] 用例5：登录功能-错误密码 - 通过/失败
[ ] 用例6：登录功能-记住密码勾选框 - 通过/失败
[ ] 用例7：登录功能-忘记密码链接 - 通过/失败
[ ] 用例8：登录功能-立即注册链接 - 通过/失败
```

**验收标准：**
- ✅ 通过率≥90%（至少7/8通过）
- ✅ 无超时失败
- ✅ 执行时间合理（总计<3分钟）

**预计耗时：** 30分钟

---

### 任务6：输出文档 ⭐中优先级

**输出文档列表：**
1. ✅ 需求文档（已完成）
2. ✅ 执行计划文档（本文档）
3. 测试报告（待输出）

**测试报告内容：**
- 执行环境信息
- 测试结果统计
- 失败用例分析
- 优化效果对比
- 改进建议

**预计耗时：** 30分钟

---

## 三、执行进度跟踪

### 3.1 任务看板

| 任务 | 状态 | 负责人 | 开始时间 | 完成时间 | 备注 |
|------|------|--------|---------|---------|------|
| 任务1：优化正常登录用例 | ⏳进行中 | Claude | 2026-07-12 | - | - |
| 任务2：优化页面访问验证用例 | 待开始 | Claude | - | - | - |
| 任务3：优化其他登录用例 | 待开始 | Claude | - | - | - |
| 任务4：修改executor代码 | 待开始 | Claude | - | - | - |
| 任务5：测试验证 | 待开始 | Claude | - | - | - |
| 任务6：输出文档 | 进行中 | Claude | 2026-07-12 | - | 已完成需求文档和执行计划 |

### 3.2 里程碑

- **里程碑1**：完成所有用例优化（预计1.5小时）
- **里程碑2**：完成代码修改（预计2小时）
- **里程碑3**：完成测试验证（预计2.5小时）
- **里程碑4**：完成文档输出（预计3小时）

---

## 四、风险控制

### 4.1 风险识别

| 风险 | 概率 | 影响 | 应对措施 |
|------|------|------|----------|
| 用例执行仍失败 | 中 | 高 | 分析日志，进一步优化选择器 |
| 页面元素变化 | 低 | 高 | 更新选择器 |
| 时间不足 | 低 | 中 | 优先完成高优先级任务 |

### 4.2 回滚方案

如果优化后效果不佳，可：
1. 恢复原有用例
2. 使用git回滚代码
3. 重新分析问题

---

## 五、验收清单

### 5.1 功能验收

- [ ] 所有登录用例执行不超时
- [ ] 测试通过率≥90%
- [ ] 测试结果准确反映实际状态
- [ ] config配置正确

### 5.2 代码验收

- [ ] playwright_executor.py修改完成
- [ ] 代码可读性良好
- [ ] 有必要的注释

### 5.3 文档验收

- [x] 需求文档完整
- [x] 执行计划详细
- [ ] 测试报告真实

---

## 六、执行总结

### 6.1 完成情况
（待执行完成后填写）

### 6.2 效果对比
（待执行完成后填写）

### 6.3 经验总结
（待执行完成后填写）

---

**文档版本：** v1.0  
**创建日期：** 2026-07-12  
**创建人：** Claude
