Status: done
作为测试开发者, 我想要修复 Story 2.4 中发现的问题, 以便工具可以正常使用。
在 Epic 2 的前四个 Story 中:
Story 2.4 在测试过程中发现并已经修复了多个问题,但需要验证修复效果,并处理可能遗留的问题。
验证 Story 2.4 的修复效果
检查是否有遗留问题
运行测试验证
更新文档
timeout 90 pnpm test:e2e:chromium disability-person-complete根据 Story 2.4 的完成笔记,以下问题已被发现和修复:
[工具 Bug - HIGH] listbox 依赖问题
[role="listbox"] 元素,但 Radix UI Select v2.2.5 不使用此角色getByRole("option") 代替 waitForSelector("[role=listbox]")packages/e2e-test-utils/src/radix-select.ts下拉框关闭等待逻辑
getByRole("option") 变为 hidden 状态超时配置优化
findTrigger 和 findAndClickOption 中的超时从 5000ms 减少到 2000ms由于 Story 2.4 已经应用了修复,本 Story 主要工作是:
主要文件:
packages/e2e-test-utils/
└── src/
└── radix-select.ts # 包含修复的工具函数
web/tests/e2e/
├── specs/admin/
│ └── disability-person-complete.spec.ts # 验证测试
└── playwright.config.ts # 超时配置
重要提示: 本部分包含开发者实现此故事所需的所有关键上下文和约束条件。
Story 2.4 已经完成以下修复:
selectRadixOption 修复:
getByRole("option", { name: value }) 定位选项exact: true 允许模糊匹配selectRadixOptionAsync 修复:
getByRole 策略超时配置:
findTrigger 和 findAndClickOption 超时从 5000ms 改为 2000ms// packages/e2e-test-utils/src/radix-select.ts
// 新的选项定位策略(更可靠)
async function findAndClickOption(page: Page, value: string): Promise<void> {
// 使用 getByRole 而非 waitForSelector
const option = page.getByRole("option", { name: value });
await option.click({ timeout: 2000 });
// 等待下拉框关闭
await page.waitForTimeout(200);
await page.getByRole("option").first().waitFor({ state: 'hidden' });
}
运行以下测试验证修复效果:
cd web
timeout 60 pnpm test:e2e:chromium disability-person-complete
预期结果:
基于 Story 2.4 的完成笔记,以下问题可能需要关注:
| 优先级 | 问题 | 状态 |
|---|---|---|
| HIGH | listbox 依赖 | ✅ 已修复 |
| HIGH | 下拉框关闭 | ✅ 已修复 |
| MEDIUM | 错误消息清晰度 | ⚠️ 可能需要改进 |
| LOW | 性能优化 | ⚠️ 已部分修复(超时缩短) |
Playwright API 使用:
getByRole() 进行角色定位(推荐方式)waitFor({ state: 'hidden' }) 等待元素隐藏waitForTimeout(200) 作为最小等待(可接受,用于等待 UI 响应)错误处理:
E2ETestError 抛出| 包 | 版本 | 要求 |
|---|---|---|
| @playwright/test (web) | 1.55.0 | ✅ 满足 ^1.40.0 |
| @d8d/e2e-test-utils | - | peer dependency: ^1.40.0 |
// web/tests/e2e/playwright.config.ts
timeout: 60000 // 60秒,单个测试的默认超时
1. 运行完整测试:
cd web
timeout 60 pnpm test:e2e:chromium disability-person-complete
2. 观察点:
3. 性能检查:
1. DOM 结构理解:
[role="combobox"] 而非 [role="listbox"][role="option"],可通过 getByRole 定位2. 修复验证:
3. 测试命令:
timeout 命令限制总运行时间timeout 60 pnpm test:e2e:chromium1. 使用 getByRole 优先:
page.getByRole("option", { name: value })page.waitForSelector("[role=listbox]")2. 精确文本匹配:
name: value 而非 exact: true 进行模糊匹配3. 等待元素隐藏:
await element.waitFor({ state: 'hidden' })完整项目上下文: _bmad-output/project-context.md
关键规范:
any 类型pnpm test:e2e:chromium相关文档:
_bmad-output/planning-artifacts/epics.md#Epic-2_bmad-output/implementation-artifacts/2-4-run-tests-collect-feedback.mdpackages/e2e-test-utils/src/radix-select.tsdocs/standards/e2e-radix-testing.mdClaude Opus 4.5 (claude-opus-4-5-20251101)
(开发过程中添加调试日志引用)
验证的修复:
getByRole("option") 正确定位选项测试执行结果:
timeout 90 pnpm test:e2e:chromium disability-person-complete测试超时说明:
发现的遗留问题评估:
建议:
_bmad-output/implementation-artifacts/2-5-fix-found-issues.md (更新 - Story 文件)_bmad-output/implementation-artifacts/sprint-status.yaml (更新 - 状态追踪)无代码文件变更 - 本 Story 仅验证修复效果,未修改任何代码