full-page-screenshot
alirezarezvani/claude-skills
Capture capturas de tela de página inteira de qualquer página da web usando o Protocolo do Chrome DevTools, lidando com SPAs, imagens carregadas de forma diferida e páginas muito altas, sem nenhuma dependência externa.
...Expandir tudoCaptura de tela de página inteira
Capture uma captura de tela de página inteira de qualquer página da web por meio do Protocolo do Chrome DevTools. Gera um único arquivo PNG que inclui todo o conteúdo — mesmo as partes que exigem rolagem. Sem dependências externas além do Node.js 22+ e do Chrome com depuração remota ativada.
Pré-requisitos
- Node.js 22+ (usa
WebSocketintegrado) - Chrome/Chromium com depuração remota ativada
Verifique se o ambiente está pronto:
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --check
Se a verificação do Chrome falhar, instrua o usuário a abrir chrome://inspect/#remote-debugging e habilitar “Permitir depuração remota para esta instância do navegador”.
Fluxo de trabalho
Opção A: Capturar a tela de uma aba já aberta (recomendado para páginas autenticadas)
- Listar as abas disponíveis:
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --list
- Identifique a guia de destino pelo título/URL e, em seguida, capture:
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" /tmp/screenshot.png --width 1200 --dpr 1
Opção B: Capturar a tela de uma URL (abre uma aba em segundo plano, captura e fecha)
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --url "https://example.com" /tmp/screenshot.png --width 1200 --dpr 1 --wait 15000
Observação: o modo
--urlcria uma aba em segundo plano. Páginas que exigem autenticação (SSO, telas de login) devem usar a Opção A.
Parâmetros
| Parâmetro | Descrição | Padrão |
|---|---|---|
saída |
Caminho do arquivo PNG de saída | /tmp/screenshot.png |
--width |
Largura da janela de visualização em pixels CSS (artigos: 1200, painéis: 1440-1920) | 1200 |
--dpr |
Proporção de pixels do dispositivo (2 = Retina, mas com tamanho de arquivo 4x maior) | 1 |
--wait |
Tempo limite de carregamento da página em ms (somente no modo--url ) |
15000 |
--css |
CSS personalizado a ser inserido antes da captura (por exemplo, ocultar elementos) | — |
Verificar saída
# macOS
sips -g pixelWidth -g pixelHeight /tmp/screenshot.png
# Linux
file /tmp/screenshot.png
Recursos principais
Expansão do contêiner de rolagem em SPAs — Detecta contêineres com
`overflow-y: auto/scroll`, percorre-os para acionar o carregamento diferido e, em seguida, remove as restrições de overflow (incluindo`h-[calc(...)]`do Tailwind) para que todo o conteúdo seja renderizado em uma única passagem.Detecção de estabilidade do DOM — Após
`readyState=complete`, monitora a contagem de elementos do DOM até que ela se estabilize. Isso garante que as estruturas SPA concluam a renderização do conteúdo dinâmico.Acionamento do carregamento diferido — Percorre a janela de visualização de forma incremental para disparar callbacks
do IntersectionObservere, em seguida, aguarda que todos oselementos concluírem o carregamento.Captura em blocos para páginas muito altas — Páginas com mais de 16.000 px são capturadas em blocos de 8.000 px e automaticamente unidas usando o Python PIL. Recorre ao salvamento de blocos separadamente se o PIL não estiver disponível.
Detecção automática do Chrome — Lê o arquivo
DevToolsActivePortpara localizar a porta de depuração. Recorre à verificação das portas 9.222, 9.229 e 9.333.Reserva para proxy CDP — Quando um proxy CDP mantém o WebSocket do navegador, o script recorre aos pontos de extremidade da API do proxy (
/eval,/screenshot,/scroll) para a captura.
Como funciona
1. Descobrir a porta de depuração do Chrome
2. Conectar-se via WebSocket (CDP)
3. Anexar ao alvo / criar aba em segundo plano
4. Definir a largura da janela de visualização por meio do domínio de emulação
5. Aguardar: readyState + estabilidade do DOM
6. Detectar e expandir contêineres de rolagem
7. Rolar pela página (acionar o carregamento diferido)
8. Aguardar até que as imagens sejam carregadas
9. Medir a altura final do conteúdo
10. Page.captureScreenshot (ou captura em blocos)
11. Unir os blocos, se necessário (PIL)
12. Restaurar a janela de visualização, desanexar e limpar
Antipadrões
| NÃO FAÇA | Faça assim |
|---|---|
Usar --dpr 2 em páginas com mais de 10.000 px de altura |
Use --dpr 1 para evitar problemas de memória no Chrome |
Use --url para páginas autenticadas/SSO |
Use --list + targetId em uma aba na qual o usuário esteja conectado |
Defina --wait abaixo de 5.000 para SPAs |
SPAs precisam de tempo para buscar dados e renderizar; use 10.000–15.000 |
Faça a captura sem verificar --check primeiro |
Sempre verifique se a depuração do Chrome está disponível |
| Defina fixamente as larguras da janela de visualização para todas as páginas | Use 1.200 para artigos e 1.440 ou mais para painéis/tabelas |
| Pule a verificação da saída | Sempre verifique com o comando ` sips ` ou ` file ` após a captura |
Solução de problemas
| Sintoma | Causa | Solução |
|---|---|---|
| “Não é possível localizar a porta de depuração do Chrome” | Depuração remota não está ativada | Acesse chrome://inspect/#remote-debugging e habilite-a |
| “Tempo limite da conexão WebSocket” | O proxy CDP está mantendo a conexão | O script recorre automaticamente à API do proxy |
| Captura de tela em branco/branca | Página ainda não carregada | Aumente o valor de --wait |
| Truncado na parte inferior | O contêiner de rolagem não está expandido | O script lida com isso automaticamente; abra um ticket se o problema persistir |
| Sem memória | Página muito alta + DPR elevado | Reduza --dpr para 1 e/ou reduza --width |
| “PIL indisponível para união” | O Pillow do Python não está instalado | Instale com pip3 install Pillow ou aceite arquivos de blocos separados |
Referências cruzadas
engineering/browser-automation— Padrões gerais de automação de navegadores via CDP/Playwrightengineering/performance-profiler— Análise de desempenho que pode complementar as capturas visuais
---
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
Baixe e extraia os arquivos de habilidades para o diretório .claude/skills/.
Baixar ZIPClone o repositório e copie os arquivos da habilidade para o seu projeto.
git clone https://github.com/alirezarezvani/claude-skills/tree/main/engineering/skills/full-page-screenshot # Copy SKILL.md to your .claude/skills/ directory
Copiar





Lar
