Puppeteer — это библиотека для управления Chromium или Chrome через DevTools Protocol. Она идеально подходит для автоматизированного тестирования веб-приложений, снятия скриншотов, генерации PDF и сбора данных с веб-страниц. В контексте Google Cloud Functions (GCF) ключевой особенностью является работа в безсерверной среде с ограничениями на размер деплоя, время выполнения и доступ к файловой системе.
Для начала необходимо подготовить структуру проекта:
mkdir puppeteer-gcf
cd puppeteer-gcf
npm init -y
npm install puppeteer-core chrome-aws-lambda
Файл 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’ обеспечивает загрузку всех
ресурсов страницы перед снятием скриншота.
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"
}
}
puppeteer-core вместо полного Puppeteer снижает размер
деплоя на сотни мегабайт.
headless:
chromium.headless.
finally.
networkidle2 или networkidle0 предотвращает
снятие скриншота до полной загрузки страницы.
Можно использовать 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.
gcloud functions deploy screenshotPage \
--runtime nodejs20 \
--trigger-http \
--allow-unauthenticated \
--memory=1024MB \
--timeout=60s
console.error и console.log для
отлова ошибок.
chrome-aws-lambda решает этот
вопрос.
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();
/tmp.
Использование Puppeteer в Google Cloud Functions сочетает мощь автоматизации браузера с масштабируемостью безсерверной архитектуры, но требует внимательного подхода к ресурсам, зависимостям и времени выполнения.