В процессе тестирования веб-приложений важно учитывать работу с данными, которые хранятся в хранилищах браузера, таких как cookies, localStorage, sessionStorage и IndexedDB. Это позволяет проверить, как приложение взаимодействует с состоянием пользователя между сессиями, а также как различные данные влияют на поведение страницы. В Playwright доступна гибкость в манипулировании этими данными, что делает тестирование более точным и удобным.
Cookies часто используются для хранения информации о сессии, например, идентификатора пользователя или токенов аутентификации. В Playwright можно легко управлять cookies с помощью API, что полезно для тестирования различных сценариев, таких как проверка поведения пользователя после входа в систему.
Получение cookies
Для получения cookies на странице используется метод
context.cookies(), который возвращает список всех cookies
для текущего контекста:
const cookies = await context.cookies();
console.log(cookies);
Метод вернет массив объектов cookie, каждый из которых содержит информацию о имени, значении, пути, домене, флаге безопасности и других атрибутах.
Установка cookies
Для того чтобы установить cookie в контексте браузера, используется
метод context.addCookies(). Этот метод принимает массив
объектов cookie и устанавливает их для соответствующего контекста:
await context.addCookies([{
name: 'userSession',
value: 'abc123',
domain: 'example.com',
path: '/',
httpOnly: true,
secure: true
}]);
Здесь важно правильно указать домен, путь и другие атрибуты cookie, чтобы они корректно применялись в тестируемом приложении.
Удаление cookies
Чтобы удалить cookies, используйте метод
context.clearCookies(), который удаляет все cookies для
текущего контекста:
await context.clearCookies();
Если необходимо удалить конкретную cookie, нужно использовать
context.deleteCookies() с указанием домена и пути:
await context.deleteCookies({ name: 'userSession', domain: 'example.com' });
Местное хранилище браузера (localStorage и
sessionStorage) используется для хранения данных, которые
могут сохраняться между сессиями или только в пределах одной. В
Playwright взаимодействие с этими хранилищами происходит через
выполнение JavaScript в контексте страницы.
Получение данных из localStorage и sessionStorage
Чтобы получить данные из localStorage или
sessionStorage, можно выполнить JavaScript в контексте
страницы с помощью метода page.evaluate():
const localStorageData = await page.evaluate(() => localStorage.getItem('key'));
const sessionStorageData = await page.evaluate(() => sessionStorage.getItem('key'));
console.log(localStorageData, sessionStorageData);
Этот код позволяет извлечь значения по ключу из соответствующих хранилищ.
Установка данных в localStorage и sessionStorage
Для записи данных в хранилища также используется метод
page.evaluate(). Важно помнить, что данные будут
сохраняться только в пределах одной сессии браузера (для
sessionStorage) или на протяжении нескольких сессий (для
localStorage):
await page.evaluate(() => {
localStorage.setItem('userToken', 'abc123');
sessionStorage.setItem('sessionId', 'xyz789');
});
Удаление данных из localStorage и sessionStorage
Чтобы удалить данные из localStorage или
sessionStorage, используйте методы
removeItem() или clear():
await page.evaluate(() => {
localStorage.removeItem('userToken');
sessionStorage.clear();
});
Удаление данных из localStorage или
sessionStorage полезно для подготовки среды тестирования,
например, для очистки состояния между тестами.
IndexedDB представляет собой асинхронное хранилище для более сложных
данных, таких как объекты и массивы. В отличие от
localStorage, IndexedDB позволяет хранить большие объемы
данных и обеспечивает более высокую производительность при работе с
большим количеством объектов.
Получение данных из IndexedDB
Для взаимодействия с IndexedDB в Playwright используется выполнение
JavaScript в контексте страницы с использованием метода
page.evaluate():
await page.evaluate(() => {
const request = indexedDB.open('myDatabase');
request.onsucc ess = () => {
const db = request.result;
const transaction = db.transaction('myStore', 'readonly');
const store = transaction.objectStore('myStore');
const getRequest = store.get(1); // Получаем объект по ключу
getRequest.onsucc ess = () => {
console.log(getRequest.result);
};
};
});
Этот код показывает, как открыть IndexedDB и извлечь данные из хранилища по ключу. Такой подход позволяет манипулировать данными в более сложных структурах.
Запись данных в IndexedDB
Запись данных в IndexedDB выполняется через транзакции, как показано в следующем примере:
await page.evaluate(() => {
const request = indexedDB.open('myDatabase');
request.onsucc ess = () => {
const db = request.result;
const transaction = db.transaction('myStore', 'readwrite');
const store = transaction.objectStore('myStore');
store.put({ id: 1, name: 'itemName' }); // Добавляем или обновляем запись
};
});
Удаление данных из IndexedDB
Для удаления данных из IndexedDB можно использовать метод
delete(), указав ключ, по которому нужно удалить
запись:
await page.evaluate(() => {
const request = indexedDB.open('myDatabase');
request.onsucc ess = () => {
const db = request.result;
const transaction = db.transaction('myStore', 'readwrite');
const store = transaction.objectStore('myStore');
store.delete(1); // Удаляем запись по ключу
};
});
Тестирование аутентификации
Одним из типичных сценариев является тестирование аутентификации, где нужно проверить поведение приложения после того, как пользователь войдет в систему. В таком случае можно установить cookies или localStorage с необходимыми данными о пользователе:
await context.addCookies([{
name: 'authToken',
value: 'validToken123',
domain: 'example.com'
}]);
После этого можно проверить доступ к защищенным страницам, а также корректность поведения интерфейса.
Проверка очистки данных
Еще одним важным сценарием является проверка очистки данных после выхода пользователя из системы или завершения сессии. Для этого можно использовать методы для удаления cookies, данных из localStorage и sessionStorage:
await context.clearCookies();
await page.evaluate(() => localStorage.clear());
await page.evaluate(() => sessionStorage.clear());
Эти действия помогают убедиться, что приложение правильно очищает все следы пользовательской активности.
Манипуляции с данными хранилища являются важной частью тестирования веб-приложений с использованием Playwright. Возможность контролировать cookies, localStorage, sessionStorage и IndexedDB дает возможность глубоко тестировать взаимодействие приложения с данными пользователя, а также проверять различные сценарии поведения в зависимости от состояния этих хранилищ.