Puppeteer — это мощная библиотека для автоматизации браузера, предоставляющая возможности для тестирования веб-приложений. Одним из часто встречающихся задач при тестировании является работа с авторизацией пользователей. В процессе тестирования важно сохранять состояние авторизации, чтобы избежать повторных логинов и ускорить выполнение тестов.
Сохранение сессий авторизации позволяет существенно ускорить тестирование, так как не нужно каждый раз повторно авторизовываться на веб-сайте, что экономит время и ресурсы. Например, на крупных веб-приложениях процесс логина может занимать значительное количество времени из-за использования различных проверок безопасности или вспомогательных интерфейсов.
Кроме того, сохранение сессий улучшает стабильность тестов, так как позволяет избежать непредсказуемых ошибок при авторизации. В тестах, которые повторяются на разных этапах, использование сохранённых сессий помогает точно воспроизводить состояние системы.
Авторизация обычно осуществляется с помощью форм ввода логина и пароля. В тестах с Puppeteer для автоматизации этого процесса необходимо:
Однако для повышения эффективности и надежности тестов желательно сохранить сессионные данные (например, куки и локальное хранилище), чтобы повторно не выполнять этот процесс.
Один из самых простых способов сохранить сессию — это сохранить cookies браузера. Puppeteer предоставляет удобные методы для работы с cookies.
Для того чтобы сохранить cookies после авторизации, можно
воспользоваться методом page.cookies(). Этот метод
возвращает все cookies для текущей страницы.
Пример сохранения cookies:
const puppeteer = require(&
async function saveCookies(page) {
const cookies = await page.cookies();
const fs = require('fs');
fs.writeFileSync('cookies.json', JSON.stringify(cookies));
}
async function loadCookies(page) {
const cookies = JSON.parse(fs.readFileSync('cookies.json', 'utf-8'));
for (const cookie of cookies) {
await page.setCookie(cookie);
}
}
В этом примере:
saveCookies сохраняет cookies в файл
cookies.json.
loadCookies загружает cookies из файла и
устанавливает их для новой сессии.
Помимо cookies, авторизация может также зависеть от данных в
localStorage или sessionStorage. Эти хранилища
часто используются для хранения информации о сессии или состоянии
пользователя.
Чтобы сохранить данные localStorage, можно использовать
метод page.evaluate() для извлечения содержимого:
async function saveLocalStorage(page) {
const localStorageData = await page.evaluate(() => {
return JSON.stringify(localStorage);
});
const fs = require('fs');
fs.writeFileSync('localStorage.json', localStorageData);
}
async function loadLocalStorage(page) {
const localStorageData = JSON.parse(fs.readFileSync('localStorage.json', 'utf-8'));
await page.evaluate((localStorageData) => {
Object.entries(localStorageData).forEach(([key, value]) => {
localStorage.setItem(key, value);
});
}, localStorageData);
}
Этот код сохраняет данные из localStorage в файл и затем
восстанавливает их на новой сессии.
Вместо работы напрямую с cookies и localStorage, можно сохранять
состояние всего браузера, включая сессии, cookies и другие данные.
Puppeteer предоставляет возможность сохранять и загружать сессии с
помощью метода browser.createIncognitoBrowserContext() для
работы с инкогнито-режимом и сохранения сессий.
Для сохранения состояния браузера используется метод
browserContext.storageState():
const browser = await puppeteer.launch();
const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();
// Выполните авторизацию
await page.goto('https://example.com/login');
await page.type('#username', 'user');
await page.type('#password', 'password');
await page.click('#loginButton');
await page.waitForNavigation();
// Сохранение состояния
const storage = await context.storageState();
fs.writeFileSync('storageState.json', JSON.stringify(storage));
// Закрытие браузера
await browser.close();
Восстановление состояния происходит следующим образом:
const browser = await puppeteer.launch();
const context = await browser.createIncognitoBrowserContext();
// Загрузка сохраненного состояния
const storage = JSON.parse(fs.readFileSync('storageState.json', 'utf-8'));
await context.setStorageState({ cookies: storage.cookies, localStorage: storage.localStorage });
const page = await context.newPage();
// Переход к защищенной странице, требующей авторизации
await page.goto('https://example.com/dashboard');
Этот способ более универсален, так как он сохраняет все данные о состоянии сессии (cookies, localStorage, sessionStorage и другие).
Обновление сессий. Периодически рекомендуется обновлять сохраненные сессии, так как данные о пользователе могут изменяться, и устаревшая сессия может привести к ошибкам. Например, после значительных изменений на серверной стороне или после истечения срока действия cookies.
Обработка ошибок. Всегда стоит обрабатывать возможные ошибки при восстановлении сессии. Например, если cookies или localStorage повреждены или не могут быть загружены, тесты могут упасть. В таких случаях необходимо обрабатывать исключения и использовать подходящие fallback-методы.
Безопасность сессий. Не стоит хранить в файлах чувствительную информацию, такую как пароли или токены доступа. Использование зашифрованных файлов или методов шифрования для хранения данных является хорошей практикой.
Использование инкогнито-режима. Для создания изолированных сессий рекомендуется использовать инкогнито-режим браузера. Он позволяет создавать чистые сессии для тестирования без влияния старых данных.
Долговечность данных. Если сессия зависит от специфических данных, которые могут изменяться (например, токены, связанные с временными данными), необходимо регулярно обновлять и проверять актуальность сохраненной сессии.
Путем сохранения и загрузки сессий авторизации можно значительно ускорить процесс тестирования веб-приложений с использованием Puppeteer. В зависимости от задач можно выбрать подходящий метод сохранения данных, будь то cookies, localStorage или полное состояние браузера. Это позволяет снизить время выполнения тестов, улучшить стабильность и точность автоматических проверок, а также повысить эффективность работы с веб-приложениями.