Help us improve
Share bugs, ideas, or general feedback.
From velocitai
Generates PageObject classes and corresponding test cases from real page DOM. Triggered when creating new pages or adding page objects.
npx claudepluginhub danielsuo117/velocitai --plugin velocitaiHow this skill is triggered — by the user, by Claude, or both
Slash command
/velocitai:gen-page-testThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
```
Guides creating page objects and refactoring Playwright tests using Page Object Model patterns for maintainability, reusability, and scalability. Covers locators, principles, and TypeScript examples.
Incrementally adds regression test points to an existing PageObject by extracting locators from the live page DOM and appending methods to the page class and corresponding role test flow.
Expert approach to page-object-model in test automation. Use when working with .
Share bugs, ideas, or general feedback.
用户输入:为 <中文页面名>(URL: https://...)生成页面对象和测试,测试点:点击A、填写B、查看C
| 参数 | 必填 | 说明 | 示例 |
|---|---|---|---|
| 页面名称 | 是 | 中文业务名称 | 课程管理页 |
| 页面 URL | 是 | 真实可访问的页面 URL(已认证态) | https://example.com/xxx |
| 角色 | 是 | 项目中已有的角色(如 <role>) | 对应角色 |
| 类名 | 否(自动推导) | PascalCase | <Role><Page>Page |
| 回归测试点 | 是 | 需要覆盖的交互元素 | 点击新建、搜索、删除 |
类名推导规则:
Page 后缀(如 <Feature>Page)<Role> + 英文翻译 → PascalCase + Page 后缀(如 <Role><Feature>Page)<role>_(如 <role>_<feature>_page.py)项目中已有的具体类名清单见 docs/pages-catalog.md。
browser_navigate(必要时先 /entry?token=xxx)→ browser_snapshot → browser_evaluate 提取元素。按 locator-replacer 六级优先级(P0 → P5)选出稳定定位符。
创建 pages/<snake_name>_page.py:
# 页面名称:<中文名>
from pages.base_page import BasePage
class <ClassName>(BasePage):
# 定位符 — 来自真实页面(<日期>,URL: <页面URL>)
<LOCATOR_1> = "<真实定位符>" # P<0-5>: 说明
<LOCATOR_2> = "<真实定位符>" # P<0-5>: 说明
PAGE_IDENTIFIER = "<页面标识定位符>" # P<0-5>: 说明
def click_<method_1>(self):
self.click(self.<LOCATOR_1>)
def click_<method_2>(self):
self.click(self.<LOCATOR_2>)
def is_page_loaded(self) -> bool:
return self.is_visible(self.PAGE_IDENTIFIER)
pages/__init__.pyfrom pages.<snake_name>_page import <ClassName>
# 在 __all__ 列表中追加 "<ClassName>"
目标文件:对应角色 tests/<role>/test_<role>_flow.py(继承 <Role>BaseTest)中的 Test<Role>Flow 类。
对应角色示例:
@allure.story("<页面中文名>")
def test_<snake_name>(self):
page_obj = <ClassName>(self.<role>_page)
self.<role>_page.goto("<页面URL>")
assert page_obj.is_page_loaded(), "<页面中文名>加载失败"
page_obj.click_<method_1>()
...
对应角色使用 self.<role>_page,且若脱离门户布局须往返闭合(见 case-round-trip):
@allure.story("<页面中文名>")
def test_<snake_name>(self):
self.<role>_home.click_<navigation>()
page_obj = <ClassName>(self.<role>_page)
assert page_obj.is_page_loaded(), "<页面中文名>加载失败"
page_obj.click_<method_1>()
page_obj.click_back_to_<landing>()
assert self.<role>_home.is_page_loaded(), "返回起点失败"
pytest tests/<role>/test_<role>_flow.py --env=<pre|prod> -v -k "test_<snake_name>"
⚠️ 运行前向用户确认 --env(见 agent-behavior.md P0.2)。
失败时 → locator-replacer 重新抽取定位符,或 test-runner 分析失败类型。
docs/docs/pages-catalog.md:追加新页面类 + 方法表docs/regression-points.md:追加回归点表 + 关键定位符段通用检查(命名/导入/is_page_loaded/allure)→ coding-conventions.md "新增测试检查清单"
pytest tests/<role>/test_<role>_flow.py --env=<pre|prod> -v -k "test_<name>" 通过docs/pages-catalog.md 已追加docs/regression-points.md 已追加