# 执行计划 - 修复新建会议用例执行失败（step 11 会议室勾选超时 / step 17 结束会议失败）

> **文档类型**: 计划执行文档
> **创建日期**: 2026-08-19
> **作者**: czj
> **优先级**: P0
> **状态**: ✅ 已完成，生产验收通过
> **关联文档**: `_问题处理_新建会议用例执行失败_页面直达后会议室表格checkbox不可见.md`

---

## 一、执行概述

「新建会议」用例（`case_13650e0406e64779b66e6fa5de35c24a`）智能定位通过 17/18 后执行仍失败，连续 3 次失败在 step 11 会议室勾选。根因定位后确认**两个独立缺陷**：

1. **step 11**：会议室表格懒加载慢（12s-130s+）+ 表格仅列出空闲会议室（被占用即消失）+ checkbox 位于 `is-hidden` 隐藏列；
2. **step 17**：step 12 切「预定会议」→ 会议「未开始」→ 详情页无「结束会议」按钮。

**最终方案**：保留页面直达 + 增强执行器策略 5（轮询等待 + force 勾选 + 校验防假通过）+ 用例 step 12 改为保持「立即开始」。**否决**了"禁用页面直达走手动点击链"的方案（手动路径在会议室被占用时同样无该行可选，且更脆弱）。

---

## 二、任务分解与实施步骤（实际执行）

### Step 1：根因深挖（已完成）
- MCP 实测会议生命周期：立即开始→进行中→详情有结束会议；预定会议→未开始→无结束会议；
- MCP 实测房间可用性：结束占用会议后「北京展厅会议室」立即重新出现在列表第一行；
- 定位 step 12 选择器零匹配坑（`.time_btn > div:first-child .btns`）。

### Step 2：增强执行器策略 5（已完成）
**文件**：`backend/app/executors/playwright_executor.py`
- 行等待：`wait_for_selector(row, attached, 30s)` → `while` 轮询 `query_selector_all`，最长 **150s**；
- checkbox 点击：`force` 点击 → `_checkbox_is_checked()` 校验 → JS 兜底 → 每 2s 重试，最长 **40s**；
- 保留策略 3（点击整行）兜底。

### Step 3：修复用例 step 12（已完成）
- 新脚本 `backend/scripts/fix_step12.py`，通过 `PUT /api/cases/{id}` 更新：
  - name：`时间切换为：预定会议` → `时间保持为：立即开始`
  - selector：`.time_btn > div:last-child .btns` → `.time_btn > div:first-child`（修正零匹配坑）

### Step 4：本地全量验证（已完成）
- `run_case_verify.py --case case_862b...` 连跑 3 次：**18/18 全绿**，step 7/8/9 SKIP（页面直达预期），残留 0。

### Step 5：部署 5.60 生产 + 验收（已完成）
- `deploy_fix_560.py`：scp 上传执行器 + 脚本 → 服务器 `fix_step12.py` 更新生产用例 → `docker restart plat-auto-test-app` → 连跑 3 次验收；
- 生产结果：MySQL `case_results` 三条 `passed`，每次 18 步全绿，容器内残留检查 0。

---

## 三、验收标准（对照）

| 测试项 | 预期结果 | 实际 |
|--------|----------|------|
| 执行「新建会议」用例 | step 7/8/9 跳过（页面直达）、step 10/11 通过 | ✅ 本地 + 生产均通过 |
| step 11 勾选北京展厅会议室 | 通过 | ✅ 通过 |
| 全 18 步 | 全部通过 | ✅ 本地 3 次 + 生产 3 次 |
| 连续执行 2-3 次 | 全绿、零残留 | ✅ 残留 0 |

---

## 四、风险与影响

| 风险 | 影响 | 缓解 |
|------|------|------|
| 会议室被占用时该房间不在列表 | step 11 需等待 150s 后仍失败 | 依赖「每次执行结束会议释放房间」+ 验收连跑确认；若人工占用了目标房间，需先释放 |
| 隐藏列 checkbox 点击假通过 | 勾选未生效但步骤显示 PASS | 策略 5 点击后 `_checkbox_is_checked()` 校验，防假通过 |
| 执行器轮询等待加长 | 极端情况单步骤最长 150s | 仅会议室表格场景触发；正常路径不受影响 |

---

*本文档由 Claude Code 生成，遵循项目计划执行文档规范。*
