opción
HogarHogar Skill Desarrollo web full-page-screenshot

full-page-screenshot

alirezarezvani/claude-skills 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 todo
0
Tiempo actualizado 27 de septiembre de 2026

Captura 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 WebSocket integrado)
  • 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)

  1. Mostrar las pestañas disponibles:
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --list
  1. 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 --url crea 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

  1. 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.

  2. 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.

  3. Activación de la carga diferida — Desplaza la ventana de visualización de forma incremental para activar las llamadas de retorno de IntersectionObserver y, a continuación, espera a que todos los elementos terminen de cargarse.

  4. 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.

  5. Detección automática de Chrome — Lee el archivo DevToolsActivePort para encontrar el puerto de depuración. Como alternativa, comprueba los puertos 9222, 9229 y 9333.

  6. 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/Playwright
  • engineering/performance-profiler — Análisis de rendimiento que puede complementar las capturas visuales
Ver en GitHub
---
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

Todos los archivos

2 archivos
SKILL.md 5.4k
Ver

Instalar full-page-screenshot

Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.

Descargar ZIP

Clona 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 Copiar
Configuración rápida: Copia la carpeta de la habilidad en .claude/skills/ Claude detectará y utilizará automáticamente la habilidad

Habilidades relacionadas

github-code-search
Tiempo actualizado 29 de junio de 2026
drizzle-orm
Tiempo actualizado 29 de junio de 2026
clickhouse-io
Tiempo actualizado 29 de junio de 2026
prisma-client-api
Tiempo actualizado 29 de junio de 2026
OR