full-page-screenshot
alirezarezvani/claude-skills
Erstellen Sie ganzseitige Screenshots beliebiger Webseiten mithilfe des Chrome DevTools-Protokolls – auch bei SPAs, verzögert geladenen Bildern und sehr langen Seiten – ganz ohne externe Abhängigkeiten.
...Alle erweiternGanzseitiger Screenshot
Erstellen Sie über das Chrome DevTools-Protokoll einen ganzseitigen Screenshot einer beliebigen Webseite. Das Ergebnis ist eine einzelne PNG-Datei, die den gesamten Inhalt enthält – auch Bereiche, für die gescrollt werden muss. Es sind keine externen Abhängigkeiten erforderlich, außer Node.js 22+ und Chrome mit aktiviertem Remote-Debugging.
Voraussetzungen
- Node.js 22+ (nutzt integriertes
WebSocket) - Chrome/Chromium mit aktiviertem Remote-Debugging
Überprüfen Sie die Bereitschaft der Umgebung:
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --check
Falls die Chrome-Prüfung fehlschlägt, weisen Sie den Benutzer an, chrome://inspect/#remote-debugging zu öffnen und „Remote-Debugging für diese Browser-Instanz zulassen“ zu aktivieren.
Ablauf
Option A: Screenshot eines bereits geöffneten Tabs erstellen (empfohlen für authentifizierte Seiten)
- Verfügbare Tabs auflisten:
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --list
- Identifizieren Sie das Ziel anhand des Titels/der URL und erstellen Sie dann einen Screenshot:
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" /tmp/screenshot.png --width 1200 --dpr 1
Option B: Screenshot einer URL erstellen (öffnet einen Hintergrund-Tab, erstellt den Screenshot, schließt den Tab)
node "${SKILL_DIR}/scripts/full-page-screenshot.mjs" --url "https://example.com" /tmp/screenshot.png --width 1200 --dpr 1 --wait 15000
Hinweis: Der Modus
„--url“erstellt einen Hintergrund-Tab. Für Seiten, die eine Authentifizierung erfordern (SSO, Anmeldeaufforderungen), sollte stattdessen Option A verwendet werden.
Parameter
| Parameter | Beschreibung | Standard |
|---|---|---|
Ausgabe |
Pfad zur PNG-Ausgabedatei | /tmp/screenshot.png |
--width |
Breite des Viewports in CSS-Pixeln (Artikel: 1200, Dashboards: 1440–1920) | 1200 |
--dpr |
Gerätepixelverhältnis (2 = Retina, jedoch 4-fache Dateigröße) | 1 |
--wait |
Zeitlimit für das Laden der Seite in ms (nur im--url- Modus) |
15000 |
--css |
Benutzerdefiniertes CSS, das vor der Erfassung eingefügt werden soll (z. B. zum Ausblenden von Elementen) | — |
Ausgabe überprüfen
# macOS
sips -g pixelWidth -g pixelHeight /tmp/screenshot.png
# Linux
file /tmp/screenshot.png
Kernfunktionen
Erweiterung des SPA-Scroll-Containers — Erkennt Container
mit „overflow: auto/scroll“, scrollt durch diese, um Lazy-Loading auszulösen, und entfernt anschließend Überlaufbeschränkungen (einschließlich Tailwindh-[calc(...)]), sodass der gesamte Inhalt in einem einzigen Durchgang gerendert wird.Erkennung der DOM-Stabilität — Überwacht nach
„readyState=complete“die Anzahl der DOM-Elemente, bis sie sich stabilisiert hat. Dadurch wird sichergestellt, dass SPA-Frameworks das Rendern dynamischer Inhalte abgeschlossen haben.Auslösen des Lazy-Loading — Scrollt den Viewport schrittweise, um
IntersectionObserver-Callbacks auszulösen, und wartet anschließend, bis alleElemente vollständig geladen sind.Kachelbasierte Erfassung für sehr hohe Seiten – Seiten, die 16.000 px überschreiten, werden in 8.000-px-Kacheln erfasst und automatisch mit Python PIL zusammengefügt. Wenn PIL nicht verfügbar ist, werden die Kacheln stattdessen separat gespeichert.
Automatische Erkennung von Chrome — Liest die Datei
„DevToolsActivePort“, um den Debugging-Port zu ermitteln. Greift andernfalls auf die Ports 9222, 9229 und 9333 zurück.CDP-Proxy-Fallback – Wenn ein CDP-Proxy den WebSocket des Browsers verwaltet, greift das Skript für die Erfassung auf die Endpunkte der Proxy-API (
/eval,/screenshot,/scroll) zurück.
So funktioniert es
1. Chrome-Debugging-Port ermitteln
2. Verbindung über WebSocket (CDP) herstellen
3. An Ziel anhängen / Hintergrund-Tab erstellen
4. Viewport-Breite über Emulationsdomäne festlegen
5. Warten: `readyState` + DOM-Stabilität
6. Scroll-Container erkennen und erweitern
7. Durch die Seite scrollen (Lazy-Load auslösen)
8. Warten, bis alle Bilder geladen sind
9. Endgültige Inhaltshöhe messen
10. `Page.captureScreenshot` (oder kachelweise Erfassung)
11. Kacheln bei Bedarf zusammenfügen (PIL)
12. Viewport wiederherstellen, Verbindung trennen, aufräumen
Anti-Muster
| NICHT tun | Stattdessen |
|---|---|
Verwenden Sie --dpr 2 nicht bei Seiten mit einer Höhe von mehr als 10.000 px |
Verwende --dpr 1, um Speicherprobleme in Chrome zu vermeiden |
Verwende „--url“ für authentifizierte Seiten oder Seiten mit SSO |
Verwende „--list“ + „targetId“ auf einem Tab, auf dem der Benutzer angemeldet ist |
Stellen Sie „--wait“ für SPAs auf einen Wert unter 5.000 ein |
SPAs benötigen Zeit zum Abrufen von Daten und zum Rendern; verwende 10.000–15.000 |
Erfassen Sie die Daten, ohne zuvor --check zu überprüfen |
Stellen Sie stets sicher, dass das Chrome-Debugging verfügbar ist |
| Legen Sie die Viewport-Breiten für alle Seiten fest | Verwende 1200 für Artikel, 1440+ für Dashboards/Tabellen |
| Überspringen Sie die Ausgabeüberprüfung | Überprüfen Sie nach der Erfassung immer mit dem Befehl „sips“ oder „file“ |
Fehlerbehebung
| Symptom | Ursache | Behebung |
|---|---|---|
| „Chrome-Debugging-Port nicht gefunden“ | Remote-Debugging ist nicht aktiviert | Öffnen Sie chrome://inspect/#remote-debugging und aktivieren Sie die Funktion |
| „Zeitüberschreitung bei der WebSocket-Verbindung“ | CDP-Proxy hält die Verbindung aufrecht | Das Skript weicht automatisch auf die Proxy-API zurück |
| Leerer/weißer Screenshot | Seite noch nicht geladen | Erhöhen Sie den Wert von --wait |
| Unten abgeschnitten | Scroll-Container nicht erweitert | Das Skript erledigt dies automatisch; melden Sie ein Problem, falls es weiterhin auftritt |
| Nicht genügend Arbeitsspeicher | Sehr hohe Seite + hoher DPR | Reduzieren Sie --dpr auf 1 und/oder verringern Sie --width |
| „PIL steht für das Zusammenfügen nicht zur Verfügung“ | Python Pillow ist nicht installiert | Mit ` pip3 install Pillow ` installieren oder separate Kachel-Dateien akzeptieren |
Querverweise
engineering/browser-automation— Allgemeine Muster zur Browser-Automatisierung über CDP/Playwrightengineering/performance-profiler— Leistungsanalyse, die visuelle Aufzeichnungen ergänzen kann
---
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
full-page-screenshot installieren
Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.
ZIP herunterladenKlonen Sie das Repository und kopieren Sie die Skill-Dateien in Ihr Projekt.
git clone https://github.com/alirezarezvani/claude-skills/tree/main/engineering/skills/full-page-screenshot # Copy SKILL.md to your .claude/skills/ directory
Kopieren





Heim
