Playwright DSL 转 Spec
目标
将交付目录中的 UI DSL 转换为 Playwright 测试代码:
- 输入:
./<delivery-name>/ui-dsl/ui-test.dsl.yaml - 输出:
./<delivery-name>/playwright/tests/*.spec.ts - 唯一 DSL 规范来源:项目内
.codex/skills/testcase-to-playwright-dsl/references/dsl-schema.md ui-test.dsl.yaml只能作为输入或测试样例,不能作为 schema 来源。- 本 skill 只生成
.spec.ts,不执行 Playwright,不运行npx playwright test。
执行流程
- 确认项目根目录是包含
.codex的目录。 - 根据用户请求定位交付目录;如果未指定,查找项目根目录下的
*/ui-dsl/ui-test.dsl.yaml。 - 如果找到多个 DSL 文件,立即停止执行,并要求用户指定
delivery-name。 - 读取
.codex/skills/testcase-to-playwright-dsl/references/dsl-schema.md,确认当前 DSL schema 与任务一致。 - 运行内置脚本生成 spec:
python3 .codex/skills/playwright-dsl-to-spec/scripts/convert_dsl_to_spec.py \
--input ./<delivery-name>/ui-dsl/ui-test.dsl.yaml \
--output-dir ./<delivery-name>/playwright/tests
如果未传入 --input,脚本会按 */ui-dsl/ui-test.dsl.yaml 自动查找;找到多个时会失败并提示明确输入路径。
生成规则
- 只支持 schema 中定义的 action:
goto、click、fill、select、upload、wait_for、assert_visible、assert_text、assert_state。 - 严格校验顶层字段、
meta、selectors、test_data、flows、steps、todos、unsupported_steps的字段白名单;出现 schema 外字段时停止。 selector.status: "todo"的步骤不要生成真实 Playwright 操作,必须生成清晰的运行时失败或跳过,不能只生成 TODO 注释后静默通过。默认生成throw new Error(...)。selector.status: "confirmed"的步骤才生成真实 Playwright locator 操作。goto仅在url非空时生成page.goto(url);否则生成 TODO 注释。wait_for如果没有 target,则生成page.waitForTimeout(timeout_ms);如果有 target,遵循 selector status 规则。fill、select、upload的value支持${data_key}引用顶层test_data。assert_visible使用toBeVisible。assert_text使用toContainText(expected);缺少expected时生成 TODO 注释。assert_state使用toBeVisible作为保守状态断言,并保留expected为 TODO 注释,等待人工补充具体状态断言。- confirmed selector 字符串要转换为对应 Playwright locator API:
role=...使用page.getByRole,label=使用page.getByLabel,placeholder=使用page.getByPlaceholder,text=使用page.getByText,CSS selector 使用page.locator。 optional: true的步骤包裹在try/catch中,失败时记录 warning,不中断测试。- 每个 DSL step 前必须固定输出以下四行注释,供
playwright-result-report从失败行号反查 DSL:
// flow_id: <flow.id>
// step_id: <step.id>
// source_ts: <step.source_ts>
// selector_key: <step.target>
输出约定
- 每个
flow生成一个<flow-id>.spec.ts。 - 输出目录必须是
./<delivery-name>/playwright/tests/。 - 不要写入
.codex/、.codex/skills/或其他执行产物目录。 - 完成后只简要说明生成的 spec 文件路径;不要在对话中粘贴完整 spec。