Puppeteer — это библиотека для управления браузером Chrome или Chromium через DevTools Protocol. Она широко используется для автоматизированного тестирования веб-приложений, сбора данных и эмуляции пользовательских действий. Часто возникает необходимость выполнять тесты или скрипты периодически, без ручного запуска. Для таких целей применяют систему cron.
Cron — это планировщик задач в Unix-подобных системах, позволяющий запускать команды по расписанию. Каждое задание описывается в виде строки с пятью или шестью полями:
* * * * * command
│ │ │ │ │
│ │ │ │ └─ день недели (0–7, где 0 и 7 — воскресенье)
│ │ │ └── месяц (1–12)
│ │ └── день месяца (1–31)
│ └── час (0–23)
└── минута (0–59)
Например, запись 0 3 * * * будет запускать команду
ежедневно в 03:00.
В контексте Node.js часто используют пакеты node-cron или
cron, которые имитируют работу cron внутри приложения, без
необходимости редактировать системные задания.
Для интеграции cron с Puppeteer чаще всего применяется пакет
node-cron. Установка:
npm install node-cron puppeteer
Простейший пример задания, которое запускается каждые 5 минут:
const cron = require(&
const puppeteer = require('puppeteer');
cron.schedule('*/5 * * * *', async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com');
console.log('Страница загружена:', new Date().toISOString());
await browser.close();
});
Ключевые моменты:
await для Puppeteer.
Node-cron поддерживает полное выражение cron, включая:
0 9 * * 1 — каждый
понедельник в 09:00
0 9,15 * * * — в 09:00 и 15:00
/10 * * * — каждые 10
минут
Для тестирования UI удобно комбинировать cron с динамическими сценариями Puppeteer, например:
cron.schedule('0 */6 * * *', async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com/login');
await page.type('#username', 'admin');
await page.type('#password', 'password');
await page.click('#login-button');
await page.waitForNavigation();
console.log('Вход выполнен и проверка страницы:', await page.title());
await browser.close();
});
Этот подход позволяет периодически проверять корректность работы ключевых функций веб-приложения.
При работе с периодическими задачами важно учитывать сбои:
Пример обработки ошибок:
cron.schedule('*/15 * * * *', async () => {
try {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com', { timeout: 30000 });
console.log('Страница доступна:', new Date().toISOString());
await browser.close();
} catch (error) {
console.error('Ошибка при выполнении cron:', error);
}
});
Рекомендуется использовать таймауты и повторные попытки, чтобы задача не зависала при проблемах с сетью.
Для больших систем автоматизации важно вести логирование:
Пример записи логов в файл:
const fs = require('fs');
const logFile = 'cron.log';
cron.schedule('0 * * * *', async () => {
try {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com');
fs.appendFileSync(logFile, `✅ Успешно: ${new Date().toISOString()}\n`);
await browser.close();
} catch (err) {
fs.appendFileSync(logFile, `❌ Ошибка: ${new Date().toISOString()} - ${err.message}\n`);
}
});
Такой подход обеспечивает прозрачность работы и облегчает отладку.
Cron удобно сочетать с Jest, Mocha или другими тестовыми инструментами. Пример запуска тестов Puppeteer по расписанию:
const { run } = require('./tests/runTests');
cron.schedule('30 2 * * *', async () => {
try {
console.log('Запуск тестов:', new Date().toISOString());
await run();
} catch (error) {
console.error('Ошибка при выполнении тестов:', error);
}
});
Это позволяет автоматически проверять стабильность приложения ночью или в периоды низкой нагрузки.
headless: true для экономии ресурсов.
waitForSelector,
чтобы избежать зависаний.
Cron в связке с Puppeteer превращает автоматизированное тестирование и мониторинг веб-приложений в полностью управляемый процесс с гибким расписанием, контролем ошибок и логированием, что особенно важно для крупных проектов и CI/CD-процессов.