option
MaisonMaison Skill Développement Web full-page-screenshot

full-page-screenshot

alirezarezvani/claude-skills 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 tout
0
Heure mise à jour 27 septembre 2026

Capture 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 WebSocket inté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)

  1. Lister les onglets disponibles :
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --list
  1. 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 --url cré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

  1. 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 compris h-[calc(...)] de Tailwind) afin que tout le contenu s’affiche en un seul passage.

  2. Détection de la stabilité du DOM — Une fois readyState=complete atteint, 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.

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

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

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

  6. 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/Playwright
  • engineering/performance-profiler — Analyse des performances pouvant compléter les captures visuelles
Voir sur 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

Tous les fichiers

2 fichiers
SKILL.md 5.4k
Voir

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 ZIP

Clonez 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 Copier
Configuration rapide: Copiez le dossier de la compétence dans .claude/skills/ Claude détectera automatiquement la compétence et l'utilisera

Compétences similaires

github-code-search
Heure mise à jour 29 juin 2026
drizzle-orm
Heure mise à jour 29 juin 2026
clickhouse-io
Heure mise à jour 29 juin 2026
prisma-client-api
Heure mise à jour 29 juin 2026
OR