В процессе тестирования веб-приложений важно учитывать различные уровни прав доступа, чтобы проверить функциональность приложения для пользователей с разными ролями. Playwright предоставляет мощные инструменты для имитации различных прав доступа и выполнения тестов, которые имитируют поведение различных пользователей, таких как администраторы, обычные пользователи и неавторизованные посетители.
Один из способов эмуляции прав доступа в Playwright — использование Cookies. Этот метод позволяет быстро изменить состояние авторизации пользователя, не выполняя повторно процесс логина, что значительно ускоряет тестирование.
import { test, expect } from '@playwright/test';
test('Эмуляция прав доступа с помощью Cookies', async ({ page }) => {
// Установка Cookies для эмуляции авторизованного пользователя
const cookies = [
{
name: 'auth_token',
value: 'your-auth-token',
domain: 'example.com',
path: '/',
},
];
await page.context().addCookies(cookies);
// Переход на страницу, доступную только авторизованным пользователям
await page.goto('https://example.com/dashboard');
const userDashboard = await page.locator('text=Dashboard').isVisible();
expect(userDashboard).toBe(true);
});
В этом примере создаются Cookies с токеном авторизации и добавляются в контекст страницы. После этого можно перейти на страницу, которая доступна только авторизованным пользователям, и проверить доступность элементов интерфейса.
В приложениях с многоуровневой системой прав доступа часто используется эмуляция различных ролей через токены. Для тестирования приложения с разными уровнями доступа можно создать несколько типов токенов, соответствующих ролям, таким как «администратор», «пользователь» или «гость».
import { test, expect } from '@playwright/test';
test('Эмуляция разных ролей', async ({ page }) => {
const adminToken = 'admin-auth-token';
const userToken = 'user-auth-token';
// Эмуляция входа как администратор
await page.context().addCookies([
{ name: 'auth_token', value: adminToken, domain: 'example.com' }
]);
await page.goto('https://example.com/admin-dashboard');
const adminAccess = await page.locator('text=Admin Dashboard').isVisible();
expect(adminAccess).toBe(true);
// Эмуляция входа как обычный пользователь
await page.context().clearCookies(); // Очистка предыдущих Cookies
await page.context().addCookies([
{ name: 'auth_token', value: userToken, domain: 'example.com' }
]);
await page.goto('https://example.com/user-dashboard');
const userAccess = await page.locator('text=User Dashboard').isVisible();
expect(userAccess).toBe(true);
});
В данном примере создаются два токена для разных ролей и тестируются страницы, доступные только определенным ролям. Это позволяет проверить, что пользователи с разными правами могут видеть только те разделы, к которым у них есть доступ.
Иногда требуется эмулировать права доступа на уровне API, например, когда необходимо проверить доступность API-эндпоинтов для пользователей с разными ролями. В таком случае можно использовать Playwright для отправки HTTP-запросов с нужными заголовками, которые будут соответствовать различным уровням прав.
import { test, expect, request } from '@playwright/test';
test('API эмуляция прав доступа', async () => {
const adminToken = 'admin-auth-token';
const userToken = 'user-auth-token';
// Отправка запроса с токеном администратора
const adminRequest = await request.post('https://example.com/api/data', {
headers: {
'Authorization': `Bearer ${adminToken}`,
},
});
expect(adminRequest.status()).toBe(200);
// Отправка запроса с токеном обычного пользователя
const userRequest = await request.post('https://example.com/api/data', {
headers: {
'Authorization': `Bearer ${userToken}`,
},
});
expect(userRequest.status()).toBe(403); // Статус отказа в доступе для обычного пользователя
});
Здесь используется библиотека request из Playwright для
отправки API-запросов с соответствующими заголовками авторизации. Это
позволяет эмулировать доступ к данным для пользователей с разными
уровнями прав.
Playwright позволяет создавать несколько контекстов браузера в одном тесте, что полезно для эмуляции различных прав доступа в одном тестовом сценарии. Каждый контекст представляет собой независимую сессию с отдельными Cookies, локальным хранилищем и другими данными сессии. Это позволяет тестировать разные состояния авторизации в одном тесте, что помогает избежать необходимости многократного запуска браузера.
import { test, expect, chromium } from '@playwright/test';
test('Эмуляция прав доступа с разными контекстами', async () => {
const browser = await chromium.launch();
// Контекст для админа
const adminContext = await browser.newContext();
const adminPage = await adminContext.newPage();
await adminPage.context().addCookies([{ name: 'auth_token', value: 'admin-auth-token', domain: 'example.com' }]);
await adminPage.goto('https://example.com/admin-dashboard');
const adminDashboardVisible = await adminPage.locator('text=Admin Dashboard').isVisible();
expect(adminDashboardVisible).toBe(true);
// Контекст для пользователя
const userContext = await browser.newContext();
const userPage = await userContext.newPage();
await userPage.context().addCookies([{ name: 'auth_token', value: 'user-auth-token', domain: 'example.com' }]);
await userPage.goto('https://example.com/user-dashboard');
const userDashboardVisible = await userPage.locator('text=User Dashboard').isVisible();
expect(userDashboardVisible).toBe(true);
await browser.close();
});
В этом примере создаются два отдельных контекста для администратора и обычного пользователя. Каждый контекст имитирует отдельную сессию с нужными правами доступа. Такой подход позволяет изолировать различные пользовательные роли в одном тесте.
Некоторые приложения используют для управления доступом специфические
заголовки HTTP-запросов, такие как X-Role или
X-Permission. Эти заголовки могут быть добавлены как на
уровне API-запросов, так и при эмуляции взаимодействий с UI.
import { test, expect } from '@playwright/test';
test('Эмуляция прав доступа через заголовки', async ({ page }) => {
await page.route('**/api/data', (route, request) => {
const role = request.headers()['x-role'];
if (role === 'admin') {
route.continue();
} else {
route.fulfill({
status: 403,
body: 'Forbidden',
});
}
});
// Запрос с ролью администратора
await page.goto('https://example.com');
await page.addInitScript(() => {
window.localStorage.setItem('role', 'admin');
});
const response = await page.request.get('https://example.com/api/data');
expect(response.status()).toBe(200);
// Запрос с ролью пользователя
await page.addInitScript(() => {
window.localStorage.setItem('role', 'user');
});
const userResponse = await page.request.get('https://example.com/api/data');
expect(userResponse.status()).toBe(403);
});
В этом примере используется возможность перехвата сетевых запросов с
помощью page.route(). Это позволяет настроить кастомные
заголовки, которые эмулируют различные роли для проверки прав доступа на
серверной стороне.
Эмуляция прав доступа в Playwright — это мощный инструмент для тестирования веб-приложений с различными уровнями безопасности. Возможности для использования Cookies, токенов, API-запросов и контекстов браузера позволяют создавать гибкие и эффективные тесты, которые могут имитировать различные сценарии использования в реальных условиях.