События download

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

Подготовка к работе с событием

Чтобы правильно отлавливать события скачивания в Playwright, важно понимать несколько базовых аспектов:

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

Основы работы с событием download

Событие download позволяет отслеживать процесс скачивания файла, вызванного пользователем или тестом. В Playwright это событие обрабатывается через объект Page, а точнее через метод page.on('download').

const { test, expect } = require('@playwright/test');

test('скачать файл', async ({ page }) => {
  // Ожидаем события скачивания
  const [download] = await Promise.all([
    page.waitForEvent('download'), // Ждём скачивание
    page.click('button#download')  // Эмулируем клик по кнопке для скачивания
  ]);

  // Проверяем, что файл был скачан
  expect(download).not.toBeNull();
  // Получаем путь к скачанному файлу
  const path = await download.path();
  console.log('Файл скачан в:', path);
});

В этом примере после нажатия на кнопку с ID download мы ожидаем события download, которое запускается, когда файл начинает скачиваться. Метод waitForEvent('download') возвращает объект Download, с помощью которого можно получить информацию о скачанном файле.

Ожидание события download

Событие download возникает, когда браузер начинает скачивание файла. Важно учитывать, что оно может быть вызвано не только вручную пользователем, но и через JavaScript на странице. Чтобы эффективно работать с этим событием, рекомендуется использовать Promise.all() или другие механизмы синхронизации, чтобы корректно дождаться окончания скачивания.

Пример ожидания события и выполнения действий после начала скачивания:

const { test, expect } = require('@playwright/test');

test('скачать файл и проверить его содержимое', async ({ page }) => {
  const [download] = await Promise.all([
    page.waitForEvent('download'),
    page.click('a#download-link')  // Кликаем по ссылке для скачивания
  ]);

  // Путь к скачанному файлу
  const path = await download.path();
  const fileContent = await fs.promises.readFile(path, 'utf-8');
  
  expect(fileContent).toContain('Ожидаемое содержимое');
});

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

Работа с загруженными файлами

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

const fs = require('fs');

test('проверка скачанного файла', async ({ page }) => {
  const [download] = await Promise.all([
    page.waitForEvent('download'),
    page.click('button#download')
  ]);

  const path = await download.path();
  const fileStats = await fs.promises.stat(path);

  // Проверка размера файла
  expect(fileStats.size).toBeGreaterThan(0);
});

Здесь после получения пути к скачанному файлу мы используем модуль fs для проверки размера файла. Такая проверка может быть полезна для уверенности, что файл не пустой и был правильно загружен.

Пример с параметрами загружаемого файла

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

test('проверка имени скачиваемого файла', async ({ page }) => {
  const [download] = await Promise.all([
    page.waitForEvent('download'),
    page.click('a#download-link')  // Кликаем по ссылке
  ]);

  const suggestedFilename = download.suggestedFilename();
  expect(suggestedFilename).toBe('example.pdf');
});

В этом примере после скачивания файла мы проверяем предложенное имя файла, которое обычно передаётся в заголовках ответа при скачивании.

Ограничения и особенности

Несмотря на удобство работы с событием download, следует учитывать несколько особенностей и ограничений:

  1. Файл может не скачиваться: в случае неправильной настройки сервера или если на странице нет активного элемента для скачивания.
  2. Прерывание скачивания: иногда скачивание может быть прервано по разным причинам, и Playwright не всегда будет это отслеживать. Рекомендуется также проверять корректность загрузки через другие механизмы, такие как размеры файлов или его содержимое.
  3. Блокировки скачивания: в некоторых случаях браузеры могут блокировать скачивание файлов по причинам безопасности, и эти сценарии могут потребовать настройки или модификации конфигурации.

Заключение

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