# 问题处理文档 - 非登录用例重复执行登录导致执行效率低且易失败

> **文档类型**: 问题处理文档
> **创建日期**: 2026-07-15
> **作者**: czj
> **优先级**: P1
> **状态**: 待修复

---

## 一、问题描述

### 1.1 现象

批量执行会议管理模块的用例时，每个用例的前 7 个步骤都是登录操作（打开登录页→等待表单→填账号→填密码→填验证码→点登录→确认协议弹窗）。第一个用例登录成功后，后续用例仍重复执行完整的登录流程，导致：

1. **执行效率极低**：每个用例额外花费 ~15 秒在登录上
2. **已登录再登录导致失败**：登录成功后再次访问登录页并填写表单，可能触发异常（如表单不存在、元素找不到等）
3. **步骤冗余**：25 个用例中有 24 个非登录用例，每个都重复 7 个登录步骤

### 1.2 期望行为

- **第一个用例**执行登录，登录成功后进入主页执行业务操作，完成后**返回主页**
- **后续用例**复用登录态，从主页开始直接执行业务操作，**跳过登录步骤**
- **登录模块用例**仍需独立执行（`reset_login: true`），验证登录功能本身

---

## 二、根因分析

### 2.1 当前用例步骤结构

所有非登录用例的 10 个步骤中，前 7 个是登录步骤：

```
步骤1: 打开登录页
步骤2: 等待登录表单加载
步骤3: 填写账号
步骤4: 填写密码
步骤5: 填写图形验证码
步骤6: 点击登录按钮
步骤7: 确认同意协议弹窗
步骤8: 等待主页加载
步骤9: 点击业务菜单（如"会议管理"）
步骤10: 验证业务页面元素
```

### 2.2 执行器已有智能跳过逻辑但不完善

`playwright_executor.py` 第 618-625 行有智能跳过逻辑：

```python
if action == "navigate" and self._is_logged_in:
    url = params.get("url", "")
    if (self.LOGIN_CONFIG["base_url"] in url and
        ("login" in url.lower() or url == self.LOGIN_CONFIG["base_url"] or url.endswith("/"))):
        step_result.status = "passed"
        step_result.log = f"✓ 已登录，跳过导航: {url}"
        break
```

**但这个逻辑只跳过 navigate 到登录页这一步**，不跳过后续的"填写账号"、"填写密码"等步骤。这些步骤在已登录的页面上执行时，因为找不到登录表单元素而失败。

### 2.3 核心问题

**非登录用例不应该包含登录步骤，而应该由执行器自动处理登录**。当前设计把登录步骤硬编码在每个用例中，导致：

1. 每个用例都重复登录
2. 已登录时执行登录步骤会失败
3. 无法利用执行器共享的登录态

### 2.4 正确的架构

| 用例类型 | 登录方式 | 步骤内容 |
|----------|----------|----------|
| 登录模块用例 | `reset_login: true` + 手动步骤 | 完整登录流程（验证登录功能本身） |
| 非登录用例（业务用例） | `auto_login: true` + 执行器自动登录 | 只包含业务操作步骤（从主页开始） |

---

## 三、修复方案

### 3.1 方案一：修改用例数据 + 启用 auto_login（推荐）

**思路**：修改非登录用例，删除前 8 个登录步骤，只保留业务步骤，同时将 `auto_login` 改为 `true`。

**执行器已有完整支持**：
- `auto_login=True` 时，执行用例前自动调用 `do_login()`（第 512-515 行）
- `_is_logged_in` 标记防止重复登录（第 218-219 行）
- 多用例共享同一执行器，登录态自然保持（`run_all_cases_sync` 第 239 行）
- `reset_login: true` 用于登录模块用例，重置登录态后再执行

**改造后用例步骤结构**：

```
# 登录模块用例（不变）
步骤1: 打开登录页
步骤2: 等待登录表单加载
...
步骤8: 等待登录成功跳转

# 非登录用例（改造后）
步骤1: 点击业务菜单（如"会议管理"）     ← 直接从主页开始
步骤2: 验证业务页面元素
```

**优势**：
- 执行器已有的 `auto_login` + `_is_logged_in` 机制完全支持
- 无需改执行器代码
- 用例步骤更简洁
- 第一个用例自动登录，后续用例复用登录态

### 3.2 方案二：执行器智能跳过登录步骤区域

**思路**：执行器检测到已登录时，自动跳过用例开头的一组登录步骤。

**问题**：无法准确判断哪些步骤属于"登录区域"，可能误跳业务步骤。不采用。

### 3.3 选择方案一

---

## 四、具体改动

### 4.1 数据库用例步骤修改

对 20 个非登录用例（排除 5 个登录模块用例）：

1. 删除前 8 个登录相关步骤（打开登录页→等待主页加载）
2. 只保留业务步骤（点击菜单 + 验证元素），重新编排 order
3. config 中 `auto_login` 改为 `true`

### 4.2 用例步骤最后加"返回主页"

每个非登录用例最后一步增加"点击首页/主页 logo"步骤，确保下一个用例从主页开始操作，避免停留在子页面影响下一个用例的菜单点击。

---

## 五、验收标准

| 测试项 | 预期结果 |
|--------|----------|
| 批量执行会议管理模块用例 | 第一个用例自动登录，后续用例复用登录态，不再重复登录 |
| 每个用例步骤数 | 非登录用例只有业务步骤（~3 步），无登录步骤 |
| 执行效率 | 每个非登录用例省去 ~15 秒登录时间 |
| 登录模块用例 | 仍独立执行，`reset_login: true` 清除登录态 |
| 用例间登录态保持 | 第一个用例登录后，后续用例共享登录态 |
| 用例执行完成后返回主页 | 最后一步点击主页，下一个用例从主页开始 |

---

## 六、相关文件

- `backend/app/executors/playwright_executor.py` — 执行器（`auto_login` + `do_login` + `_is_logged_in`）
- `backend/app/services/execution_service.py` — 执行服务（`run_all_cases_sync` 共享执行器）
- `backend/app/models/test_case.py` — 用例模型

---

*本文档由 Claude Code 生成，遵循项目问题处理文档规范。*
