Использование APIRequestContext для прямых API вызовов

Использование APIRequestContext для прямых API вызовов

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

Для работы с API через Playwright необходимо создать объект APIRequestContext. Этот объект является основным способом отправки HTTP-запросов. Его создание происходит через функцию new APIRequestContext().

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

const context = await request.newContext();

Создание контекста требует асинхронного вызова. После этого можно использовать методы этого контекста для выполнения различных HTTP-запросов.

Отправка запросов

APIRequestContext предоставляет несколько методов для выполнения различных типов HTTP-запросов, включая get(), post(), put(), delete(), и другие. Например, для выполнения простого GET-запроса к API можно использовать следующий код:

const response = await context.get('https://api.example.com/data');

Метод возвращает объект Response, который содержит всю информацию о результате запроса: статусный код, заголовки и тело ответа.

Для отправки POST-запроса с телом, например, в формате JSON, используется метод post():

const response = await context.post('https://api.example.com/data', {
  data: { key: 'value' }
});

Метод post() позволяет также добавлять заголовки, например, для указания типа контента:

const response = await context.post('https://api.example.com/data', {
  headers: {
    'Content-Type': 'application/json'
  },
  data: { key: 'value' }
});

Работа с ответами

Ответ от API возвращается в виде объекта Response. Этот объект предоставляет множество полезных методов для извлечения информации:

  • response.status() — возвращает HTTP-статус код ответа.
  • response.body() — возвращает тело ответа как строку.
  • response.json() — извлекает тело ответа в формате JSON.
  • response.text() — извлекает тело ответа как обычный текст.

Пример обработки ответа:

const response = await context.get('https://api.example.com/data');
if (response.status() === 200) {
  const jsonData = await response.json();
  console.log(jsonData);
}

Использование авторизации

Часто для работы с API требуется авторизация. Playwright позволяет настроить авторизацию через заголовки или куки, которые можно передать в запросах. Например, для использования Bearer-токена в заголовке:

const response = await context.get('https://api.example.com/protected-data', {
  headers: {
    'Authorization': 'Bearer YOUR_TOKEN_HERE'
  }
});

Кроме того, можно добавить куки в контекст запроса, что полезно, например, при тестировании сессий:

await context.addCookies([{
  name: 'session_id',
  value: 'your-session-id',
  domain: 'example.com'
}]);

const response = await context.get('https://api.example.com/protected-data');

Использование APIRequestContext для тестирования

Прямые API-запросы через APIRequestContext полезны при тестировании бизнес-логики, когда необходимо проверить взаимодействие с сервером без использования интерфейса пользователя. Это также позволяет проводить тесты, которые включают взаимодействие с сервером до или после выполнения тестов интерфейса.

Пример использования API-запросов для подготовки теста:

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

test('API тестирование', async ({ request }) => {
  const context = await request.newContext();
  
  // Подготовка данных через POST-запрос
  await context.post('https://api.example.com/create-user', {
    data: { name: 'John Doe', email: 'john@example.com' }
  });

  // Проверка данных через GET-запрос
  const response = await context.get('https://api.example.com/users');
  const users = await response.json();
  expect(users).toContainEqual({ name: 'John Doe', email: 'john@example.com' });
});

Этот пример показывает, как с помощью API-запросов можно подготовить тестовые данные и проверить их через API, прежде чем проводить тестирование с пользовательским интерфейсом.

Очистка контекста

После выполнения запросов важно корректно завершать работу с контекстом. Для этого используется метод context.dispose(), который освобождает все ресурсы, связанные с данным контекстом.

await context.dispose();

Это гарантирует, что все открытые соединения будут закрыты, и ресурсы освобождены после выполнения теста.

Использование для тестирования REST и GraphQL

Прямые API-запросы могут быть полезны для тестирования как REST, так и GraphQL API. Для работы с REST API достаточно использовать стандартные HTTP-методы, такие как get(), post(), put(), delete(). В случае с GraphQL запросами, обычно используется POST-запрос, в теле которого отправляется GraphQL запрос в формате JSON.

Пример отправки GraphQL-запроса:

const query = {
  query: `
    query {
      user(id: "1") {
        name
        email
      }
    }
  `
};

const response = await context.post('https://api.example.com/graphql', {
  headers: {
    'Content-Type': 'application/json'
  },
  data: query
});

const data = await response.json();
console.log(data);

Обработка ошибок

При работе с API-запросами важно предусматривать обработку ошибок. Наиболее распространенные ошибки могут быть связаны с сетевыми проблемами, неверными данными или ошибками сервера. Для работы с ошибками можно использовать конструкции try/catch для ловли исключений:

try {
  const response = await context.get('https://api.example.com/data');
  if (!response.ok()) {
    throw new Error(`Ошибка: ${response.status()}`);
  }
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error('Запрос не удался:', error);
}

Заключение

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