Puppeteer предоставляет возможность эмулировать поведение браузера, включая работу с API и заголовками запросов. Для тестирования защищённых ресурсов часто требуется выполнять аутентификацию через API, например, используя токены Bearer или Basic Auth.
Самый простой способ аутентификации — установка заголовков запроса. В
Puppeteer это реализуется через метод
page.setExtraHTTPHeaders():
await page.setExtraHTTPHeaders({
&
'Content-Type': 'application/json'
});
Здесь ключевым моментом является правильное указание токена и формата
заголовка. Для Basic Auth заголовок формируется как Basic
base64(username:password).
Если API интегрирован с веб-интерфейсом и требует входа через форму, Puppeteer позволяет эмулировать ввод данных и отправку формы:
await page.goto('https://example.com/login');
await page.type('#username', 'user123');
await page.type('#password', 'securePassword');
await page.click('#login-button');
await page.waitForNavigation({ waitUntil: 'networkidle0' });
После успешного входа все последующие запросы будут содержать сессионные
куки, необходимые для аутентификации API. Важно убедиться, что ожидание
networkidle0 корректно завершает загрузку всех ресурсов.
Периодическая аутентификация через форму может быть неудобной для повторного тестирования. Puppeteer позволяет сохранять куки и восстанавливать сессии:
// Сохранение куки после входа
const cookies = await page.cookies();
require('fs').writeFileSync('cookies.json', JSON.stringify(cookies, null, 2));
// Загрузка куки в новую сессию
const cookies = JSON.parse(require('fs').readFileSync('cookies.json'));
await page.setCookie(...cookies);
Это особенно полезно для долгосрочного тестирования API с ограниченными ресурсами аутентификации.
Для сложных сценариев тестирования можно отправлять HTTP-запросы
напрямую из Puppeteer с помощью встроенного fetch внутри
контекста страницы:
const response = await page.evaluate(async () => {
const res = await fetch('https://example.com/api/data', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json'
}
});
return res.json();
});
console.log(response);
Этот подход позволяет проверять результаты API без необходимости рендеринга интерфейса, сохраняя полный контроль над заголовками и телом запроса.
Для API с коротким сроком действия токенов важно реализовать механизм
обновления. Puppeteer может имитировать отправку запроса на
/refresh и автоматическое обновление токена в заголовках:
async function refreshToken(page) {
const newToken = await page.evaluate(async () => {
const res = await fetch('https://example.com/api/refresh', {
method: 'POST',
credentials: 'include'
});
const data = await res.json();
return data.accessToken;
});
await page.setExtraHTTPHeaders({ 'Authorization': `Bearer ${newToken}` });
}
Для отслеживания аутентификации полезно использовать перехват сетевых запросов:
await page.setRequestInterception(true);
page.on('request', request => {
console.log('Request URL:', request.url());
console.log('Request Headers:', request.headers());
request.continue();
});
Это позволяет проверять, что токены и куки корректно отправляются с каждым запросом к API.
Все токены и пароли необходимо хранить в защищённых переменных окружения
и никогда не включать напрямую в код. Использование .env
файлов и библиотек вроде dotenv обеспечивает безопасное
управление секретами:
require('dotenv').config();
await page.setExtraHTTPHeaders({
'Authorization': `Bearer ${process.env.API_TOKEN}`
});
Тесты должны учитывать возможные ошибки, такие как истёкший токен или неверные данные. Puppeteer позволяет проверять статус ответа и реагировать соответствующим образом:
const response = await page.goto('https://example.com/protected');
if (response.status() === 401) {
console.error('Аутентификация не удалась');
await refreshToken(page);
}
Такой подход обеспечивает надёжность тестов и минимизирует зависимость от внешних факторов.
В автоматизированных пайплайнах Puppeteer может использоваться для тестирования защищённых API без интерактивного браузера, запускаясь в headless режиме. Установка заголовков, куки и токенов позволяет интегрировать проверку аутентификации напрямую в процесс сборки и тестирования.