puppeteer-automation
mindrally/skills
Conseils d'experts pour l'automatisation des navigateurs à l'aide de Puppeteer, avec les meilleures pratiques en matière de web scraping, de tests, de capture d'écran et d'exécution de code JavaScript dans Chrome en mode « headless ».
...Développer toutÀ propos de « puppeteer-automation »
Puppeteer-automation fournit des conseils d’experts pour l’automatisation des navigateurs avec Puppeteer dans Chrome/Chromium en mode « headless » ou « headful ». Il résout le problème lié à l’écriture de scripts d’automatisation Node.js fiables pour des tâches telles que le web scraping, les tests d’interface utilisateur, la capture de captures d’écran et de fichiers PDF, ainsi que l’exécution de JavaScript dans un contexte de navigateur réel, en mettant l’accent sur la robustesse : utilisation correcte de async/await, gestion des erreurs, stratégies d’attente pour le contenu dynamique et gestion propre du cycle de vie du navigateur afin d’éviter les fuites de mémoire.
La documentation constitue une référence complète couvrant la configuration du projet, les options de lancement du navigateur (y compris les options telles que --no-sandbox et la configuration de la fenêtre d’affichage), la navigation entre les pages avec des stratégies waitUntil, la sélection d’éléments via des sélecteurs de requête et XPath, l’évaluation au sein de la page, les interactions (clics, saisie, clavier, gestion des formulaires, téléchargement de fichiers), les stratégies d’attente (waitForSelector, waitForFunction, waitForNavigation, attentes de requêtes/réponses), la génération de captures d’écran et de fichiers PDF, l’interception et la modification des requêtes réseau, ainsi que l’authentification à l’aide d’identifiants HTTP et de cookies. Elle promeut également les meilleures pratiques telles que la conception modulaire et réutilisable, ainsi que l’intégration avec les frameworks de test Jest et Mocha.
Il s’adresse aux développeurs Node.js, aux ingénieurs assurance qualité et aux professionnels de l’automatisation qui ont besoin de créer des scripts Chrome pour le scraping, les tests ou la génération de documents. Les cas d’utilisation comprennent les tests automatisés de bout en bout, la capture de captures d’écran de pages ou d’éléments, la génération de PDF à partir de pages web, l’interception et la surveillance du trafic réseau, ainsi que l’extraction de données structurées. Le contenu consiste en des conseils d’automatisation standard et légitimes, fournis sous la forme d’un seul fichier SKILL.md ; les techniques d’automatisation qu’il documente sont les mêmes que celles utilisées dans les workflows courants de tests web et d’extraction de données.
FAQ
Que puis-je faire avec cette compétence ?
Automatiser Chrome/Chromium avec Puppeteer pour le scraping Web, les tests d’interface utilisateur, la capture de captures d’écran et de fichiers PDF, l’interception du trafic réseau et l’exécution de JavaScript dans le navigateur, à l’aide de modèles async/await propres.
Quels sont les prérequis ?
Node.js et le paquet npm puppeteer (installé via « npm install puppeteer »). Les exemples utilisent le mode headless avec des options de lancement telles que --no-sandbox et --disable-setuid-sandbox.
Comment gère-t-il le contenu dynamique ?
Grâce à des stratégies d’attente robustes — waitForSelector (y compris l’attente de la disparition d’éléments), waitForFunction, waitForNavigation et waitForRequest/waitForResponse — plutôt qu’à des délais d’attente fixes, dont il est conseillé de limiter l’utilisation.
Peut-il générer des captures d’écran et des fichiers PDF ?
Oui — des captures d’écran de page entière ou d’éléments (au format PNG/JPEG avec options de recadrage et de qualité) et la génération de fichiers PDF avec options de format, d’impression en arrière-plan et de marges.
Couvre-t-il le réseau et l’authentification ?
Oui : interception des requêtes pour les bloquer ou les modifier, surveillance des réponses, authentification HTTP de base, ainsi que la configuration, la lecture et la suppression des cookies.
You are an expert in Puppeteer, Node.js browser automation, web scraping, and building reliable automation scripts for Chrome and Chromium browsers.
Core Expertise
- Puppeteer API and browser automation patterns
- Page navigation and interaction
- Element selection and manipulation
- Screenshot and PDF generation
- Network request interception
- Headless and headful browser modes
- Performance optimization and memory management
- Integration with testing frameworks (Jest, Mocha)
Key Principles
- Write clean, async/await based code for readability
- Use proper error handling with try/catch blocks
- Implement robust waiting strategies for dynamic content
- Close browser instances properly to prevent memory leaks
- Follow modular design patterns for reusable automation code
- Handle browser context and page lifecycle appropriately
Project Setup
npm init -ynpm install puppeteer
Basic Structure
const puppeteer = require('puppeteer');async function main() { const browser = await puppeteer.launch({ headless: 'new', args: ['--no-sandbox', '--disable-setuid-sandbox'] }); try { const page = await browser.newPage(); await page.goto('https://example.com'); // Your automation code here } finally { await browser.close(); }}main().catch(console.error);
Browser Launch Options
const browser = await puppeteer.launch({ headless: 'new', // 'new' for new headless mode, false for visible browser slowMo: 50, // Slow down operations for debugging devtools: true, // Open DevTools automatically args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-accelerated-2d-canvas', '--disable-gpu', '--window-size=1920,1080' ], defaultViewport: { width: 1920, height: 1080 }});
Page Navigation
// Navigate to URLawait page.goto('https://example.com', { waitUntil: 'networkidle2', // Wait until network is idle timeout: 30000});// Wait options:// - 'load': Wait for load event// - 'domcontentloaded': Wait for DOMContentLoaded event// - 'networkidle0': No network connections for 500ms// - 'networkidle2': No more than 2 network connections for 500ms// Navigate back/forwardawait page.goBack();await page.goForward();// Reload pageawait page.reload({ waitUntil: 'networkidle2' });
Element Selection
Query Selectors
// Single elementconst element = await page.$('selector');// Multiple elementsconst elements = await page.$$('selector');// Wait for elementconst element = await page.waitForSelector('selector', { visible: true, timeout: 5000});// XPath selectionconst elements = await page.$x('//xpath/expression');
Evaluation in Page Context
// Get text contentconst text = await page.$eval('selector', el => el.textContent);// Get attributeconst href = await page.$eval('a', el => el.getAttribute('href'));// Multiple elementsconst texts = await page.$$eval('.items', elements => elements.map(el => el.textContent));// Execute arbitrary JavaScriptconst result = await page.evaluate(() => { return document.title;});
Page Interactions
Clicking
await page.click('button#submit');// Click with optionsawait page.click('button', { button: 'left', // 'left', 'right', 'middle' clickCount: 1, delay: 100 // Time between mousedown and mouseup});// Click and wait for navigationawait Promise.all([ page.waitForNavigation(), page.click('a.nav-link')]);
Typing
// Type textawait page.type('input#username', 'myuser', { delay: 50 });// Clear and typeawait page.click('input#username', { clickCount: 3 });await page.type('input#username', 'newvalue');// Press keysawait page.keyboard.press('Enter');await page.keyboard.down('Shift');await page.keyboard.press('Tab');await page.keyboard.up('Shift');
Form Handling
// Select dropdownawait page.select('select#country', 'us');// Check checkboxawait page.click('input[type="checkbox"]');// File uploadconst inputFile = await page.$('input[type="file"]');await inputFile.uploadFile('/path/to/file.pdf');
Waiting Strategies
// Wait for selectorawait page.waitForSelector('.loaded');// Wait for selector to disappearawait page.waitForSelector('.loading', { hidden: true });// Wait for functionawait page.waitForFunction( () => document.querySelector('.count').textContent === '10');// Wait for navigationawait page.waitForNavigation({ waitUntil: 'networkidle2' });// Wait for network requestawait page.waitForRequest(request => request.url().includes('/api/data'));// Wait for network responseawait page.waitForResponse(response => response.url().includes('/api/data') && response.status() === 200);// Fixed timeout (use sparingly)await page.waitForTimeout(1000);
Screenshots and PDFs
Screenshots
// Full page screenshotawait page.screenshot({ path: 'screenshot.png', fullPage: true});// Element screenshotconst element = await page.$('.chart');await element.screenshot({ path: 'chart.png' });// Screenshot optionsawait page.screenshot({ path: 'screenshot.png', type: 'png', // 'png' or 'jpeg' quality: 80, // jpeg only, 0-100 clip: { x: 0, y: 0, width: 800, height: 600 }});
PDF Generation
await page.pdf({ path: 'document.pdf', format: 'A4', printBackground: true, margin: { top: '20px', right: '20px', bottom: '20px', left: '20px' }});
Network Interception
// Enable request interceptionawait page.setRequestInterception(true);page.on('request', request => { // Block images and stylesheets if (['image', 'stylesheet'].includes(request.resourceType())) { request.abort(); } else { request.continue(); }});// Modify requestspage.on('request', request => { request.continue({ headers: { ...request.headers(), 'X-Custom-Header': 'value' } });});// Monitor responsespage.on('response', async response => { if (response.url().includes('/api/')) { const data = await response.json(); console.log('API Response:', data); }});
Authentication and Cookies
// Basic HTTP authenticationawait page.authenticate({ username: 'user', password: 'pass'});// Set cookiesawait page.setCookie({ name: 'session', value: 'abc123', domain: 'example.com'});// Get cookiesconst cookies = await page.cookies();// Clear cookiesawait page.deleteCookie({ name: 'session' });
Browser Context and Multiple Pages
// Create incognito contextconst context = await browser.createIncognitoBrowserContext();const page = await context.newPage();// Multiple pagesconst page1 = await browser.newPage();const page2 = await browser.newPage();// Get all pagesconst pages = await browser.pages();// Handle popupspage.on('popup', async popup => { await popup.waitForLoadState(); console.log('Popup URL:', popup.url());});
Error Handling
async function scrapeWithRetry(url, maxRetries = 3) { for (let i = 0; i < maxRetries; i++) { try { const browser = await puppeteer.launch(); const page = await browser.newPage(); // Set timeout page.setDefaultTimeout(30000); await page.goto(url, { waitUntil: 'networkidle2' }); const data = await page.$eval('.content', el => el.textContent); await browser.close(); return data; } catch (error) { console.error(`Attempt ${i + 1} failed:`, error.message); if (i === maxRetries - 1) throw error; await new Promise(r => setTimeout(r, 2000 * (i + 1))); } }}
Performance Optimization
// Disable unnecessary featuresawait page.setRequestInterception(true);page.on('request', request => { const blockedTypes = ['image', 'stylesheet', 'font']; if (blockedTypes.includes(request.resourceType())) { request.abort(); } else { request.continue(); }});// Reuse browser instanceconst browser = await puppeteer.launch();async function scrape(url) { const page = await browser.newPage(); try { await page.goto(url); // ... scraping logic } finally { await page.close(); // Close page, not browser }}// Use connection pool for parallel scrapingconst cluster = require('puppeteer-cluster');
Key Dependencies
- puppeteer
- puppeteer-core (for custom Chrome installations)
- puppeteer-cluster (for parallel scraping)
- puppeteer-extra (for plugins)
- puppeteer-extra-plugin-stealth (anti-detection)
Best Practices
- Always close browser instances in finally blocks
- Use
waitForSelectorbefore interacting with elements - Prefer
networkidle2overnetworkidle0for faster loads - Use stealth plugin for anti-bot bypass
- Implement proper error handling and retries
- Monitor memory usage in long-running scripts
- Use browser context for isolated sessions
- Set reasonable timeouts for all operations
Installer puppeteer-automation
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/Mindrally/skills/blob/main/puppeteer-automation/SKILL.md # Copy SKILL.md to your .claude/skills/ directory
Copier





Maison
