Использование 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');
Прямые 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();
Это гарантирует, что все открытые соединения будут закрыты, и ресурсы освобождены после выполнения теста.
Прямые 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-запросов, работы с авторизацией и
обработка ответов значительно упрощает процесс тестирования и
интеграции, обеспечивая гибкость и эффективность в тестовых
сценариях.