# 问题处理文档 - 执行用例结果显示"待执行"且用例全部失败

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

---

## 一、问题描述

### 1.1 现象

会议管理模块全选用例执行后，执行中心显示执行已完成，但每条用例结果都显示"待执行"。展开后实际查看，所有用例都失败了。

### 1.2 复现步骤

1. 用例管理 > UI自动化，全选会议管理模块 6 个用例
2. 点击"执行选中"
3. 跳转到执行中心，等待执行完成
4. 展开执行记录查看结果

---

## 二、根因分析

### 2.1 用例执行顺序未按模块排序

`execution_service.py` 第 222-227 行查询 `case_results` 时**没有 ORDER BY**：

```python
results_query = select(CaseResult).where(
    CaseResult.execution_id == execution_id,
    CaseResult.status == "pending",
)
```

导致用例执行顺序不确定。实际执行顺序变成了：
1. 会议室列表（auto_login，需要登录态）
2. 会议列表（auto_login，需要登录态）
3. ...
4. **个人日程（首用例，含登录步骤）**

首用例"个人日程"排在第 4 位执行，但前 3 个用例需要登录态才能操作——它们在未登录状态下点击菜单自然失败。

### 2.2 等待主页的选择器不匹配

首用例登录步骤 1-7 全部通过，但步骤 8"等待主页加载"的选择器 `.el-menu, .sidebar-container, .home-container` 超时失败。这说明该系统主页的实际 DOM 结构不包含这些 class。

### 2.3 退出登录步骤选择器不匹配

末用例"预定数据"的步骤 3"退出登录"通过，但步骤 4"确认退出登录"的选择器 `button:has-text("退出"), button:has-text("确定")` 找不到，说明退出登录的弹窗结构不同。

### 2.4 前端显示"待执行"

API 返回的数据中 `status` 是正确的（`failed`），前端显示"待执行"可能是以下原因之一：
- WebSocket `case_complete` 事件中 `case_result.status` 先被设为 `running`（第 325 行），然后才更新为最终状态（第 339 行），但 `case_complete` 广播在状态更新后（第 358 行），应该没问题
- 用户可能在执行完成前就看了展开结果，WebSocket 缓存了旧的 `pending` 状态

---

## 三、修复方案

### 3.1 用例执行顺序按模块排序

`execution_service.py` 中查询 `case_results` 时，增加 `ORDER BY` 按 `created_at` 排序，确保用例按创建顺序执行（首用例在前）。

但更根本的方案是：**创建执行时，按模块分组排序用例，同模块内按 `order` 字段排序**。这样首用例（含登录）必然先执行。

### 3.2 修复"等待主页加载"选择器

使用更通用的选择器，或直接等待 URL 变化（登录成功后 URL 从 `#/login` 变为 `#/dashboard` 或其他主页路径）。

### 3.3 修复"退出登录"选择器

需要适配系统的实际退出登录流程。通过截图分析实际 DOM 结构来调整选择器。

---

## 四、验收标准

| 测试项 | 预期结果 |
|--------|----------|
| 全选会议管理用例执行 | 首用例（含登录）第一个执行 |
| 首用例登录成功后 | 步骤8"等待主页加载"通过 |
| 后续用例复用登录态 | 从主页点击菜单成功 |
| 末用例退出登录 | 退出登录和确认步骤通过 |
| 执行完成后展开结果 | 用例结果状态正确显示 |

---

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