Puppeteer, инструмент для автоматизации браузера, предоставляет широкие возможности для тестирования веб-приложений, включая работу с состоянием сессии. Важно понимать, как правильно сохранять и восстанавливать сессии для улучшения производительности тестов, сокращения времени на подготовку данных и повышения стабильности тестового окружения.
Сессия в контексте Puppeteer — это состояние браузера, включающее информацию о текущем пользователе, куки, локальное хранилище и другие данные, которые необходимы для продолжения работы с веб-приложением. Использование сессий позволяет избежать необходимости заново авторизовываться и выполнять шаги, которые занимают время, например, заполнение форм или загрузка данных.
Преимущества использования сохранения и восстановления сессий включают:
Чтобы сохранить сессию в Puppeteer, нужно экспортировать куки и локальное хранилище из текущего контекста браузера. Эти данные можно затем записать в файл и использовать при следующем запуске тестов.
Для сохранения сессии в Puppeteer можно использовать метод
page.cookies(), который возвращает список всех cookies для
текущего контекста.
Пример кода:
const fs = require(&
async function saveSession(page) {
// Получаем все cookies
const cookies = await page.cookies();
// Сохраняем cookies в файл
fs.writeFileSync('cookies.json', JSON.stringify(cookies));
}
Для сохранения данных локального хранилища (например,
localStorage и sessionStorage), нужно
выполнить команду JavaScript в контексте страницы и сохранить данные.
Пример кода:
async function saveLocalStorage(page) {
const localStorageData = await page.evaluate(() => {
return Object.keys(localStorage).map(key => {
return { key: key, value: localStorage.getItem(key) };
});
});
// Сохраняем данные локального хранилища в файл
fs.writeFileSync('localStorage.json', JSON.stringify(localStorageData));
}
Восстановление сессии включает в себя загрузку сохранённых cookies и данных локального хранилища, а затем повторную их установку в текущий контекст страницы.
Чтобы восстановить cookies, нужно загрузить данные из файла и
использовать метод page.setCookie().
Пример кода:
async function restoreSession(page) {
const cookies = JSON.parse(fs.readFileSync('cookies.json', 'utf8'));
// Устанавливаем cookies
for (let cookie of cookies) {
await page.setCookie(cookie);
}
}
Для восстановления данных локального хранилища также необходимо
выполнить код в контексте страницы, который заново установит значения в
localStorage.
Пример кода:
async function restoreLocalStorage(page) {
const localStorageData = JSON.parse(fs.readFileSync('localStorage.json', 'utf8'));
await page.evaluate((data) => {
data.forEach(item => {
localStorage.setItem(item.key, item.value);
});
}, localStorageData);
}
Рассмотрим полный пример, который включает как сохранение, так и восстановление сессии:
const puppeteer = require('puppeteer');
const fs = require('fs');
async function saveSession(page) {
const cookies = await page.cookies();
fs.writeFileSync('cookies.json', JSON.stringify(cookies));
const localStorageData = await page.evaluate(() => {
return Object.keys(localStorage).map(key => {
return { key: key, value: localStorage.getItem(key) };
});
});
fs.writeFileSync('localStorage.json', JSON.stringify(localStorageData));
}
async function restoreSession(page) {
const cookies = JSON.parse(fs.readFileSync('cookies.json', 'utf8'));
for (let cookie of cookies) {
await page.setCookie(cookie);
}
const localStorageData = JSON.parse(fs.readFileSync('localStorage.json', 'utf8'));
await page.evaluate((data) => {
data.forEach(item => {
localStorage.setItem(item.key, item.value);
});
}, localStorageData);
}
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Восстановление сессии
await restoreSession(page);
// Открываем страницу
await page.goto('https://example.com');
// Выполняем действия на странице
// Сохраняем сессию после выполнения действий
await saveSession(page);
await browser.close();
})();
Проблемы с доменом и путями cookies. Cookies привязаны к определённому домену и пути. Если при восстановлении сессии используется другой домен или путь, cookies могут не работать должным образом. В таких случаях важно учитывать, что восстановленные cookies должны быть установлены в контексте соответствующего домена.
Ограничения локального хранилища. Локальное хранилище может хранить только строковые данные. Если в процессе сохранения и восстановления сессии используются другие типы данных, их нужно сериализовать и десериализовать соответствующим образом.
Совместимость с новыми версиями Puppeteer. Некоторые методы работы с cookies и локальным хранилищем могут изменяться с выходом новых версий Puppeteer, поэтому важно проверять совместимость используемых методов с текущей версией библиотеки.
Многопользовательская работа. Если необходимо управлять сессиями для нескольких пользователей одновременно, потребуется реализовать логику сохранения и восстановления сессий для каждого пользователя в отдельности, например, с использованием разных файлов или баз данных для хранения состояния.
Сохранение и восстановление сессий является мощным инструментом для эффективного тестирования веб-приложений. Правильное использование этих техник позволяет значительно сократить время на выполнение тестов и повысить их стабильность.