# Skill global: probar interfaces web con Playwright ## Contexto El usuario trabaja siempre desde una sesión remota de VS Code (tunnel), sin display/GUI local. Necesita una forma de que Claude pueda **probar interfaces de aplicaciones web** (navegar, interactuar, verificar visualmente, detectar errores de consola) sin depender de un navegador con interfaz gráfica. Investigación realizada (read-only): - `~/.claude/skills/` solo tiene 3 skills globales hoy: `aleleba-pr`, `background-orchestrator`, `docmost-context`. Todas siguen el mismo formato: `SKILL.md` con frontmatter (`name`, `description`, `effort`, `argument-hint`) y cuerpo en Markdown. - No hay `playwright` ni `@playwright/cli` instalados (ni global ni cache `~/.cache/ms-playwright`), ni binarios `chromium`/`google-chrome` en el sistema. - No hay ningún MCP server de Playwright/Chrome DevTools configurado. - El plugin `c3po` (ya instalado en este entorno) trae un agente `browser.md` que usa `npx @playwright/cli` (headless por defecto, sesiones nombradas, artefactos a disco) — es un patrón ya probado en esta máquina, pero la nueva skill **no debe depender del plugin c3po** para que funcione en cualquier proyecto/entorno donde se invoque como skill global. - `npm config get prefix` apunta a un directorio de nvm en el home del usuario (`~/.nvm/versions/node/...`), así que `npm install -g` **no necesita sudo**. La instalación del navegador vía `npx @playwright/cli install-browser` tampoco. Solo `playwright install --with-deps` (deps de SO vía apt) podría requerir sudo — se trata como fallback, no como paso por defecto. ## Objetivo de la skill Crear `~/.claude/skills/web-ui-test/SKILL.md`, una skill **global** que: 1. Verifica si `@playwright/cli` (y su navegador Chromium) ya están instalados; si faltan, los instala de forma global de manera automática (sin pedir permiso adicional más allá del prompt normal de Bash); si ya están instalados, salta ese paso. 2. Usa el navegador **siempre en modo headless** (nunca `--headed`) porque el entorno es un tunnel remoto sin display. 3. Dirige un flujo estándar de prueba de interfaz: abrir sesión → snapshot/interactuar → capturar screenshots + snapshot de accesibilidad + errores de consola → cerrar sesión (siempre, incluso si algo falla). 4. Reporta resultados de forma concisa (rutas de artefactos + hallazgos), sin volcar contenido crudo (HTML/snapshot completo) al chat. ## Archivo a crear `~/.claude/skills/web-ui-test/SKILL.md` ### Frontmatter ```yaml --- name: web-ui-test description: >- Prueba interfaces de aplicaciones web (navegación, interacción, capturas, errores de consola) usando un navegador headless vía Playwright CLI — pensado para correr desde un tunnel remoto de VS Code sin GUI. Instala Playwright y su navegador automáticamente si no están presentes. Triggers: "prueba esta interfaz", "prueba la web app", "test this UI", "revisa la interfaz", "haz un smoke test", "prueba el flujo de login/registro/checkout", "captura screenshots de la app". effort: medium argument-hint: "[URL a probar, o descripción del flujo a validar]" --- ``` ### Cuerpo (secciones) **1. Preflight — verificar/instalar Playwright de forma global (idempotente, se salta si ya está listo)** ```bash # ¿@playwright/cli y playwright globales disponibles? npm ls -g --depth=0 2>/dev/null | grep -q "@playwright/cli" && CLI_OK=1 || CLI_OK=0 npm ls -g --depth=0 2>/dev/null | grep -qw "playwright" && PW_OK=1 || PW_OK=0 # ¿Navegador chromium ya descargado? ls ~/.cache/ms-playwright 2>/dev/null | grep -qi chromium && BROWSER_OK=1 || BROWSER_OK=0 ``` - Si `CLI_OK=0` o `PW_OK=0` → `npm install -g @playwright/cli playwright` (instalación global con `-g`; no requiere sudo en este entorno porque el prefix de npm es un directorio de nvm en el home del usuario). - Si `BROWSER_OK=0` → por defecto, `playwright install chromium` (usando el binario global instalado en el paso anterior, sin `--with-deps`: solo descarga el binario de Chromium, sin tocar paquetes del sistema operativo ni requerir sudo). - **Fallback automático (no por defecto)**: si al abrir una sesión con `@playwright/cli` el error indica librerías de sistema faltantes (ej. "missing libraries"/"host system is missing dependencies"), reintentar automáticamente, sin preguntar, con `playwright install --with-deps chromium` (o `sudo npx playwright install-deps chromium` si el anterior falla por permisos) y luego repetir la operación que falló. Este camino solo se dispara ante ese error concreto, nunca de forma preventiva. - Si todo ya está OK (`CLI_OK=1`, `PW_OK=1`, `BROWSER_OK=1`) → saltar directo al paso 2, sin ejecutar nada de instalación. **2. Reglas headless (no negociable)** - Nunca pasar `--headed` ni cambiar `PWDEBUG`. Este entorno no tiene display; todo corre headless. - Usar sesiones nombradas (`-s=`) en kebab-case para trazabilidad. **3. Ciclo de vida de sesión — abrir → interactuar → cerrar** Documentar (embebido, sin depender de archivos externos del plugin c3po) los comandos base de `npx @playwright/cli`, tomados del reference ya validado en este entorno (`~/.claude/plugins/cache/crew/c3po/0.4.1/agents/refs/playwright-cli.md`): - `open `, `goto`, `snapshot`, `click `, `fill "texto"`, `select`, `check/uncheck`, `press`, `hover`, `screenshot [--full-page] --filename ...`, `console error`, `network`, `eval "() => document.readyState"`, `close`, `close-all`, `kill-all`. - Patrón obligatorio: cerrar la sesión siempre al final, incluso si falló algún paso intermedio (equivalente a un `finally`). **4. Verificación de carga de página** Antes de interactuar, comprobar `document.readyState === "complete"` (máx. 3 reintentos con espera corta, sin `sleep` arbitrario). **5. Secuencia estándar de captura** ```bash mkdir -p .local/screenshots npx @playwright/cli -s=$SESSION open "$URL" npx @playwright/cli -s=$SESSION eval "() => document.readyState" npx @playwright/cli -s=$SESSION screenshot --filename .local/screenshots/$SESSION-viewport.png npx @playwright/cli -s=$SESSION screenshot --full-page --filename .local/screenshots/$SESSION-full.png npx @playwright/cli -s=$SESSION snapshot --filename .local/screenshots/$SESSION-snapshot.md npx @playwright/cli -s=$SESSION console error npx @playwright/cli -s=$SESSION close ``` Artefactos siempre a disco (`.local/screenshots/` en el directorio del proyecto actual), nunca volcar snapshots/HTML crudo al chat. **6. Flujos interactivos (cuando el usuario pide probar un flujo, no solo una página)** Loop snapshot → act (click/fill/select) → re-snapshot tras cada cambio de DOM (los refs quedan obsoletos tras mutaciones). Reportar cada paso relevante y detenerse si un elemento esperado no aparece tras 2 reintentos con snapshot fresco. **7. Detección de app local vs URL remota** - Si el usuario pide probar "la app" sin dar URL y hay un servidor de dev corriente/definible en el proyecto (package.json con script `dev`/`start`, etc.), primero levantar el servidor (reutilizar lo que ya haga la skill `run` si está disponible en ese proyecto) y esperar a que responda antes de abrir sesión de Playwright. - Si se da una URL explícita, usarla directamente. **8. Formato de reporte final** Resumen corto: URL probada, acciones realizadas, rutas de artefactos, errores de consola (o "ninguno"), hallazgos de UX/bugs si los hay. No pegar el snapshot completo ni el HTML en el chat. **9. Limpieza y recuperación** - Cerrar sesión siempre. Si el cierre falla, ejecutar `npx @playwright/cli kill-all` como recuperación. - Mencionar `npx @playwright/cli list` para ver sesiones huérfanas si algo quedó colgado de una corrida anterior. ## Verificación 1. Confirmar que el archivo quedó bien formado: `cat ~/.claude/skills/web-ui-test/SKILL.md` y revisar que el frontmatter parsea (mismo formato que `docmost-context/SKILL.md`). 2. Probar la skill de punta a punta contra una URL real (ej. `https://example.com`): - Primera corrida: debe detectar que Playwright no está instalado, instalarlo (`npm install -g @playwright/cli` + `npx @playwright/cli install-browser`), y luego completar la prueba. - Segunda corrida: debe saltarse la instalación (ya presente) e ir directo a abrir sesión/capturar. 3. Verificar que se generaron los artefactos esperados en `.local/screenshots/` (viewport png, full-page png, snapshot md) y que la sesión se cerró (`npx @playwright/cli list` no debe mostrarla activa). 4. Confirmar que el reporte en el chat es un resumen (no snapshot/HTML crudo).