研发协作
在 Momentic 项目中创建、运行和维护浏览器 E2E…
需要用 Momentic 编写或维护 *.test.yaml、*.module.yaml 浏览器 E2E 测试,并通过 MCP/CLI 预览、拼接、验证、运行和排障时适用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 Momentic 项目中创建、运行和特定
解决思路
- 测试文件使用 *.test.yaml;可复用模块使用 *.module.yaml。
- 测试 ID 在测试文件的 id 字段。
- 在假定项目默认值适用前,检查 momentic.config.yaml 和测试级 metadata。
- 用 fileType: momentic/test/v2 和 fileType: momentic/module/v2 标识 v2 文件。
- 将缺失或不同的 fileType 视为已弃用的 v1。
- 绝不直接编辑 v1 YAML;通过 momentic_test_splice_steps 持久化更改。
- v2 测试用 defaultEnv 选择环境,--env <name> 覆盖它。
- 不要回退到配置中唯一环境。
- base URL 来源顺序:--url-override,然后测试自身 url,然后 env.BASE_URL;设置了 url 的测试在每个环境保留它。
- 没有 base URL 时运行失败:Cannot run test with no base URL and no BASE_URL variable defined in its environment。
- v2 可用相对路径引用 modules、JavaScript、auth state。
- 路径从包含该引用的 YAML 文件解析。
- 使用 ./... 或 ../...,绝不用绝对路径或 ~。
- 移动、重命名或删除被引用文件前,grep 其路径并更新或删除所有引用。
- 不要向 v2 YAML 添加内部或生成字段。
- 优先 Known v2 change 工作流:检查附近模式 -> 编辑 YAML -> 语法或引用不确定时 lint -> 验证时 reload 或 restart -> 运行相关范围。
- 对 v1、未知 UI 或交互验证,用 MCP 工作流:启动 MCP session -> 运行任何前置条件 -> 预览逻辑检查点 -> splice 它 -> 验证保存的范围 -> 终止。
- 对新测试:用 momentic_test_create 创建 -> 在一次 YAML 编辑中编写已知 v2 序列,或在需要发现时分步使用 MCP;momentic_session_start 只打开现有测试。
- 默认用 MCP 作为交互接口。
- MCP 返回结构化结果、screenshots、artifacts、step refs 和可轮询执行。
- Preview 和 run 工具默认等待 30 秒,然后返回 stepRunnerId,同时工作继续。
- 多数调用保持 timeoutSeconds 未设置,尤其是单个 preset steps。
- 仅当 coding agent 的工具调用超时短于 30 秒时,将 timeoutSeconds 设低于 30 秒。
- 仅为了在更大工具调用超时内等待更久而提高 timeoutSeconds。
- 用 momentic_poll_runner 轮询返回的句柄。
- 轮询有单独的 timeoutSeconds,默认 0,最大 30。
- 轮询时传返回的 stepRunnerId,并在 coding agent 工具调用超时内使用非零等待,而不是反复无等待轮询。
- 编辑前确认测试目标、用户可见成功标准、启动环境、auth 和 env 需求。
- 在预览或运行任何可能 submit、purchase、delete、send、create 或其他非幂等副作用的 step 或 AI Action 前询问用户。
- 若批准,该非幂等操作最多执行一次。
- 编辑共享模块、重启长流程或运行昂贵全量测试前也询问。
- 编写时优先自然语言目标。
- 仅当 AI 看不到目标或用户要求 selector 级精度时,使用 selectors 或 coordinates。
- 浏览器动作和检查用原生 Momentic steps。
- JavaScript 例外见 Test execution behavior 下的 JavaScript 部分。
- 不要添加初始导航;session 从测试的 base URL 开始。
- 保持断言最小且用户驱动。
- 导航或重大状态变化后,在依赖动作前验证契约。
- URL 契约优先 waitForUrl。
- 稳定文本或结构优先 page/element checks。
- 语义视觉状态优先 AI assertions。
- 新测试优先 AI Action V3,除非精确交互序列是契约的一部分。
- 除非正确性需要,不要添加可选或默认值字段。
- 保持变更窄。
- 保留无关值、注释、顺序和 step 风格。
- 不要削弱测试来隐藏损坏的 app 或 service。
- 除非测试意图需要,保留现有 before / steps / after 结构。
- AI Action V3 接受自然语言目标并决定浏览器步骤。
- AI Action V3 默认缓存:保存并重放成功流程,自愈失败重放步骤;用于可重复流程。
- AI Action V3 不缓存:每次全新运行 agent;在 v2 设 cache: false 或配合 AI_ACTION_DYNAMIC 使用 --disable-cache。
- 对 chats、agentic workflows、exploratory tests 和其他动态或非确定性行为,优先不缓存。
- 将 make sure you can do X 视为目标式测试,除非用户指定路线。
- 当控件、顺序、中间断言、确定性重放、速度或风险副作用本身被测时,使用 granular steps。
- 除非被要求改变策略,保持现有 granular tests 为 granular。
- Momentic 缓存 resolved selectors、text、coordinates 和其他 metadata,使多数运行避免重复 AI 调用。
- AI assertions 也可能复用 past-result memory。
- stale cache 或 memory 可解释快速错误元素匹配或重复 borderline verdict。
- Cache 按 git metadata 作用域,包括 branch。
- Protected branches 读 cache 但不写,除非使用 --save-cache 或设置 CI。
- 当 granular step 的意图变化时更改其描述。
- 绝不为 locator steps 添加 DANGEROUS_FORCE_DYNAMIC 或 --disable-cache;内置 cache validation 处理变化内容。
- 将成功 preview 的 CacheId 带入被 splice 的确切 step。
- 当旧 memory 不再匹配预期条件时,改写 assertion。
- AI Action V3 的 cache 行为按上述 AI Action V3 规则。
- Smart waiting 在 targeting steps 前运行,默认五秒。
- 在该五秒窗口内不要添加 sleeps。
- 对更长或语义 readiness,等待 URL,或用描述所需正向状态的 page、element 或 AI check。
- Checks 会重试直到 timeout;增加该 timeout,而不要用 JavaScript 轮询 UI。
- 项目级 timing settings 见 browser configuration。
- 每次运行有 test-scoped env,跨 steps 和 modules 持久。
- 在 v2 中用 saveAs 保存返回值;在 MCP step strings 中用 --env-key。
- 保存多个值时在 JavaScript 中用 setVariable(name, value)。
- 在 JavaScript 和 module input expressions 中用 env.NAME。
- 在 string fields 中用 {{ env.NAME }},但不要在 JavaScript source 内使用。
- Module inputs 是存为 strings 的 JavaScript fragments。
- 对 module inputs,引用字面字符串要 quote,变量用 env.X。
- 浏览器行为用 native click、type、hover、wait、check steps。
- native steps 保留 Momentic 的 smart waiting、cache、traces 和 retries。
- 不要用 browser JavaScript 点击或输入。
- 当 check 可重试直到 timeout 时,不要用 JavaScript 轮询 UI。
- 用 Node JavaScript 做测试 setup、数据生成、APIs、databases、OTP/email/SMS 和 Momentic helpers。
- 当没有 native step 表达操作时,用 Browser JavaScript 访问 window、document、client-side state,或注入页面脚本。
- 保持一次性代码短,并遵循附近项目惯例编写可复用 v2 scripts。
- 运行时 APIs 和 timeout 细节见 JavaScript guide。
- V2 可人工编辑;Tests 用 before、steps、after;modules 用 steps。
- 每个 step 有一个 command key,选项嵌套其下。
- Durations 用毫秒,step IDs 不存储在 YAML。
- 做最小编辑并匹配附近语法。
- 若语法不清,在 Momentic monorepo 中查阅 infra/scripts/v2-json-schema/build/v2-format-reference.md,或在 installed skill 中查阅 https://static.momentic.ai/v2-format-reference.md。
- 当 schema 或文件引用风险需要时运行 npx momentic lint。
- momentic app 和 momentic run 也会自动 lint。
- 磁盘编辑后,若工具可用,reload 活动的 MCP test;否则终止并重启 session。
- momentic_test_get 读取持久状态,但不会刷新活动 session,除非其 description 说明会。
- 使用 session start 返回的 tool descriptions 和 Step Authoring Guide 获取当前参数和 step syntax。
- 不要从本 skill 复制参考材料。
- 不要把 context tools 当作 session-start boilerplate。
- 按需使用 context tools,并遵循其描述,尤其当它们提供 filters 或返回大项目数据时。
- 若测试 ID 已知,单独启动 momentic_session_start;其 Test Content 提供活动 steps 和 runnable IDs。
- 仅当项目路径、测试、模块或环境未知时,用 momentic_get_artifacts 发现;避免冗余刷新。
- 用 momentic_test_get 在启动前检查持久状态,或读取不同测试;之后优先 active session 和 splice responses。
- 仅当 step 需要未知 env data 时,用 filtered momentic_get_environment_variables。
- 仅当评估复用时用 momentic_module_recommend -> momentic_module_get;recommendation 会调用 AI,不是启动 session 必需。
- V2 YAML 没有 runnable step IDs;使用 session start 或后续 splice responses 返回的 IDs。
- 每个 session 只能运行一个 browser operation。
- 不要对同一 session 并发 preview、run、state 或 splice 操作。
- Preview -> splice -> validate:mid-test 工作时,先运行到 preceding step 一次并保持同一 session,避免对错误页面状态编写。
- 以逻辑检查点向前预览,如 login complete、form ready、submission complete;检查点让浏览器状态可复用并保持 persistence calls 可审查。
- 相邻步骤用 momentic_preview_steps;它支持与 momentic_preview_step 相同的 preset、AI Action 和 module steps。
- 先读返回的 screenshot。
- 仅当图像缺少足够 targeting 或 diagnostic context 时请求 browser state;若页面可能仍在 settling,再请求一次。
- Splice 成功的检查点。
- 将每个返回的 CacheId 仅附加到其确切 step;cacheless steps 正常。
- 立即读取 splice response 获取 active step refs。
- 运行下一个依赖的 saved step 或 range。
- 如果任何 preview 或 run 返回 stepRunnerId,轮询它,而不是启动另一个 browser operation。
- 结束前,在安全时,运行覆盖 prerequisites、changed step 和 next dependent contract 的最小 saved range。
- 若累积状态可能掩盖失败,先 reset。
- 完成后终止 session。
- 批量明显低风险字段。
- 单独预览不确定 locators。
- 对 submit、purchase、delete、send 或其他非幂等动作,预览 setup,splice 检查点,然后最多运行批准的 saved action 一次。
- 常规编辑之间不要 reset。
- 对嵌套 steps,使用 active session 或 splice response 返回的 parent chain。
- 对约四个或更多可复用步骤的逻辑流,检查 momentic_module_recommend -> momentic_module_get -> reuse or inline。
- 复用模块减少重复 setup 并让测试聚焦独特契约。
- Modules 不能包含 modules。
- 修改共享模块前询问。
- 尊重模块声明的 parameters、defaults 和 enum values;module inputs 是 JavaScript fragments,不是 {{ }} templates。
- Troubleshooting Page state and timing:wrong/stale page 时检查最新 screenshot 或 session state;若页面 settling,重试 state capture 一次。
- 某个检查点慢 readiness 时,添加最窄的 page、element 或 AI check,或增加现有 check 的 timeout;checks 已重试,不要用 JavaScript 轮询。
- 项目范围 targeting 普遍慢时,考虑增加 browser.smartWaitingTimeoutMs;不要用它掩盖单个慢 assertion。
- 长任务或上传时,用合适 timeout 检查稳定正向结果,不要 sleep。
- session 漂移时,用 resetSession: true 重新运行所需 saved range。
- browser、CDP、page-load、screenshot 或 snapshot timeout 后,重试或 reset 一次。
- 若这些 timeout 持续或影响多个 browser tools,停止修改测试。
- 不要用 waits、更弱断言、cache flags 或重复 browser calls 隐藏资源压力。
- 资源压力信号包括 unresponsive page、document-tree 或 page-execution timeout、empty HTML snapshot、browser 或 inspector crash、data-momentic-id timeout;单独 page-load timeout 可能表示 app 或 network。
- 用可用 host tools 检查 CPU、memory 和 top processes。
- 检查 browser、Momentic、app server、compiler/bundler、database 和无关 workloads。
- 对 completed runs,若存在,关联 attempts/<n>/assets/resource-usage.ndjson。
- 报告 error、step、URL、retry result、resource pressure、largest consumers 和 supported cause;若证据不能区分 host、app、services 或 Momentic,说明。
- Element absent 时,debug prerequisite。
- Element visible but not found 时,使用基于可见文本、role 和 nearby context 的稳定描述。
- Fast wrong-element match 时,考虑 stale cache,然后修正 description。
- 正常模式中,element hidden、disabled、detached、covered、moving 或 outside viewport 的错误来自 Playwright actionability enforcement,由 Momentic 显示;不是 Momentic locator AI 失败;修复页面状态或前置条件。
- 仅当绕过 actionability 是预期行为时使用 force。
- 对故意无法满足 Playwright actionability 的控件,如某些 rich-text editors,browser.visualActions: true 使用基于坐标的动作;它避免那些检查,但也放弃稳定性保证。
- 仅当精确文本必须出现时用 quoted text;否则描述含义。
- 让断言具体到 region、object、count 或 state。
- 将视觉目标滚动到视口。
- 对微妙视觉条件用 vision-only assertion mode。
- 用 step assertions 断言稳定最终状态。
- 对短暂 toasts 或 change-over-time 比较,用 video-backed run assertions。
- V2 load failure 时,lint 文件并检查相对引用。
- Module failure 时,重新检查 parameters、defaults、enums 和 input expressions。
- Missing env value 时,验证 producing save 和 consumer 处 env.X 与 {{ env.X }}。
- JavaScript failure 时,验证 Node 与 Browser context。
- 同一失败约三次尝试后,停止并询问用户方向。
适用边界 · 注意事项
- 未安装或未配置 Momentic CLI、MCP、项目访问权限或 Momentic 依赖时,不适用。
- 需要直接编辑 v1 YAML 或进行非 Momentic 浏览器自动化时,不适用。
- 未获用户批准执行非幂等副作用、修改共享模块、重启长流程或运行昂贵全量测试时,不应套用该工作流。