В тестировании с использованием Puppeteer часто возникает необходимость работать с сессиями пользователя, особенно когда речь идет о проверке функционала авторизации, взаимодействия с элементами после выхода из системы или сессии. Важно предусматривать сценарии, когда сессия может завершиться по разным причинам, например, из-за истечения времени действия сессионных cookie или из-за явного выхода пользователя из системы. Рассмотрим основные подходы к обработке таких ситуаций с помощью Puppeteer.
Puppeteer, как инструмент для автоматизации работы с браузером, работает с сессионными cookies, которые хранят информацию о текущем состоянии авторизации и других пользовательских данных. Когда сессия истекает или когда пользователь выходит, cookies удаляются или теряют свою актуальность, что может приводить к сбоям в тестах, если не предусмотреть их обработку. Основная задача тестировщика — грамотно реагировать на такие события.
Чтобы отслеживать состояние сессии, можно использовать методы, позволяющие работать с cookies. Для этого в Puppeteer предусмотрены функции, которые позволяют получить все cookies на текущей странице, добавлять новые или удалять существующие. Важно, что проверку сессии следует делать перед выполнением критических операций, чтобы убедиться, что пользователь авторизован и сессия не истекла.
Пример получения cookies на странице:
const cookies = await page.cookies();
Проверив cookies, можно удостовериться, что сессия активна, или обнаружить, что необходимые cookies отсутствуют, что будет свидетельствовать об истечении сессии.
В случае истечения сессии тесты могут повергаться в ошибку из-за отсутствия актуальных cookies или недоступности страницы, требующей авторизации. Чтобы грамотно обработать такие ситуации, необходимо:
Пример обработки истечения сессии с автоматическим повторным входом:
const cookies = await page.cookies();
if (!cookies.some(cookie => cookie.name === &
// Сессия истекла, переавторизуем
await page.goto('https://example.com/login');
await page.type('#username', 'user');
await page.type('#password', 'password');
await page.click('#login-button');
await page.waitForNavigation();
// Ждем, пока не появится нужный cookie или страница не загрузится
await page.waitForFunction(() => document.cookie.includes('session_id'));
}
В этом примере проверяется наличие cookie с идентификатором сессии. Если cookie отсутствует, выполняется процесс авторизации, и тест продолжает выполняться после успешного входа.
Если сессия может истечь не из-за действий пользователя, а по тайм-ауту, то стоит предусмотреть дополнительную проверку с интервалами в ходе выполнения теста. Например, можно периодически проверять, актуальны ли cookies, или ждать, пока появится какой-то элемент, свидетельствующий о том, что сессия активна.
Пример кода с таймаутом и проверкой состояния сессии:
const sessionExpired = async () => {
const cookies = await page.cookies();
return !cookies.some(cookie => cookie.name === 'session_id');
};
let attempts = 0;
while (attempts < 3) {
if (await sessionExpired()) {
// Сессия истекла, выполняем действия для восстановления
await page.reload();
attempts++;
} else {
break;
}
}
В этом примере сессия проверяется несколько раз в ходе выполнения теста с таймаутом на три попытки. Если сессия истекла, страница перезагружается, и происходит повторная проверка.
Одной из задач является правильная обработка ошибок, возникающих при взаимодействии с элементами, доступными только для авторизованных пользователей. При отсутствии сессии или если она истекла, попытка взаимодействовать с защищенной страницей приведет к ошибке.
Использование обработки ошибок через try-catch позволяет
корректно зафиксировать проблемы и сработать в случае истечения сессии.
Например:
try {
await page.goto('https://example.com/dashboard');
// Выполняем действия с защищенной страницей
} catch (error) {
if (error.message.includes('403')) {
// Сессия истекла или не авторизован
console.log('Сессия истекла, выполняем повторный вход.');
// Процесс восстановления сессии
}
}
В данном примере происходит попытка загрузить защищенную страницу. Если сервер возвращает ошибку 403 (доступ запрещен), это может свидетельствовать о том, что сессия истекла, и происходит обработка ситуации.
В некоторых случаях, если тест предполагает явный выход пользователя из
системы, необходимо удалить cookies или завершить сессию вручную. В
Puppeteer для этого используется метод page.deleteCookie,
который позволяет удалить cookies, связанные с текущей сессией.
Пример завершения сессии:
await page.deleteCookie(...cookies);
Удалив cookies, можно убедиться, что сессия завершена и тест продолжит свою работу в новом контексте.
Обработка истечения сессии в Puppeteer — это важный аспект, который позволяет тестам быть более устойчивыми и надежными. Использование проверки cookies, автоматизация повторного входа и обработка ошибок при недоступности страниц защищенной зоны помогают создавать устойчивые и точные тесты. Тестировщики должны учитывать разные сценарии с истечением сессии и правильно их обрабатывать, чтобы избежать ложных сбоев в тестировании.