e2e-test
E2E 测试执行规范与踩坑约束。Use when 执行、编写、调试 E2E 测试,或涉及 Playwright、e2e 目录下文件的改动。
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
E2E 测试执行规范与踩坑约束。Use when 执行、编写、调试 E2E 测试,或涉及 Playwright、e2e 目录下文件的改动。
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
版本发布流程,三种模式:完整发布(bump + push + 视情发 npm)、只 bump push(不发 npm)、紧急 npm(不 push)。Use when 用户要求"发布"、"release"、"bump 版本"、"push 版本"。
只读探针——枚举并驱动上游 OpenClaw provider 的登录逻辑,捕获真实返回(验证 URL/码、note 格式、交互需求、返回结构)而不完成授权、不落凭据、不动现有代码。手动调研工具,仅显式 /oauth-device-code-probe 调用,不自动触发。
Globally customize Nuxt UI 4 components via the @nuxt/ui vite plugin's ui option (appConfig equivalent). Use when adding Tailwind classes (cursor-pointer, rounded-full, etc.) to all instances of a component, changing default variants, or setting compound variants — without touching each instance.
Maintain CoClaw deploy Nginx rules for domain routing, HTTPS redirects, certbot certificate issuance, and SPA/release-artifact cache headers. Use when changing deploy/nginx/ config (modes/*.conf.template, includes/, templates/), or diagnosing browser stale-cache issues after frontend release (especially WeChat Android WebView).
移动端子页面适配规范(MobilePageHeader + 路由 meta)。Use when 新建非底部导航直达的子页面,或调整移动端页面 header/导航栏显隐。
Build UIs with @nuxt/ui v4 — 125+ accessible Vue components with Tailwind CSS theming. Use when creating interfaces, customizing themes to match a brand, building forms, or composing layouts like dashboards, docs sites, and chat interfaces.
| name | e2e-test |
| description | E2E 测试执行规范与踩坑约束。Use when 执行、编写、调试 E2E 测试,或涉及 Playwright、e2e 目录下文件的改动。 |
在 ui/ workspace 下执行:
pnpm e2e:ci # 推荐:自动处理 WSL2/CI 环境兼容性
pnpm e2e:ci -- e2e/auth.e2e.spec.js # 指定单个测试文件
pnpm e2e # 有 GUI 的环境下可看到浏览器
pnpm e2e:ci -- --grep @auth # 按标签运行一类
pnpm e2e:ci -- --grep "@auth|@bind" # 组合多个标签
pnpm e2e:ci -- --grep-invert @resilience # 排除某类
e2e/run.js 会自动检测环境(macOS / Linux / WSL2)决定是否用 xvfb-runpnpm --filter @coclaw/ui e2e:cirun.js 在跑测试前自动 playwright install chromium(幂等,已装秒过):新机器 / CI / 升级 Playwright 后首次跑会自动补齐浏览器,无需手动安装。.npmrc 的 registry 镜像对它无效。国内若安装卡在官方 CDN,另设 PLAYWRIGHT_DOWNLOAD_HOST=https://cdn.npmmirror.com/binaries/playwright 后重试(与 npm registry 是两套独立配置)。安装失败时 run.js 会打印显著提示。详见 ui/docs/e2e-troubleshooting.md 卡点 8。ui/e2e/helpers.js(TEST_LOGIN_NAME / TEST_PASSWORD)globalSetup 会自动创建该账号每个测试用例通过 title 中的 @tag 标注分类,配合 Playwright --grep 过滤使用。
| 标签 | 含义 |
|---|---|
@auth | 登录/注册/认证故障 |
@bind | 绑定/解绑/Claim |
@chat | 核心聊天业务 |
@resilience | 异常/网络/容错 |
@ui | 导航/布局/设置/交互 |
@rtc | WebRTC 传输 |
@file | 文件传输/浏览 |
某标签下具体有哪些测试文件,在 ui/e2e/ 下 grep 标签即得。
新增测试时须在 test title(或所属 describe title)中包含对应标签;确需新标签时同步更新本表。
ui/e2e/,命名为 *.e2e.spec.jse2e/helpers.js,测试文件应优先从该模块导入data-testid,不要断言可翻译的 UI 文案——语言随浏览器 locale 变化,文案断言换台机器就脆断fill() 通过 CDP 直接设置 value,绕过浏览器事件序列,导致 Vue v-model 响应式链断裂。
UTextarea 等复合组件,必须使用 e2e/helpers.js 中的 typeText() 或 pressSequentially()UInput(如登录表单)fill() 目前表现正常,但不保证所有 Nuxt UI 组件均如此ui/docs/e2e-troubleshooting.md 卡点 3playwright.config.js 中 headless: false,禁止改为 true。
WSL2 下 Chrome(headless 和 headed + WSLg)的动画帧渲染异常,导致 Playwright actionability "stable" 检查永远无法通过,所有 click() 超时。详见 ui/docs/e2e-troubleshooting.md 卡点 4。
playwright.config.js 中前端启动命令必须写 pnpm dev ...,不要写 pnpm --filter @coclaw/ui dev ...,否则会导致 webServer 启动异常或挂起。详见 ui/docs/e2e-troubleshooting.md 卡点 1。
vitest.config.js 必须排除 e2e/**,避免 pnpm test / pnpm coverage 误扫 Playwright 用例。详见 ui/docs/e2e-troubleshooting.md 卡点 2。
在本机用 headed Playwright 或弹 Electron 客户端做可视化测试 / 调试时,用户能否离开屏幕取决于驱动的是哪一层:
backgroundThrottling: false,被遮挡也不降帧。CDP 注入的输入与系统物理键盘是两条独立通道——用户在另一屏正常打字不会串进被测窗口,测试也无需抢占用户焦点(仅拉起 / 启动窗口那一下可能短暂夺焦)。用户可放心锁屏 / 切到别的 app。多屏把测试浏览器弹到副屏(不挡终端):
E2E_WINDOW_POSITION="x,y" > 本机专属文件 e2e/.window-position(gitignored)。坐标用 macOS 全局逻辑坐标(主屏左上角 0,0;副屏在右 x 为正、在左为负)。4K 屏跑 2x 缩放时逻辑宽是 1920 而非 3840,必须用逻辑值。screen.getAllDisplays() 实测各屏 bounds(受缩放影响,别按物理像素猜)。mainWindowState 记住,手动拖到副屏一次即留在那。详细分析见 ui/docs/e2e-troubleshooting.md 卡点 5–7 与 e2e/helpers.js 的 JSDoc:
await waitChatInputStable(page)——冷启动首屏的重渲染风暴会把已落键字符覆盖丢掉,别在页面刚加载就直接打字(机理见 helpers.js 该函数注释)。btn-stop 消失,别等 btn-send 出现——发送后输入框被清空,canSend 为 false,btn-send 不渲染(v-else-if="canSend"),等它可见会永远超时。
await expect(page.getByTestId('btn-stop')).not.toBeVisible({ timeout: 180_000 });[{type:'text', text:'...'}];evalStore 断言必须两种格式都处理(string 直接用,数组取 type==='text' 项的 text)。Date.now() 时间戳)。