Web-разработчики часто используют sessionStorage и
localStorage для хранения данных на стороне клиента. Эти
технологии предоставляют веб-страницам возможность сохранять информацию,
которая может быть использована для различных целей, таких как хранение
состояния пользователя или кэширование данных. В контексте тестирования
с использованием Playwright важно учитывать, как взаимодействовать с
этими хранилищами, чтобы корректно имитировать поведение пользователей и
проверять функциональность приложений.
Обе технологии предоставляют веб-приложениям доступ к локальному хранилищу данных, но с некоторыми различиями в области области действия и срока жизни данных:
sessionStorage: Хранит данные
только на время сессии браузера. Как только вкладка или окно браузера
закрывается, данные в sessionStorage удаляются. Это
хранилище привязано к конкретной вкладке.
localStorage: Данные в
localStorage сохраняются между сессиями и остаются
доступными даже после закрытия браузера, пока пользователь не удалит их
вручную или приложение не очистит их через JavaScript. Это хранилище
сохраняет данные, привязанные ко всем вкладкам и окнам одного и того же
браузера.
Playwright предоставляет простой интерфейс для работы с данными,
хранящимися в sessionStorage и localStorage.
Для работы с ними используется метод
context.storageState(), который позволяет сохранять и
восстанавливать состояния хранилищ, что является полезным для симуляции
различных состояний приложения и повторного использования данных при
автоматических тестах.
Для того чтобы работать с хранилищами данных внутри Playwright, можно использовать два метода:
Извлечение данных из sessionStorage или
localStorage: Для извлечения данных из этих
хранилищ необходимо выполнить JavaScript в контексте страницы, используя
метод page.evaluate(). Пример кода для получения значения
из localStorage:
const data = await page.evaluate(() => localStorage.getItem('key'));
Аналогично для sessionStorage:
const data = await page.evaluate(() => sessionStorage.getItem('key'));Установка данных в sessionStorage или
localStorage: Для записи данных в хранилище нужно
также использовать page.evaluate():
await page.evaluate(() => localStorage.setItem('key', 'value'));
Для sessionStorage код будет аналогичен:
await page.evaluate(() => sessionStorage.setItem('key', 'value'));Сохранение и восстановление состояния хранилищ:
В тестах часто требуется сохранить состояние хранилища после выполнения
одного шага, а затем восстановить его в другом тесте или на другом этапе
теста. Это можно сделать с помощью функции
context.storageState().
Пример сохранения состояния хранилища:
await context.storageState({ path: 'storageState.json' });
Этот файл будет содержать информацию о текущем состоянии
localStorage и sessionStorage, которая может
быть использована для восстановления состояния позже:
const context = await browser.newContext({
storageState: 'storageState.json',
});Кросс-вкладочные и кросс-сессионные данные:
Важно понимать, что sessionStorage работает только в рамках
одной вкладки, в то время как localStorage доступно для
всех вкладок и окон, использующих тот же домен. Когда требуется
использование данных, которые должны быть доступны в разных вкладках,
рекомендуется использовать localStorage, так как его данные
сохраняются между сессиями.
Пример из реальной практики может выглядеть следующим образом.
Например, нужно протестировать функциональность аутентификации в
веб-приложении, где состояние пользователя хранится в
localStorage. Для этого можно сохранить состояние после
успешного входа и использовать его в дальнейшем.
// Сохранение состояния хранилища после успешной аутентификации
await page.goto('https://example.com/login');
await page.fill('input[name="username"]', 'testuser');
await page.fill('input[name="password"]', 'password123');
await page.click('button[type="submit"]');
// Сохранение состояния хранилища
await context.storageState({ path: 'authState.json' });
// Далее, при новом тесте
const newContext = await browser.newContext({
storageState: 'authState.json',
});
const newPage = await newContext.newPage();
await newPage.goto('https://example.com/dashboard');
Такой подход позволяет эмулировать вход в приложение и делать дальнейшие тесты с уже аутентифицированным пользователем без необходимости проходить процесс авторизации каждый раз.
В случае работы с несколькими вкладками и использования данных из
localStorage важно помнить, что данные остаются доступными
в других вкладках, пока они не будут удалены или изменены. Например, при
работе с двумя вкладками, одна из которых авторизована, а другая —
нет:
const [page1, page2] = await Promise.all([
context.newPage(),
context.newPage()
]);
// Вкладка 1 (авторизованная)
await page1.goto('https://example.com/login');
await page1.fill('input[name="username"]', 'testuser');
await page1.fill('input[name="password"]', 'password123');
await page1.click('button[type="submit"]');
// Вкладка 2 (не авторизованная)
await page2.goto('https://example.com/dashboard');
// После авторизации в page1, данные из localStorage становятся доступны и в page2
Для создания эффективных и быстродействующих тестов важно учитывать, что повторное использование состояния хранилища позволяет ускорить тестирование и сделать его более надежным. Вместо того чтобы каждый раз проходить процесс аутентификации или инициализации данных, можно использовать сохраненные состояния и тестировать только функциональность, связанную с изменениями данных.
Работа с sessionStorage и localStorage в
Playwright предоставляет разработчикам мощный инструмент для
тестирования и автоматизации, позволяя манипулировать данными, сохранять
состояние и имитировать действия пользователя с учетом сохраненных
данных. Использование storageState() для сохранения и
восстановления состояния хранилищ делает тесты быстрее и надежнее, а
также позволяет эффективно управлять состоянием при взаимодействии с
веб-приложениями.