Web-тестирование часто требует работы с аутентификацией, что в свою очередь предполагает использование токенов для обеспечения доступа к защищённым ресурсам. Одним из самых популярных форматов для передачи токенов в современных веб-приложениях является JSON Web Token (JWT). Работа с такими токенами в Playwright может быть необходима для имитации аутентифицированных пользователей и выполнения тестов, которые требуют доступа к приватным данным или специфическим функциям.
JWT представляет собой компактный и безопасный способ передачи информации между сторонами как JSON-объект. Обычно JWT состоит из трёх частей:
Важной частью является то, что токен не шифруется, и его можно декодировать, но проверка его подлинности требует наличия секретного ключа.
Большинство современных веб-приложений используют JWT для
аутентификации. В этом случае токен передаётся через заголовок HTTP
(например, Authorization: Bearer <token>) и
используется сервером для проверки, что запрос поступает от
аутентифицированного пользователя.
Для автоматизации тестирования с использованием Playwright, важно иметь возможность работать с токенами для имитации аутентифицированных пользователей. Обычно это может быть полезно при тестировании защищённых API или для обхода шагов авторизации в UI-тестах.
В случае, если для доступа к защищённому ресурсу необходимо пройти
процедуру авторизации, Playwright предоставляет возможность получить JWT
токен через выполнение запросов с помощью page.request или
автоматизировать процесс входа через UI.
Когда авторизация через форму (например, логин и пароль) на сайте является стандартной, можно использовать Playwright для отправки запросов на сервер и получения JWT.
Пример кода для получения токена через HTTP запрос:
import { test, expect } from '@playwright/test';
test('Получение токена с помощью API', async ({ request }) => {
const response = await request.post('https://your-api.com/login', {
data: {
username: 'user',
password: 'password'
}
});
const responseBody = await response.json();
const token = responseBody.token; // Токен будет в ответе от сервера
expect(token).toBeDefined(); // Проверка, что токен получен
});
В этом примере Playwright делает POST запрос к API авторизации, отправляя данные пользователя. Ответ содержит JWT токен, который можно использовать для последующих запросов.
Иногда логин требуется выполнить через интерфейс, например, при автоматическом тестировании пользовательских сценариев. В этом случае необходимо пройти через весь процесс авторизации, чтобы получить токен.
import { test, expect } from '@playwright/test';
test('Авторизация через UI', async ({ page }) => {
await page.goto('https://your-website.com/login');
await page.fill('input[name="username"]', 'user');
await page.fill('input[name="password"]', 'password');
await page.click('button[type="submit"]');
// Допустим, токен сохраняется в localStorage после успешного входа
const token = await page.evaluate(() => localStorage.getItem('jwt_token'));
expect(token).toBeDefined(); // Проверка, что токен сохранён
});
В данном случае, тест эмулирует действия пользователя в браузере:
заполнение формы и отправка данных. После успешного входа токен
сохраняется в localStorage, который можно затем извлечь для
дальнейших запросов.
После получения JWT токена можно использовать его для
аутентифицированных запросов к API. Для этого добавляется заголовок
Authorization с токеном.
Пример использования токена для запроса к API:
import { test, expect } from '@playwright/test';
test('Доступ к защищённому API с токеном', async ({ request }) => {
const token = 'your_jwt_token';
const response = await request.get('https://your-api.com/protected-resource', {
headers: {
'Authorization': `Bearer ${token}`
}
});
expect(response.status()).toBe(200); // Ожидаем успешный ответ от API
});
В этом примере выполняется запрос к защищённому ресурсу, передавая
JWT токен в заголовке Authorization. Это позволяет серверу
проверить аутентификацию и вернуть нужные данные.
JWT также могут быть сохранены в куки или в локальном хранилище браузера для последующего использования. В Playwright можно работать с этими данными, имитируя поведение реального пользователя.
import { test, expect } from '@playwright/test';
test('Сохранение токена в куки', async ({ page }) => {
await page.goto('https://your-website.com/login');
await page.fill('input[name="username"]', 'user');
await page.fill('input[name="password"]', 'password');
await page.click('button[type="submit"]');
// Сохраняем токен в куки
const cookies = await page.context().cookies();
const jwtCookie = cookies.find(cookie => cookie.name === 'jwt_token');
expect(jwtCookie).toBeDefined();
});
import { test, expect } from '@playwright/test';
test('Сохранение токена в localStorage', async ({ page }) => {
await page.goto('https://your-website.com/login');
await page.fill('input[name="username"]', 'user');
await page.fill('input[name="password"]', 'password');
await page.click('button[type="submit"]');
// Извлекаем токен из localStorage
const token = await page.evaluate(() => localStorage.getItem('jwt_token'));
expect(token).toBeDefined();
});
Токены могут истекать или быть отозваны, что требует корректной обработки таких случаев в тестах. Playwright позволяет тестировать ситуации с истёкшими токенами, а также корректно обновлять токены, если приложение поддерживает механизмы их обновления.
import { test, expect } from '@playwright/test';
test('Обновление токена', async ({ request }) => {
const refreshToken = 'your_refresh_token';
const response = await request.post('https://your-api.com/refresh', {
data: { refresh_token: refreshToken }
});
const responseBody = await response.json();
const newToken = responseBody.token;
expect(newToken).toBeDefined();
});
Работа с токенами и JWT в Playwright позволяет эффективно тестировать сценарии аутентификации и авторизации, а также взаимодействовать с защищёнными API. Использование токенов даёт гибкость при автоматизации тестирования, позволяя имитировать реальные пользовательские действия без необходимости повторной авторизации.