opción

puppeteer-automation

mindrally/skills 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 todo
15
Tiempo actualizado 25 de agosto de 2026

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

Ver en GitHub

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

  1. Always close browser instances in finally blocks
  2. Use waitForSelector before interacting with elements
  3. Prefer networkidle2 over networkidle0 for faster loads
  4. Use stealth plugin for anti-bot bypass
  5. Implement proper error handling and retries
  6. Monitor memory usage in long-running scripts
  7. Use browser context for isolated sessions
  8. Set reasonable timeouts for all operations

Todos los archivos

1 archivos
SKILL.md 9.2k
Ver

Instalar puppeteer-automation

Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.

Descargar ZIP

Clona 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 Copiar
Configuración rápida: Copia la carpeta de la habilidad en .claude/skills/. Claude la detectará automáticamente y la utilizará.
Repositorio mindrally/skills

Habilidades relacionadas

playwright-cli
Tiempo actualizado 29 de junio de 2026
frontend-testing-best-practices
Tiempo actualizado 7 de julio de 2026
Playwright Browser Automation
Tiempo actualizado 29 de junio de 2026
playwright-generate-test
Tiempo actualizado 29 de junio de 2026
OR