Google Cloud Functions

Puppeteer — это библиотека для управления Chromium или Chrome через DevTools Protocol. Она идеально подходит для автоматизированного тестирования веб-приложений, снятия скриншотов, генерации PDF и сбора данных с веб-страниц. В контексте Google Cloud Functions (GCF) ключевой особенностью является работа в безсерверной среде с ограничениями на размер деплоя, время выполнения и доступ к файловой системе.

  1. Создание проекта и установка зависимостей

Для начала необходимо подготовить структуру проекта:

mkdir puppeteer-gcf
cd puppeteer-gcf
npm init -y
npm install puppeteer-core chrome-aws-lambda
  • puppeteer-core — облегчённая версия Puppeteer без встроенного Chromium, что важно для экономии места в облачной функции.
  • chrome-aws-lambda — пакет, адаптирующий Chromium для работы в безсерверных средах, таких как AWS Lambda и GCF.

  1. Настройка функции

Файл index.js содержит основной код функции. Важно учитывать, что GCF использует Node.js runtime, который требует экспортировать функцию через exports.

const chromium = require(& const puppeteer =
require('puppeteer-core');


exports.screenshotPage = async (req, res) => { let browser = null;

try { browser = await puppeteer.launch({ args: chromium.args, defaultViewport: chromium.defaultViewport, executablePath: await chromium.executablePath, headless: chromium.headless, });

const page = await browser.newPage();
await page.goto(req.query.url || 'https://example.com', { waitUntil: 'networkidle2' });

const screenshot = await page.screenshot({ encoding: 'binary' });

res.set('Content-Type', 'image/png');
res.send(screenshot);
} catch (error) { console.error(error); res.status(500).send('Ошибка при создании скриншота'); } finally { if (browser) { await browser.close(); } } };

Особенности кода:

  • Использование puppeteer-core совместно с chrome-aws-lambda позволяет запускать Chromium в среде с ограниченным доступом к файловой системе.
  • executablePath вычисляется динамически, что гарантирует корректный путь к бинарнику Chromium в GCF.
  • waitUntil: ‘networkidle2’ обеспечивает загрузку всех ресурсов страницы перед снятием скриншота.

  1. Настройки package.json для Cloud Functions

Google Cloud Functions ограничивает размер пакета деплоя, поэтому важно отключить установку ненужного Chromium:

{
  "name": "puppeteer-gcf",
  "version": "1.0.0",
  "dependencies": {
 "chrome-aws-lambda": "^10.1.0",
 "puppeteer-core": "^20.0.0"
  },
  "engines": {
 "node": "20.x"
  }
}
  • Версия Node.js должна совпадать с поддерживаемой GCF.
  • puppeteer-core вместо полного Puppeteer снижает размер деплоя на сотни мегабайт.

  1. Оптимизация работы в безсерверной среде

  1. Headless режим: всегда использовать headless: chromium.headless.
  2. Управление ресурсами: закрывать браузер в блоке finally.
  3. Асинхронное ожидание загрузки: networkidle2 или networkidle0 предотвращает снятие скриншота до полной загрузки страницы.
  4. Ограничение памяти: GCF позволяет максимум 8 ГБ, но лучше тестировать на минимально необходимом объёме (512–1024 МБ).

  1. Тестирование функции локально

Можно использовать Functions Framework для локального тестирования:

npm install @google-cloud/functions-framework

Добавление в package.json скрипта:

"scripts": {
  "start": "functions-framework --target=screenshotPage"
}

Запуск:

npm start

Доступ по адресу: http://localhost:8080/?url=https://example.com.

  1. Деплой в Google Cloud Functions

gcloud functions deploy screenshotPage \
  --runtime nodejs20 \
  --trigger-http \
  --allow-unauthenticated \
  --memory=1024MB \
  --timeout=60s
  • memory и timeout критичны для Puppeteer: сложные страницы могут потребовать больше памяти и времени.
  • allow-unauthenticated используется для тестирования через HTTP-запросы без авторизации.

  1. Особенности отладки и логирования

  • Использовать console.error и console.log для отлова ошибок.
  • Логи отображаются в Cloud Logging, что удобно для анализа проблем с загрузкой страниц или запуском Chromium.
  • Частая проблема — несоответствие архитектуры Chromium и среды выполнения; использование chrome-aws-lambda решает этот вопрос.

  1. Расширенные возможности

  • PDF генерация:
const pdf = await page.pdf({ format: 'A4' });
res.set('Content-Type', 'application/pdf');
res.send(pdf);
  • Парсинг данных:
const title = await page.title();
const content = await page.$eval('h1', el => el.textContent);
  • Взаимодействие с формами и кнопками:
await page.type('#username', 'testuser');
await page.click('#submit');
await page.waitForNavigation();
  • Работа с cookies и localStorage позволяет тестировать сценарии авторизации без реального браузера.

  1. Ограничения и подводные камни

  1. Размер Chromium: полный Puppeteer не помещается в стандартный деплой GCF; обязательно использовать облегчённые решения.
  2. Время выполнения: GCF имеет лимит (по умолчанию 60 секунд, можно увеличить до 540). Долгие загрузки страниц могут привести к таймауту.
  3. Ограниченный доступ к файловой системе: временные файлы можно хранить только в /tmp.
  4. Архитектурные зависимости: необходимо использовать версии Chromium, совместимые с Linux Cloud Functions.

  1. Примеры интеграции в тестирование

  • E2E тестирование: проверка визуального отображения страниц после деплоя.
  • Скриншоты изменений UI: хранение изображений для сравнения.
  • Сбор данных для мониторинга: проверка наличия элементов, текста, загрузки ресурсов.
  • Автоматизация PDF-отчетов для внутренних приложений или документации.

Использование Puppeteer в Google Cloud Functions сочетает мощь автоматизации браузера с масштабируемостью безсерверной архитектуры, но требует внимательного подхода к ресурсам, зависимостям и времени выполнения.