Хранение в S3

Puppeteer предоставляет мощный инструмент для автоматизации браузера на базе Chromium. Часто при тестировании требуется сохранять полученные данные, скриншоты или PDF-документы в облачные хранилища, такие как Amazon S3, чтобы обеспечить централизованный доступ и долговременное хранение. Рассмотрим процесс интеграции Puppeteer с S3, включая подготовку, загрузку файлов и управление правами доступа.


Настройка AWS SDK

Для работы с 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-бакета.
  • Рекомендуется использовать переменные окружения для хранения ключей доступа.
  • Для безопасного тестирования лучше использовать IAM-пользователя с ограниченными правами.

Захват данных с Puppeteer

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 без промежуточного сохранения на диск.


Загрузка файлов в 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");

Такой подход позволяет:

  • Избежать конфликтов имен файлов.
  • Легко фильтровать результаты по дате или типу теста.
  • Автоматически архивировать старые данные.

Интеграция с CI/CD

В современных процессах тестирования важно автоматически загружать артефакты в S3 после прохождения тестов. Например, в GitHub Actions можно использовать Node.js-скрипт для Puppeteer, который:

  1. Запускает браузер и собирает скриншоты/PDF.
  2. Загружает результаты в S3.
  3. Формирует отчеты с ссылками на артефакты.

Пример интеграции с 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 }}

Оптимизация и безопасность

  • Буферизация: перед загрузкой больших файлов лучше убедиться, что их размер не превышает ограничение S3 (5 ТБ для одного объекта).
  • Сжатие: PDF и изображения можно сжимать перед отправкой для экономии места.
  • Права доступа: избегать публичного ACL, если данные конфиденциальны.
  • Обработка ошибок: важно логировать ошибки и повторять загрузку при временных сбоях сети.

Использование префиксов и тегов

Для тестовых данных удобно использовать префиксы и теги, чтобы управлять версиями и классификацией:

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:

  • Удалять скриншоты старше 30 дней.
  • Архивировать PDF в Glacier для долгосрочного хранения.
  • Автоматически очищать временные данные тестирования.

Резюме практических сценариев

  • Скриншоты и PDF: хранение отчетов тестов и визуальной документации.
  • HTML и JSON: хранение экспортированных данных страниц для анализа.
  • Артефакты CI/CD: интеграция с автоматическим тестированием и формирование отчетов.
  • Безопасность: использование IAM-пользователей, ACL и тегов для классификации.

Хранение данных Puppeteer в S3 обеспечивает масштабируемость, надежность и удобство интеграции в современные процессы тестирования, делая результаты доступными для анализа и аудита.