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