Puppeteer предоставляет мощный инструмент для автоматизации браузера на базе Chromium. Часто при тестировании требуется сохранять полученные данные, скриншоты или PDF-документы в облачные хранилища, такие как Amazon S3, чтобы обеспечить централизованный доступ и долговременное хранение. Рассмотрим процесс интеграции Puppeteer с S3, включая подготовку, загрузку файлов и управление правами доступа.
Для работы с S3 в Node.js используется пакет @aws-sdk/client-s3. Перед
началом необходимо установить зависимости:
npm install @aws-sdk/client-s3 puppeteer
Далее создается клиент S3 с использованием учетных данных AWS:
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
const s3 = new S3Client({
region: "us-east-1",
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
},
});
Ключевые моменты:
region определяет регион S3-бакета.
Puppeteer позволяет получать скриншоты, PDF и содержимое страниц. Примеры:
Скриншот страницы:
import puppeteer from "puppeteer";
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("https://example.com");
const screenshotBuffer = await page.screenshot({ fullPage: true });
await browser.close();
PDF документация:
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("https://example.com");
const pdfBuffer = await page.pdf({ format: "A4" });
await browser.close();
Полученные данные хранятся в буферах (Buffer), что упрощает
передачу их в S3 без промежуточного сохранения на диск.
Для загрузки используется команда PutObjectCommand. Пример
функции для загрузки:
async function uploadToS3(buffer, bucketName, key, contentType) {
const command = new PutObjectCommand({
Bucket: bucketName,
Key: key,
Body: buffer,
ContentType: contentType,
ACL: "private",
});
try {
const response = await s3.send(command);
console.log("Файл успешно загружен:", key);
return response;
} catch (error) {
console.error("Ошибка при загрузке в S3:", error);
throw error;
}
}
Пояснения:
Bucket — имя целевого S3-бакета.
Key — путь и имя файла внутри бакета.
Body — содержимое файла в виде буфера.
ContentType — MIME-тип файла (image/png,
application/pdf).
ACL — уровень доступа (часто используется
private для тестовых данных).
Для удобства тестирования и последующего анализа файлов часто применяют структуру с временными метками или идентификаторами тестов:
const timestamp = new Date().toISOString();
const key = `tests/screenshots/test-${timestamp}.png`;
await uploadToS3(screenshotBuffer, "my-test-bucket", key, "image/png");
Такой подход позволяет:
В современных процессах тестирования важно автоматически загружать артефакты в S3 после прохождения тестов. Например, в GitHub Actions можно использовать Node.js-скрипт для Puppeteer, который:
Пример интеграции с GitHub Actions:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 20
- run: npm install
- run: node runTestsAndUpload.js
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
Для тестовых данных удобно использовать префиксы и теги, чтобы управлять версиями и классификацией:
const key = `tests/${testName}/screenshot-${timestamp}.png`;
const command = new PutObjectCommand({
Bucket: bucketName,
Key: key,
Body: screenshotBuffer,
ContentType: "image/png",
Tagging: "env=test&module=login",
});
Теги помогают фильтровать файлы через AWS S3 Management Console или программно.
Для контроля затрат можно настроить lifecycle rules в S3:
Хранение данных Puppeteer в S3 обеспечивает масштабируемость, надежность и удобство интеграции в современные процессы тестирования, делая результаты доступными для анализа и аудита.