full-page-screenshot
alirezarezvani/claude-skills
Réalisez des captures d'écran en pleine page de n'importe quelle page Web à l'aide du protocole Chrome DevTools, en prenant en charge les applications monopages (SPA), les images à chargement différé et les pages très longues, sans aucune dépendance externe.
...Développer toutCapture d'écran pleine page
Réalisez une capture d'écran pleine page de n'importe quelle page web via le protocole Chrome DevTools. Génère un fichier PNG unique contenant l'intégralité du contenu, y compris les parties nécessitant un défilement. Aucune dépendance externe hormis Node.js 22+ et Chrome avec le débogage à distance activé.
Prérequis
- Node.js 22+ (utilise
le WebSocketintégré) - Chrome/Chromium avec le débogage à distance activé
Vérification de la configuration de l’environnement :
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --check
Si la vérification de Chrome échoue, demandez à l'utilisateur d'ouvrir chrome://inspect/#remote-debugging et d'activer l'option « Autoriser le débogage à distance pour cette instance de navigateur ».
Déroulement
Option A : Capture d'écran d'un onglet déjà ouvert (recommandé pour les pages authentifiées)
- Lister les onglets disponibles :
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --list
- Identifiez la cible par son titre ou son URL, puis effectuez la capture :
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" /tmp/screenshot.png --width 1200 --dpr 1
Option B : Capture d'écran d'une URL (ouverture d'un onglet en arrière-plan, capture, fermeture)
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --url "https://example.com" /tmp/screenshot.png --width 1200 --dpr 1 --wait 15000
Remarque : le mode
--urlcrée un onglet en arrière-plan. Pour les pages nécessitant une authentification (SSO, pages de connexion), il est préférable d'utiliser l'option A.
Paramètres
| Paramètre | Description | Valeur par défaut |
|---|---|---|
sortie |
Chemin d'accès au fichier PNG de sortie | /tmp/screenshot.png |
--width |
Largeur de la fenêtre d'affichage en pixels CSS (articles : 1 200, tableaux de bord : 1 440-1 920) | 1200 |
--dpr |
Rapport de pixels de l'appareil (2 = Retina, mais taille de fichier 4x) | 1 |
--wait |
Délai d’attente pour le chargement de la page en ms (mode--url uniquement) |
15000 |
--css |
CSS personnalisé à injecter avant la capture (par ex. : masquer des éléments) | — |
Vérification du résultat
# macOS
sips -g pixelWidth -g pixelHeight /tmp/screenshot.png
# Linux
file /tmp/screenshot.png
Fonctionnalités principales
Expansion du conteneur de défilement SPA — Détecte les conteneurs
avec overflow-y: auto/scroll, les parcourt pour déclencher le chargement différé, puis supprime les contraintes de débordement (y comprish-[calc(...)]de Tailwind) afin que tout le contenu s’affiche en un seul passage.Détection de la stabilité du DOM — Une fois
readyState=completeatteint, surveille le nombre d’éléments DOM jusqu’à ce qu’il se stabilise. Cela garantit que les frameworks SPA ont fini de rendre le contenu dynamique.Déclenchement du chargement différé — Fait défiler la fenêtre d’affichage par incréments pour déclencher les callbacks
d’IntersectionObserver, puis attend que tous leséléments aient fini de se charger.Capture par tuiles pour les pages très hautes — Les pages dépassant 16 000 px sont capturées en tuiles de 8 000 px et assemblées automatiquement à l’aide de Python PIL. Si PIL n’est pas disponible, le système se rabat sur l’enregistrement séparé des tuiles.
Détection automatique de Chrome — Lit le fichier `
DevToolsActivePort` pour trouver le port de débogage. À défaut, interroge les ports 9 222, 9 229 et 9 333.Solution de secours pour le proxy CDP — Lorsqu’un proxy CDP gère le WebSocket du navigateur, le script utilise à la place les points de terminaison de l’API du proxy (
/eval,/screenshot,/scroll) pour la capture.
Fonctionnement
1. Détecter le port de débogage de Chrome
2. Se connecter via WebSocket (CDP)
3. Se connecter à la cible / créer un onglet en arrière-plan
4. Définir la largeur de la fenêtre d’affichage via le domaine d’émulation
5. Attendre : readyState + stabilité du DOM
6. Détecter et développer les conteneurs de défilement
7. Faire défiler la page (déclencher le chargement différé)
8. Attendre que les images soient entièrement chargées
9. Mesurer la hauteur finale du contenu
10. Page.captureScreenshot (ou capture en mosaïque)
11. Assembler les tuiles si nécessaire (PIL)
12. Restaurer la fenêtre d’affichage, se déconnecter, nettoyer
Anti-modèles
| À NE PAS FAIRE | Faites plutôt |
|---|---|
Utiliser --dpr 2 sur les pages de plus de 10 000 px de hauteur |
Utilisez --dpr 1 pour éviter les problèmes de mémoire dans Chrome |
Utilisez --url pour les pages nécessitant une authentification ou un SSO |
Utilisez --list + targetId sur un onglet où l'utilisateur est connecté |
Définissez --wait sur une valeur inférieure à 5 000 pour les SPA |
Les applications SPA ont besoin de temps pour récupérer les données et s’afficher ; utilisez une valeur comprise entre 10 000 et 15 000 |
Effectuez la capture sans vérifier au préalable avec l'option --check |
Vérifiez toujours que le débogage Chrome est disponible |
| Définissez en dur les largeurs de la fenêtre d'affichage pour toutes les pages | Utilisez 1 200 pour les articles, 1 440 ou plus pour les tableaux de bord/tableaux |
| Ignorez la vérification de la sortie | Toujours vérifier avec la commande sips ou file après la capture |
Dépannage
| Symptôme | Cause | Solution |
|---|---|---|
| « Impossible de trouver le port de débogage de Chrome » | Le débogage à distance n'est pas activé | Ouvrez chrome://inspect/#remote-debugging, activez-le |
| « Délai d'attente de la connexion WebSocket expiré » | Le proxy CDP maintient la connexion | Le script bascule automatiquement vers l'API du proxy |
| Capture d’écran vide/blanche | Page pas encore chargée | Augmenter la valeur de --wait |
| Truncé en bas | Conteneur de défilement non développé | Le script gère cela automatiquement ; signalez un problème si cela persiste |
| Mémoire insuffisante | Page très haute + DPR élevé | Réduisez la valeur de --dpr à 1 et/ou réduisez la valeur de --width |
| « PIL indisponible pour l'assemblage » | Python Pillow n'est pas installé | Installez-le avec ` pip3 install Pillow ` ou acceptez des fichiers de tuiles séparés |
Références croisées
engineering/browser-automation— Modèles généraux d’automatisation des navigateurs via CDP/Playwrightengineering/performance-profiler— Analyse des performances pouvant compléter les captures visuelles
---
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
Installer full-page-screenshot
Téléchargez et décompressez les fichiers de compétences dans votre répertoire .claude/skills/.
Télécharger le ZIPClonez le dépôt et copiez les fichiers de compétence dans votre projet.
git clone https://github.com/alirezarezvani/claude-skills/tree/main/engineering/skills/full-page-screenshot # Copy SKILL.md to your .claude/skills/ directory
Copier





Maison
