full-page-screenshot
alirezarezvani/claude-skills
Realiza capturas de pantalla a página completa de cualquier página web utilizando el protocolo Chrome DevTools, gestionando aplicaciones de página única (SPA), imágenes de carga diferida y páginas muy largas sin ninguna dependencia externa.
...Expandir todoCaptura de pantalla de página completa
Captura una captura de pantalla de página completa de cualquier página web mediante el protocolo Chrome DevTools. Genera un único archivo PNG que incluye todo el contenido, incluso las partes que requieren desplazamiento. Sin dependencias externas más allá de Node.js 22+ y Chrome con la depuración remota habilitada.
Requisitos previos
- Node.js 22+ (utiliza
WebSocketintegrado) - Chrome/Chromium con la depuración remota activada
Comprueba si el entorno está listo:
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --check
Si la comprobación de Chrome falla, indica al usuario que abra chrome://inspect/#remote-debugging y active «Permitir la depuración remota para esta instancia del navegador».
Flujo de trabajo
Opción A: Realizar una captura de pantalla de una pestaña ya abierta (recomendado para páginas autenticadas)
- Mostrar las pestañas disponibles:
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --list
- Identifica la pestaña de destino por título o URL y, a continuación, captura la imagen:
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" /tmp/screenshot.png --width 1200 --dpr 1
Opción B: Captura de pantalla de una URL (abre una pestaña en segundo plano, captura la imagen y la cierra)
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --url "https://example.com" /tmp/screenshot.png --width 1200 --dpr 1 --wait 15000
Nota: El modo
--urlcrea una pestaña en segundo plano. Para las páginas que requieran autenticación (SSO, pantallas de inicio de sesión), se debe utilizar la opción A.
Parámetros
| Parámetro | Descripción | Valor por defecto |
|---|---|---|
salida |
Ruta del archivo PNG de salida | /tmp/screenshot.png |
--width |
Ancho del área de visualización en píxeles CSS (artículos: 1200; paneles de control: 1440-1920) | 1200 |
--dpr |
Relación de píxeles del dispositivo (2 = Retina, pero el tamaño del archivo es 4 veces mayor) | 1 |
--wait |
Tiempo de espera para la carga de la página en ms (solo en modo--url ) |
15000 |
--css |
CSS personalizado que se insertará antes de la captura (p. ej., ocultar elementos) | — |
Comprobar el resultado
# macOS
sips -g pixelWidth -g pixelHeight /tmp/screenshot.png
# Linux
file /tmp/screenshot.png
Funcionalidades principales
Expansión del contenedor de desplazamiento en SPA — Detecta contenedores con
`overflow-y: auto/scroll`, se desplaza por ellos para activar la carga diferida y, a continuación, elimina las restricciones de desbordamiento (incluido`h-[calc(...)]`de Tailwind) para que todo el contenido se renderice en una sola pasada.Detección de la estabilidad del DOM — Tras
«readyState=complete», supervisa el recuento de elementos DOM hasta que se estabilice. Esto garantiza que los marcos de trabajo SPA terminen de renderizar el contenido dinámico.Activación de la carga diferida — Desplaza la ventana de visualización de forma incremental para activar las llamadas de retorno
de IntersectionObservery, a continuación, espera a que todos loselementos terminen de cargarse.Captura por mosaicos para páginas muy altas — Las páginas que superan los 16 000 píxeles se capturan en mosaicos de 8 000 píxeles y se unen automáticamente mediante Python PIL. Si PIL no está disponible, se recurre a guardar los mosaicos por separado.
Detección automática de Chrome — Lee el archivo
DevToolsActivePortpara encontrar el puerto de depuración. Como alternativa, comprueba los puertos 9222, 9229 y 9333.Solución alternativa para el proxy CDP: cuando un proxy CDP controla el WebSocket del navegador, el script recurre a los puntos finales de la API del proxy (
/eval,/screenshot,/scroll) para la captura.
Cómo funciona
1. Detectar el puerto de depuración de Chrome
2. Conectarse a través de WebSocket (CDP)
3. Adjuntarse a la página de destino / crear una pestaña en segundo plano
4. Establecer el ancho de la ventana de visualización a través del dominio de emulación
5. Esperar: readyState + estabilidad del DOM
6. Detectar y expandir los contenedores de desplazamiento
7. Desplazarse por la página (activar la carga diferida)
8. Esperar a que se carguen las imágenes
9. Medir la altura final del contenido
10. Page.captureScreenshot (o captura en mosaico)
11. Unir los mosaicos si es necesario (PIL)
12. Restaurar la ventana de visualización, desconectarse y limpiar
Antipatrones
| NO | Haz lo siguiente |
|---|---|
Utilizar --dpr 2 en páginas de más de 10 000 píxeles de altura |
Utiliza --dpr 1 para evitar problemas de memoria en Chrome |
Utiliza --url para páginas autenticadas o con SSO |
Utiliza --list + targetId en una pestaña en la que el usuario haya iniciado sesión |
Establece --wait por debajo de 5.000 para las aplicaciones SPA |
Las aplicaciones SPA necesitan tiempo para recuperar datos y cargarse; utiliza un valor de 10 000-15 000 |
Captura sin comprobar primero --check |
Comprueba siempre que la depuración de Chrome esté disponible |
| Establece anchos de ventana de visualización fijos para todas las páginas | Utiliza 1200 para los artículos y 1440 o más para los paneles de control y las tablas |
| Omite la verificación de la salida | Verifica siempre con el comando ` sips ` o `file ` tras la captura |
Solución de problemas
| Síntoma | Causa | Solución |
|---|---|---|
| «No se encuentra el puerto de depuración de Chrome» | La depuración remota no está habilitada | Abre chrome://inspect/#remote-debugging y actívala |
| «Tiempo de espera de la conexión WebSocket agotado» | El proxy CDP mantiene la conexión | El script recurre automáticamente a la API del proxy |
| Captura de pantalla en blanco | La página aún no se ha cargado | Aumenta el valor de --wait |
| Recortada en la parte inferior | El contenedor de desplazamiento no está expandido | El script se encarga de esto automáticamente; abre un ticket si el problema persiste |
| Sin memoria | Página muy alta + DPR elevado | Reduzca --dpr a 1 y/o reduzca --width |
| «PIL no disponible para la unión» | Pillow de Python no está instalado | Instálalo con «pip3 install Pillow » o acepta archivos de mosaicos independientes |
Referencias cruzadas
engineering/browser-automation— Patrones generales de automatización de navegadores mediante CDP/Playwrightengineering/performance-profiler— Análisis de rendimiento que puede complementar las capturas visuales
---
name: full-page-screenshot
description: Capture full-page screenshots of any web page using Chrome DevTools Protocol, handling SPAs, lazy-loaded images, and very tall pages with zero external dependencies.
---
# Full Page Screenshot
Capture a full-page screenshot of any web page via Chrome DevTools Protocol. Produces a single PNG that includes all content — even portions that require scrolling. Zero external dependencies beyond Node.js 22+ and Chrome with remote debugging enabled.
## Prerequisites
- **Node.js 22+** (uses built-in `WebSocket`)
- **Chrome/Chromium** with remote debugging enabled
Check environment readiness:
```bash
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --check
```
If Chrome check fails, instruct user to open `chrome://inspect/#remote-debugging` and enable **"Allow remote debugging for this browser instance"**.
## Workflow
### Option A: Screenshot an already-open tab (recommended for authenticated pages)
1. List available tabs:
```bash
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --list
```
2. Identify the target by title/URL, then capture:
```bash
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" <targetId> /tmp/screenshot.png --width 1200 --dpr 1
```
### Option B: Screenshot a URL (opens a background tab, captures, closes)
```bash
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --url "https://example.com" /tmp/screenshot.png --width 1200 --dpr 1 --wait 15000
```
> **Note:** `--url` mode creates a background tab. Pages requiring authentication (SSO, login walls) should use Option A instead.
### Parameters
| Parameter | Description | Default |
|-----------|-------------|---------|
| `output` | Output PNG file path | `/tmp/screenshot.png` |
| `--width` | Viewport width in CSS pixels (articles: 1200, dashboards: 1440-1920) | 1200 |
| `--dpr` | Device pixel ratio (2 = Retina, but 4x file size) | 1 |
| `--wait` | Page load timeout in ms (`--url` mode only) | 15000 |
| `--css` | Custom CSS to inject before capture (e.g., hide elements) | — |
### Verify Output
```bash
# macOS
sips -g pixelWidth -g pixelHeight /tmp/screenshot.png
# Linux
file /tmp/screenshot.png
```
## Core Capabilities
1. **SPA scroll container expansion** — Detects `overflow-y: auto/scroll` containers, scrolls through them to trigger lazy-loading, then removes overflow constraints (including Tailwind `h-[calc(...)]`) so all content renders in a single pass.
2. **DOM stability detection** — After `readyState=complete`, monitors DOM element count until it stabilizes. This ensures SPA frameworks finish rendering dynamic content.
3. **Lazy-load triggering** — Scrolls the viewport incrementally to fire `IntersectionObserver` callbacks, then waits for all `<img>` elements to complete loading.
4. **Tiled capture for very tall pages** — Pages exceeding 16,000px are captured in 8,000px tiles and automatically stitched using Python PIL. Falls back to saving tiles separately if PIL is unavailable.
5. **Auto-discovery of Chrome** — Reads `DevToolsActivePort` file to find the debugging port. Falls back to probing ports 9222, 9229, 9333.
6. **CDP Proxy fallback** — When a CDP proxy holds the browser WebSocket, the script falls back to proxy API endpoints (`/eval`, `/screenshot`, `/scroll`) for capture.
## How It Works
```
1. Discover Chrome debugging port
2. Connect via WebSocket (CDP)
3. Attach to target / create background tab
4. Set viewport width via Emulation domain
5. Wait: readyState + DOM stability
6. Detect & expand scroll containers
7. Scroll through page (trigger lazy-load)
8. Wait for images to complete
9. Measure final content height
10. Page.captureScreenshot (or tiled capture)
11. Stitch tiles if needed (PIL)
12. Restore viewport, detach, clean up
```
## Anti-Patterns
| Do NOT | Do instead |
|--------|-----------|
| Use `--dpr 2` on pages > 10,000px tall | Use `--dpr 1` to avoid Chrome memory issues |
| Use `--url` for authenticated/SSO pages | Use `--list` + targetId on a tab where user is logged in |
| Set `--wait` below 5000 for SPAs | SPAs need time to fetch data and render; use 10000-15000 |
| Capture without checking `--check` first | Always verify Chrome debugging is available |
| Hardcode viewport widths for all pages | Use 1200 for articles, 1440+ for dashboards/tables |
| Skip output verification | Always verify with `sips` or `file` command after capture |
## Troubleshooting
| Symptom | Cause | Fix |
|---------|-------|-----|
| "Cannot find Chrome debugging port" | Remote debugging not enabled | Open `chrome://inspect/#remote-debugging`, enable it |
| "WebSocket connection timeout" | CDP proxy holding the connection | Script auto-falls back to proxy API |
| Blank/white screenshot | Page not loaded yet | Increase `--wait` value |
| Truncated at bottom | Scroll container not expanded | Script handles this automatically; file an issue if it persists |
| Out of memory | Very tall page + high DPR | Reduce `--dpr` to 1 and/or reduce `--width` |
| "PIL not available for stitching" | Python Pillow not installed | Install with `pip3 install Pillow` or accept separate tile files |
## Cross-References
- [`engineering/browser-automation`](../browser-automation/SKILL.md) — General browser automation patterns via CDP/Playwright
- [`engineering/performance-profiler`](../performance-profiler/SKILL.md) — Performance analysis that may complement visual captures
Instalar full-page-screenshot
Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.
Descargar ZIPClona el repositorio y copia los archivos de la habilidad a tu proyecto.
git clone https://github.com/alirezarezvani/claude-skills/tree/main/engineering/skills/full-page-screenshot # Copy SKILL.md to your .claude/skills/ directory
Copiar





Hogar
