Сохранение скачанных файлов

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

Основы скачивания файлов

Для начала, важно понять, как Playwright обрабатывает скачивание файлов. По умолчанию браузеры не позволяют скачивать файлы без подтверждения пользователя. Однако, с помощью Playwright можно настроить обработку скачиваний так, чтобы они происходили без вмешательства пользователя.

Для этого Playwright предоставляет метод page.on('download', callback), который срабатывает, когда начинается скачивание. Важно, что по умолчанию скачивание происходит в папку, заданную настройками браузера. Однако можно изменить поведение скачивания, указав пользовательскую директорию.

Настройка директории для скачивания

Если необходимо, чтобы файлы сохранялись в определенную папку, можно использовать настройку download в контексте браузера. Пример настройки:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext({
    acceptDownloads: true,
    downloadsPath: './downloads' // указываем путь к директории для сохранения файлов
  });

  const page = await context.newPage();
  await page.goto('https://example.com');
  
  const downloadPromise = page.waitForEvent('download');
  await page.click('text=Download'); // кнопка для скачивания файла
  const download = await downloadPromise;

  await download.saveAs('./downloads/myfile.pdf'); // сохраняем файл под заданным именем
  await browser.close();
})();

В этом примере мы указываем путь для сохранения скачанных файлов через опцию downloadsPath. После этого скачивание файла будет происходить в эту папку. Это позволяет избежать ручного вмешательства и сохранить файлы в удобном месте.

Обработка событий скачивания

Playwright предоставляет события, которые можно использовать для отслеживания состояния скачивания. Например, для получения информации о процессе скачивания можно использовать событие download:

page.on('download', (download) => {
  console.log('Файл начат загрузка:', download.suggestedFilename());
});

С помощью suggestedFilename() можно получить предложенное имя файла. Это полезно, когда нужно проверить, что скачанный файл имеет правильное имя или соответствующий формат.

Для ожидания завершения скачивания можно использовать метод download.path():

const downloadPromise = page.waitForEvent('download');
const download = await downloadPromise;
const filePath = await download.path();
console.log('Файл сохранен в:', filePath);

Метод path() возвращает путь, по которому был сохранен файл на диске. Это полезно, если нужно выполнить дополнительные проверки, например, проверить размер файла или его содержимое.

Важные моменты при работе с скачиванием

  1. Проверка расширений файлов: Когда скачивание файлов тестируется в автоматизированных тестах, важно проверять, что скачанный файл имеет правильное расширение. Например, если файл должен быть PDF, можно проверить его расширение:
const filePath = await download.path();
if (filePath.endsWith('.pdf')) {
  console.log('Файл скачан правильно');
} else {
  console.log('Ошибка: неверное расширение файла');
}
  1. Проверка содержимого файла: Иногда нужно убедиться, что файл скачан правильно и его содержимое соответствует ожидаемому. В таких случаях можно использовать библиотеки для работы с файлами (например, fs для чтения и анализа содержимого файла):
const fs = require('fs');
const filePath = await download.path();

fs.readFile(filePath, 'utf8', (err, data) => {
  if (err) {
    console.log('Ошибка при чтении файла:', err);
  } else {
    console.log('Содержимое файла:', data);
  }
});
  1. Реализация тайм-аутов: В случае больших файлов или нестабильных соединений может возникнуть задержка в процессе скачивания. Поэтому полезно использовать тайм-ауты для предотвращения зависания теста. Метод waitForEvent позволяет задать тайм-аут:
const downloadPromise = page.waitForEvent('download', { timeout: 60000 });
  1. Обработка ошибок скачивания: Важно также учитывать возможные ошибки, связанные с процессом скачивания. Например, если файл не был скачан в течение заданного времени, можно обработать ошибку:
try {
  const download = await page.waitForEvent('download', { timeout: 60000 });
} catch (error) {
  console.log('Ошибка при скачивании файла:', error);
}
  1. Тестирование нескольких скачиваний: Если необходимо тестировать несколько скачиваний одновременно, можно использовать массивы для хранения нескольких промисов:
const downloadPromises = [];
page.on('download', (download) => {
  downloadPromises.push(download.path());
});

await Promise.all(downloadPromises);

Проверка успешности скачивания

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

const filePath = await download.path();
const stats = fs.statSync(filePath);
if (stats.size > 0) {
  console.log('Файл скачан успешно');
} else {
  console.log('Ошибка: файл пустой');
}

Также можно проверить контрольную сумму файла (например, MD5 или SHA-256) для убедительности в том, что содержимое файла не было изменено в процессе скачивания.

Заключение

Скачивание файлов — важная часть тестирования многих веб-приложений. Playwright предоставляет мощные инструменты для автоматизации этого процесса, позволяя не только отслеживать скачивание файлов, но и обрабатывать их в различных ситуациях. Правильная настройка директорий для скачивания, использование событий и методов для ожидания завершения скачивания, а также проверка содержимого файлов — все это помогает сделать тесты более надежными и точными.