puppeteer-automation
mindrally/skills
Guía especializada sobre la automatización de navegadores mediante Puppeteer, con las mejores prácticas para la extracción de datos web, la realización de pruebas, la captura de capturas de pantalla y la ejecución de JavaScript en Chrome sin interfaz gráfica.
...Expandir todoAcerca de «puppeteer-automation»
Puppeteer-automation ofrece orientación especializada para la automatización de navegadores con Puppeteer en Chrome/Chromium, tanto en modo «headless» como «headful». Resuelve el problema de escribir scripts de automatización fiables en Node.js para tareas como el web scraping, las pruebas de interfaz de usuario, la captura de capturas de pantalla y archivos PDF, y la ejecución de JavaScript en un contexto de navegador real, haciendo hincapié en la robustez: uso adecuado de async/await, gestión de errores, estrategias de espera para contenido dinámico y una gestión limpia del ciclo de vida del navegador para evitar fugas de memoria.
La documentación es una referencia exhaustiva que abarca la configuración del proyecto, las opciones de inicio del navegador (incluidas opciones como --no-sandbox y la configuración de la ventana de visualización), la navegación por páginas con estrategias «waitUntil», la selección de elementos mediante selectores de consulta y XPath, la evaluación dentro de la página, las interacciones (clics, escritura, teclado, gestión de formularios, subida de archivos), estrategias de espera (waitForSelector, waitForFunction, waitForNavigation, esperas de solicitud/respuesta), la generación de capturas de pantalla y archivos PDF, la interceptación y modificación de solicitudes de red, y la autenticación con credenciales HTTP y cookies. Además, promueve prácticas recomendadas como el diseño modular y reutilizable, así como la integración con los marcos de pruebas Jest y Mocha.
Está dirigido a desarrolladores de Node.js, ingenieros de control de calidad y profesionales de la automatización que necesiten crear scripts en Chrome para el scraping, las pruebas o la generación de documentos. Entre los casos de uso se incluyen las pruebas automatizadas de extremo a extremo, la captura de capturas de pantalla de páginas o elementos, la generación de archivos PDF a partir de páginas web, la interceptación y supervisión del tráfico de red, y la extracción de datos estructurados. El contenido consiste en una guía de automatización estándar y legítima presentada en un único archivo SKILL.md; las técnicas de automatización que documenta son las mismas que se utilizan en los flujos de trabajo habituales de pruebas web y extracción de datos.
Preguntas frecuentes
¿Qué puedo hacer con esta skill?
Automatizar Chrome/Chromium con Puppeteer para la extracción de datos web, pruebas de la interfaz de usuario, captura de capturas de pantalla y archivos PDF, interceptación de red y ejecución de JavaScript en el navegador, utilizando patrones async/await limpios.
¿Cuáles son los requisitos previos?
Node.js y el paquete npm de Puppeteer (que se instala con el comando «npm install puppeteer»). Los ejemplos utilizan el modo sin interfaz gráfica con opciones de inicio como --no-sandbox y --disable-setuid-sandbox.
¿Cómo gestiona el contenido dinámico?
Mediante estrategias de espera robustas —waitForSelector (incluida la espera a que los elementos desaparezcan), waitForFunction, waitForNavigation y waitForRequest/waitForResponse— en lugar de tiempos de espera fijos, cuyo uso recomienda con moderación.
¿Puede generar capturas de pantalla y archivos PDF?
Sí: capturas de pantalla de página completa o de elementos (PNG/JPEG con opciones de recorte y calidad) y generación de archivos PDF con opciones de formato, impresión en segundo plano y márgenes.
¿Cubre aspectos relacionados con la red y la autenticación?
Sí: interceptación de solicitudes para bloquearlas o modificarlas, supervisión de respuestas, autenticación básica HTTP y configuración, lectura y borrado de 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
Instalar puppeteer-automation
Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.
Descargar ZIPClona el repositorio y copia los archivos de la habilidad a tu proyecto.
git clone https://github.com/Mindrally/skills/blob/main/puppeteer-automation/SKILL.md # Copy SKILL.md to your .claude/skills/ directory
Copiar





Hogar
