Help us improve
Share bugs, ideas, or general feedback.
From velocitai
Enforces that tests using shared Playwright page fixtures return to the landing page via UI and assert, preventing fixture reset issues. Provides rules, examples, and decision tree for Playwright + pytest.
npx claudepluginhub danielsuo117/velocitai --plugin velocitaiHow this skill is triggered — by the user, by Claude, or both
Slash command
/velocitai:case-round-tripThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> 仅适用 Playwright + pytest。
Write Playwright E2E tests using fixtures and best practices. Use when creating E2E tests, writing browser automation tests, or testing user flows.
Writes maintainable Playwright E2E tests using page objects, accessible locators, fixtures, and parallel execution. Helps debug flaky tests and manage complex user flows.
Guides use of Playwright built-in and custom fixtures for page, context, browser, and request to manage test state and infrastructure with efficient setup and teardown.
Share bugs, ideas, or general feedback.
仅适用 Playwright + pytest。
共享 page(scope > function 的 fixture)下,用例离开起点页后必须在末尾通过真实 UI 返回并断言;不要在复位 fixture 里做 goto 兜底。
click_back_to_<landing>(),走真实 UI 返回按钮def test_enter_detail(self):
self.home.click_first_item()
detail = DetailPage(self.page)
assert detail.is_page_loaded(), "详情页未加载"
detail.click_back_to_home()
assert self.home.is_page_loaded(), "返回起点页失败"
复位 fixture 通常判断 if not start.is_page_loaded(): start.click_back_to_landing()。若 is_page_loaded() 仅校验"页面骨架可见"(title / 容器),切到其他 tab/子路由后骨架仍在 → 返回 True → 复位永不触发 → 下一用例起点错乱。
规则:起点 PageObject 的 is_page_loaded() 必须包含"当前停留在起点状态"判据(起点 tab 激活态 / 起点 URL / 起点独有内容),而不仅是"骨架存在"。
# ❌ 只校验骨架 — 切到其他 tab 后仍返回 True,复位失效
def is_page_loaded(self) -> bool:
return self.is_visible(self.PAGE_TITLE) and self.is_visible(self.TAB_BAR)
# ✅ 加"当前在起点 tab"判据 — tab 切换后返回 False,触发复位
def is_page_loaded(self) -> bool:
return (
self.is_visible(self.PAGE_TITLE)
and self.is_visible(self.TAB_BAR)
and self.is_visible(self.LANDING_TAB_ACTIVE_MARK) # 关键第 3 条
)
LANDING_TAB_ACTIVE_MARK 的 selector 必须用 text= 等锁定到具体起点 tab(如 .tab.active >> text=<起点 tab 名>),否则 .active 会匹配任意激活 tab,同样失效(见 locator-strategy.md 状态类 selector 必须配 text 锁定)。
跳转目标是否仍保留起点页的门户导航?
├─ 是 → 依赖复位 fixture 即可
└─ 否 → PageObject 必须提供返回方法 + 用例末尾显式返回 + 断言
page.goto(<landing_url>) 绕过返回按钮 → 失去对返回按钮的回归覆盖if not visible: goto(...) 塞进复位 fixture → 掩盖"用例未闭合"真问题click_back_to_<landing>()项目中脱离门户布局的 PageObject(需实现 click_back_to_<landing>)见 docs/pages-catalog.md 与 docs/regression-points.md(带"⚠️ 跳转目标脱离门户布局"标注的页面)。