К основному содержанию
скилл CX Codex

puppeteer-automation — скилл для Claude Code: автоматизация браузера

Скилл для браузерной автоматизации на Puppeteer: навигация, клики, скриншоты, PDF и перехват сетевых запросов в headless Chrome.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add Mindrally/skills --skill puppeteer-automation -a claude-code
Открыть на GitHub

Что делает puppeteer-automation

Скилл задаёт агенту рамки работы с Puppeteer в Node.js: как открывать браузер, ждать динамический контент, выбирать элементы и корректно закрывать инстанс, чтобы не текла память. Внутри — разделы про навигацию, клики и ввод текста, формы, стратегии ожидания, скриншоты и генерацию PDF, перехват запросов, авторизацию и cookie.

Установка начинается с npm init -y и npm install puppeteer. Дальше скилл показывает базовую структуру скрипта с puppeteer.launch, try/finally и browser.close(), а также набор флагов запуска вроде --no-sandbox и --disable-dev-shm-usage. Отдельно разобраны режимы headless: 'new' и видимый браузер, slowMo для отладки и defaultViewport.

Ждать контент советует через waitForSelector, waitForFunction и waitForResponse, а waitForTimeout применять редко. Есть примеры интеграции с Jest и Mocha. Учтите: при setRequestInterception(true) каждый запрос нужно либо продолжить, либо прервать, иначе страница зависнет.

Какие задачи решает

  • снять скриншот страницы или отдельного элемента
  • сгенерировать PDF из HTML-страницы
  • собрать данные со страницы с динамической подгрузкой
  • заполнить форму и отправить её в headless Chrome
  • заблокировать картинки и стили, чтобы ускорить загрузку

Примеры запросов агенту

  • Напиши скрипт на Puppeteer: открой страницу, дождись таблицы и выгрузи все строки в JSON
  • Сделай полностраничный скриншот и сохрани его в screenshot.png
  • Настрой перехват запросов: блокируй изображения и стили, остальное пропускай дальше

Как установить puppeteer-automation

1Через Skills CLI (Vercel)

npx skills add Mindrally/skills --skill puppeteer-automation -a claude-code

2Вручную: положить файлы

~/.claude/skills/puppeteer-automation/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/puppeteer-automation/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о puppeteer-automation

Как установить puppeteer-automation в Claude?

Выполните npx skills add Mindrally/skills --skill puppeteer-automation -a claude-code. Скилл окажется в ~/.claude/skills/puppeteer-automation/SKILL.md.

Что делает puppeteer-automation?

Даёт агенту готовые приёмы работы с Puppeteer: навигацию, выбор элементов, ожидание динамического контента, скриншоты, PDF и перехват сетевых запросов.

Что нужно для работы скилла?

Node.js и установленный пакет puppeteer — в проекте выполняются npm init -y и npm install puppeteer.

Исходный текст

SKILL.md · Apache-2.0
---
name: puppeteer-automation
description: Expert guidance for browser automation using Puppeteer with best practices for web scraping, testing, screenshot capture, and JavaScript execution in headless Chrome.
metadata:
  maintainer: Mindrally
  source: https://github.com/Mindrally/skills
---

# Puppeteer Browser Automation

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

```bash
npm init -y
npm install puppeteer
```

### Basic Structure
```javascript
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

```javascript
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

```javascript
// Navigate to URL
await 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/forward
await page.goBack();
await page.goForward();

// Reload page
await page.reload({ waitUntil: 'networkidle2' });
```

## Element Selection

### Query Selectors
```javascript
// Single element
const element = await page.$('selector');

// Multiple elements
const elements = await page.$$('selector');

// Wait for element
const element = await page.waitForSelector('selector', {
  visible: true,
  timeout: 5000
});

// XPath selection
const elements = await page.$x('//xpath/expression');
```

### Evaluation in Page Context
```javascript
// Get text content
const text = await page.$eval('selector', el => el.textContent);

// Get attribute
const href = await page.$eval('a', el => el.getAttribute('href'));

// Multiple elements
const texts = await page.$$eval('.items', elements =>
  elements.map(el => el.textContent)
);

// Execute arbitrary JavaScript
const result = await page.evaluate(() => {
  return document.title;
});
```

## Page Interactions

### Clicking
```javascript
await page.click('button#submit');

// Click with options
await page.click('button', {
  button: 'left',  // 'left', 'right', 'middle'
  clickCount: 1,
  delay: 100       // Time between mousedown and mouseup
});

// Click and wait for navigation
await Promise.all([
  page.waitForNavigation(),
  page.click('a.nav-link')
]);
```

### Typing
```javascript
// Type text
await page.type('input#username', 'myuser', { delay: 50 });

// Clear and type
await page.click('input#username', { clickCount: 3 });
await page.type('input#username', 'newvalue');

// Press keys
await page.keyboard.press('Enter');
await page.keyboard.down('Shift');
await page.keyboard.press('Tab');
await page.keyboard.up('Shift');
```

### Form Handling
```javascript
// Select dropdown
await page.select('select#country', 'us');

// Check checkbox
await page.click('input[type="checkbox"]');

// File upload
const inputFile = await page.$('input[type="file"]');
await inputFile.uploadFile('/path/to/file.pdf');
```

## Waiting Strategies

```javascript
// Wait for selector
await page.waitForSelector('.loaded');

// Wait for selector to disappear
await page.waitForSelector('.loading', { hidden: true });

// Wait for function
await page.waitForFunction(
  () => document.querySelector('.count').textContent === '10'
);

// Wait for navigation
await page.waitForNavigation({ waitUntil: 'networkidle2' });

// Wait for network request
await page.waitForRequest(request =>
  request.url().includes('/api/data')
);

// Wait for network response
await page.waitForResponse(response =>
  response.url().includes('/api/data') && response.status() === 200
);

// Fixed timeout (use sparingly)
await page.waitForTimeout(1000);
```

