вариант

puppeteer-automation

mindrally/skills mindrally/skills

Рекомендации экспертов по автоматизации работы браузера с помощью Puppeteer, включая передовые методы веб-парсинга, тестирования, создания снимков экрана и выполнения кода JavaScript в «безголовом» Chrome.

...Расширить все
15
Обновлено время 25 августа 2026 г.

О сайте «puppeteer-automation»

Puppeteer-automation предоставляет экспертные рекомендации по автоматизации браузера с помощью Puppeteer в режимах headless или headful Chrome/Chromium. Она решает проблему написания надёжных скриптов автоматизации на Node.js для таких задач, как веб-парсинг, тестирование пользовательского интерфейса, создание скриншотов и вывод в PDF, а также выполнение JavaScript в реальном контексте браузера, уделяя особое внимание надёжности — правильному использованию async/await, обработке ошибок, стратегиям ожидания динамического контента и чистому управлению жизненным циклом браузера для предотвращения утечек памяти.

Документация представляет собой исчерпывающее руководство, охватывающее настройку проекта, параметры запуска браузера (включая флаги, такие как --no-sandbox и настройку viewport), навигацию по страницам с использованием стратегий waitUntil, выбор элементов с помощью селекторов запросов и XPath, оценку внутри страницы, взаимодействия (щелчки, ввод текста, клавиатура, обработка форм, загрузка файлов), стратегии ожидания (waitForSelector, waitForFunction, waitForNavigation, ожидание запросов/ответов), создание скриншотов и PDF-файлов, перехват и модификация сетевых запросов, а также аутентификация с помощью учетных данных HTTP и файлов cookie. Кроме того, в ней пропагандируются передовые практики, такие как модульный, многоразовый дизайн и интеграция с тестовыми фреймворками Jest и Mocha.

Курс предназначен для разработчиков Node.js, инженеров по контролю качества и специалистов по автоматизации, которым требуется создавать скрипты для Chrome с целью извлечения данных, тестирования или генерации документов. Среди вариантов использования — автоматизированное сквозное тестирование, создание скриншотов страниц или элементов, генерация PDF-файлов из веб-страниц, перехват и мониторинг сетевого трафика, а также извлечение структурированных данных. Содержание представляет собой стандартные, обоснованные рекомендации по автоматизации, представленные в виде одного файла SKILL.md; описанные в нём методы автоматизации являются теми же, что используются в основных рабочих процессах веб-тестирования и извлечения данных.

Часто задаваемые вопросы

Что я могу делать с помощью этого навыка?

Автоматизировать работу Chrome/Chromium с помощью Puppeteer для извлечения данных из веб-страниц, тестирования пользовательского интерфейса, создания скриншотов и PDF-файлов, перехвата сетевого трафика и выполнения JavaScript в браузере с использованием «чистых» шаблонов async/await.

Каковы предварительные требования?

Node.js и пакет npm puppeteer (устанавливается с помощью команды «npm install puppeteer»). В примерах используется «безголовый» режим с флагами запуска, такими как --no-sandbox и --disable-setuid-sandbox.

Как он обрабатывает динамический контент?

С помощью надёжных стратегий ожидания — waitForSelector (включая ожидание исчезновения элементов), waitForFunction, waitForNavigation и waitForRequest/waitForResponse — а не фиксированных таймаутов, которые рекомендуется использовать с осторожностью.

Может ли он создавать скриншоты и PDF-файлы?

Да — скриншоты всей страницы или отдельных элементов (в форматах PNG/JPEG с настройками обрезки и качества), а также создание PDF-файлов с настройками формата, печати фона и полей.

Поддерживает ли он работу с сетью и аутентификацию?

Да — перехват запросов для их блокировки или изменения, мониторинг ответов, базовая аутентификация по HTTP, а также установка, чтение и очистка файлов cookie.

Посмотреть на 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

Все файлы

1 файлов

Установить puppeteer-automation

Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.

Скачать ZIP

Клонируйте репозиторий и скопируйте файлы навыка в свой проект.

git clone https://github.com/Mindrally/skills/blob/main/puppeteer-automation/SKILL.md # Copy SKILL.md to your .claude/skills/ directory

Копировать Копировать
Быстрая настройка: Скопируйте папку со скиллом в каталог .claude/skills/ — Claude автоматически обнаружит и начнет использовать этот скилл
Репозиторий mindrally/skills

Похожие навыки

playwright-cli
Обновлено время 29 июня 2026 г.
frontend-testing-best-practices
Обновлено время 7 июля 2026 г.
Playwright Browser Automation
Обновлено время 29 июня 2026 г.
playwright-generate-test
Обновлено время 29 июня 2026 г.
OR