Cron для периодических задач

Puppeteer — это библиотека для управления браузером Chrome или Chromium через DevTools Protocol. Она широко используется для автоматизированного тестирования веб-приложений, сбора данных и эмуляции пользовательских действий. Часто возникает необходимость выполнять тесты или скрипты периодически, без ручного запуска. Для таких целей применяют систему cron.


Основные принципы работы 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 в Node.js

Для интеграции 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();
});

Ключевые моменты:

  • Асинхронная функция внутри cron.schedule позволяет использовать await для Puppeteer.
  • headless: true обеспечивает работу без графического интерфейса.
  • Логи фиксируют момент выполнения, что удобно для мониторинга периодических задач.

Сложные расписания

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();
});

Этот подход позволяет периодически проверять корректность работы ключевых функций веб-приложения.


Управление ошибками и устойчивость

При работе с периодическими задачами важно учитывать сбои:

  • Проблемы сети или недоступность сайта
  • Ошибка Puppeteer при загрузке страницы или DOM-элементов
  • Ограничения ресурсов сервера при множественных параллельных запусках

Пример обработки ошибок:

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);
    }
});

Рекомендуется использовать таймауты и повторные попытки, чтобы задача не зависала при проблемах с сетью.


Логирование и мониторинг

Для больших систем автоматизации важно вести логирование:

  • В файл с указанием времени выполнения и результата
  • В базу данных для последующего анализа и построения отчетов
  • С уведомлениями при сбоях через email или мессенджеры

Пример записи логов в файл:

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 и URL в отдельных файлах, чтобы легко менять расписание и тестовые сценарии.
  • Разделять задачи по приоритету: критические проверки — чаще, второстепенные — реже.

Cron в связке с Puppeteer превращает автоматизированное тестирование и мониторинг веб-приложений в полностью управляемый процесс с гибким расписанием, контролем ошибок и логированием, что особенно важно для крупных проектов и CI/CD-процессов.