## Screenshots and PDFs

### Screenshots
```javascript
// Full page screenshot
await page.screenshot({
  path: 'screenshot.png',
  fullPage: true
});

// Element screenshot
const element = await page.$('.chart');
await element.screenshot({ path: 'chart.png' });

// Screenshot options
await 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
```javascript
await page.pdf({
  path: 'document.pdf',
  format: 'A4',
  printBackground: true,
  margin: {
    top: '20px',
    right: '20px',
    bottom: '20px',
    left: '20px'
  }
});
```

## Network Interception

```javascript
// Enable request interception
await page.setRequestInterception(true);

page.on('request', request => {
  // Block images and stylesheets
  if (['image', 'stylesheet'].includes(request.resourceType())) {
    request.abort();
  } else {
    request.continue();
  }
});

// Modify requests
page.on('request', request => {
  request.continue({
    headers: {
      ...request.headers(),
      'X-Custom-Header': 'value'
    }
  });
});

// Monitor responses
page.on('response', async response => {
  if (response.url().includes('/api/')) {
    const data = await response.json();
    console.log('API Response:', data);
  }
});
```

## Authentication and Cookies

```javascript
// Basic HTTP authentication
await page.authenticate({
  username: 'user',
  password: 'pass'
});

// Set cookies
await page.setCookie({
  name: 'session',
  value: 'abc123',
  domain: 'example.com'
});

// Get cookies
const cookies = await page.cookies();

// Clear cookies
await page.deleteCookie({ name: 'session' });
```

## Browser Context and Multiple Pages

```javascript
// Create incognito context
const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();

// Multiple pages
const page1 = await browser.newPage();
const page2 = await browser.newPage();

// Get all pages
const pages = await browser.pages();

// Handle popups
page.on('popup', async popup => {
  await popup.waitForLoadState();
  console.log('Popup URL:', popup.url());
});
```

## Error Handling

```javascript
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

```javascript
// Disable unnecessary features
await page.setRequestInterception(true);
page.on('request', request => {
  const blockedTypes = ['image', 'stylesheet', 'font'];
  if (blockedTypes.includes(request.resourceType())) {
    request.abort();
  } else {
    request.continue();
  }
});

// Reuse browser instance
const 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 scraping
const 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

© Mindrally · Apache-2.0 · Mindrally/skills

Похожие скиллы

Все скиллы по теме «Браузер и парсинг» →
dev-browser SawyerHood Управляй настоящим Chrome через короткие скрипты Puppeteer. Именованные страницы сохраняются между запусками, так что можно продолжить работу с того же места. CX Codex +1 2 500установок qiaomu-opencli-browser joeseesun Управляет Google Chrome через терминал и использует уже открытые сессии без ввода паролей. Позволяет агенту кликать, заполнять формы и извлекать данные со страниц. CX Codex +1 1 100установок chrome-devtools-axi Kun Chen (kunchenguid) Скилл даёт агенту живую сессию Chrome: навигация, снимки страницы, клики, формы, скриншоты, консоль и сеть. Нужен, когда обычным запросом задачу не решить. CX Codex +1 6 900установок agent-browser vercel-labs Скилл управляет браузером через CLI: открывает страницы, заполняет формы, нажимает кнопки и проверяет веб-приложения. Подходит для задач, где агенту нужно действовать в интерфейсе. CX Codex +1 1 200 000установок lightpanda-browser reason-machines Скилл учит агента работать с Lightpanda: запускать headless-браузер на Zig, поднимать CDP-сервер и цеплять к нему Playwright или Puppeteer. CX Codex +1 1 500установок playwriter remorses Скилл управляет открытым Chrome через расширение Playwriter и код Playwright. Пригодится для сайтов с JavaScript, авторизацией и подгружаемым содержимым. CX Codex +1 5 800установок

Из того же набора168

redis-best-practices Набор практик и готовых паттернов для работы с Redis в Claude Code. Помогает настроить структуры данных, инвалидацию кэша и блокировки без ошибок. CX Codex +1 2 200установок machine-learning Скилл для разработки на JAX: подсказывает агенту функциональные приёмы, JIT и работу с ключами генератора случайных чисел. CX Codex +1 2 100установок typeorm Скилл задаёт агенту правила работы с TypeORM: сущности, связи, репозитории и миграции. Пригодится, когда проект на TypeScript с базой данных. CX Codex +1 2 000установок scrapy-web-scraping Скилл для ИИ-агента, который ведёт разработку краулеров на Scrapy: пауки, извлечение данных, пайплайны и настройки продакшена. CX Codex +1 2 000установок htmx Правила разработки на HTMX: агент пишет разметку с hx-атрибутами и отдаёт с сервера только нужные фрагменты HTML. CX Codex +1 1 700установок scss-best-practices Скилл задаёт правила вёрстки на SCSS: структуру файлов 7-1, правила вложенности селекторов, систему переменных и соглашения БЭМ. Помогает агенту писать чистые стили. CX Codex +1 1 700установок jwt-security Скилл задаёт агенту правила создания, проверки и хранения JWT: белый список алгоритмов, обязательные claim-ы, короткие сроки жизни токенов. CX Codex +1 1 600установок flask-python Набор правил по Flask для ИИ-ассистентов. Задаёт паттерны фабрики приложений, синтаксис Marshmallow и организацию маршрутов через блюпринты. CX Codex +1 1 500установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой