Работа с различными типами файлов

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

Загрузка файлов

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

Для загрузки файла используется метод setInputFiles(), который имитирует выбор файла в поле ввода типа file. Этот метод может быть использован для взаимодействия с элементами формы, требующими загрузки файлов.

Пример:

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

test('загрузка файла', async ({ page }) => {
  await page.goto('https://example.com/upload');
  
  // Находим элемент формы для загрузки файла
  const fileInput = await page.locator('input[type="file"]');
  
  // Загружаем файл
  await fileInput.setInputFiles('path/to/file.txt');
  
  // Проверяем, что файл был выбран
  const inputValue = await fileInput.evaluate(input => input.files[0].name);
  expect(inputValue).toBe('file.txt');
});

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

Скачивание файлов

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

Чтобы обработать скачивание, необходимо создать специальную обработку события download на объекте страницы или на конкретном элементе, инициирующем скачивание. Для получения пути сохранённого файла используется метод path().

Пример:

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

test('скачивание файла', async ({ page }) => {
  await page.goto('https://example.com/download');

  // Слушаем событие скачивания
  const [download] = await Promise.all([
    page.waitForEvent('download'),
    page.click('button#download')  // Кликаем на кнопку для скачивания
  ]);

  // Проверяем путь к файлу
  const downloadPath = await download.path();
  expect(downloadPath).toBeDefined();
  
  // Дополнительно можно проверить, что файл существует
  const fs = require('fs');
  expect(fs.existsSync(downloadPath)).toBe(true);
});

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

Чтение содержимого файлов

Playwright сам по себе не предоставляет встроенных методов для работы с содержимым локальных файлов, но для этого можно использовать стандартные возможности Node.js. Например, для чтения текстовых файлов или бинарных данных можно воспользоваться модулями fs или path.

Для работы с текстовыми файлами можно использовать метод fs.readFileSync().

Пример:

const fs = require('fs');

test('чтение текстового файла', async () => {
  const fileContent = fs.readFileSync('path/to/file.txt', 'utf8');
  expect(fileContent).toContain('ожидаемая строка');
});

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

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

Для работы с изображениями или другими бинарными файлами, можно использовать методы из Node.js, такие как fs.readFileSync() для получения данных файла и их проверки. В случае с изображениями полезно комбинировать это с другими инструментами для работы с изображениями, например, с библиотеками, которые позволяют сравнивать изображения или проверять их целостность.

Пример для проверки изображения:

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

test('проверка изображения', async ({ page }) => {
  await page.goto('https://example.com/image');
  
  // Скачать изображение
  const [download] = await Promise.all([
    page.waitForEvent('download'),
    page.click('button#download-image')
  ]);
  
  const imagePath = await download.path();
  
  // Прочитаем файл как бинарные данные
  const imageBuffer = fs.readFileSync(imagePath);
  
  // Проверяем, что файл является изображением
  expect(imageBuffer).toBeInstanceOf(Buffer);
  expect(imageBuffer.length).toBeGreaterThan(0);  // Размер файла больше нуля
});

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

Обработка файлов в формах и API

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

Для отправки файла через форму можно использовать метод setInputFiles(), как показано выше. В случае работы с API полезно использовать метод request.post() для отправки файлов на сервер.

Пример отправки файла через API:

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

test('отправка файла через API', async ({ page, request }) => {
  const filePath = 'path/to/file.txt';
  
  // Отправка файла через API
  const response = await request.post('https://example.com/upload', {
    multipart: {
      file: {
        buffer: fs.readFileSync(filePath),
        name: 'file.txt',
        mimeType: 'text/plain'
      }
    }
  });

  expect(response.ok()).toBe(true);
});

В данном примере файл отправляется на сервер через HTTP-запрос, используя multipart/form-data. Это полезно, когда необходимо интегрировать тестирование с API, которое работает с файлами.

Проблемы с правами доступа и безопасностью

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

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

Заключение

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