Управление куками и хранилищем данных

WebdriverIO предоставляет мощные средства для работы с куки и локальным/сессионным хранилищем браузера, что позволяет автоматизировать тесты на более глубоком уровне, контролируя состояние приложения между сессиями или проверяя сохранённые данные.


Работа с куки

Куки используются для хранения информации о сессиях, пользовательских предпочтениях и аутентификации. WebdriverIO предоставляет методы для управления куками на уровне браузера.

Получение всех куки:

const allCookies = await browser.getCookies();
console.log(allCookies);

Метод возвращает массив объектов, где каждый объект содержит ключи: name, value, domain, path, expiry, httpOnly, secure.

Добавление новой куки:

await browser.setCookies({
    name: 'session_id',
    value: '12345',
    path: '/',
    httpOnly: true,
    secure: true
});

Получение конкретной куки по имени:

const cookie = await browser.getCookie('session_id');
console.log(cookie);

Удаление куки:

await browser.deleteCookies('session_id'); // удаление по имени
await browser.deleteCookies(); // удаление всех куки

Важно учитывать, что операции с куки выполняются только для текущего домена, открытого в браузере. Попытка обратиться к куки другого домена приведёт к пустому результату.


Локальное и сессионное хранилище

WebdriverIO позволяет управлять localStorage и sessionStorage, что удобно для тестирования SPA (Single Page Applications) и проверки состояния клиента без необходимости взаимодействия с сервером.

Установка данных в localStorage:

await browser.execute(() => {
    localStorage.setItem('token', 'abcdef123456');
    localStorage.setItem('theme', 'dark');
});

Получение данных из localStorage:

const token = await browser.execute(() => localStorage.getItem('token'));
console.log(token); // 'abcdef123456'

Удаление данных из localStorage:

await browser.execute(() => localStorage.removeItem('token'));
await browser.execute(() => localStorage.clear()); // очистка всех данных

Аналогичные методы применяются для sessionStorage:

await browser.execute(() => sessionStorage.setItem('sessionKey', 'value'));
const sessionValue = await browser.execute(() => sessionStorage.getItem('sessionKey'));
await browser.execute(() => sessionStorage.clear());

Отличие localStorage от sessionStorage заключается в том, что localStorage сохраняет данные между перезапусками браузера, а sessionStorage очищается после закрытия вкладки.


Проверка наличия данных

Для надежного тестирования часто требуется проверять существование куки или элементов хранилища перед выполнением действий:

const cookieExists = await browser.getCookie('session_id') !== null;
const tokenExists = await browser.execute(() => localStorage.getItem('token') !== null);

console.log(cookieExists, tokenExists);

Такой подход предотвращает ошибки при работе с данными, которых может ещё не быть.


Управление куки и хранилищем в разных сессиях

WebdriverIO позволяет изолировать тестовые сессии, что важно при параллельном запуске тестов:

  • Удаление всех куки и очистка хранилища перед тестом обеспечивает чистое состояние:
beforeEach(async () => {
    await browser.deleteCookies();
    await browser.execute(() => {
        localStorage.clear();
        sessionStorage.clear();
    });
});
  • Сохранение состояния между тестами можно реализовать с помощью сериализации куки и хранилища:
const cookies = await browser.getCookies();
const localStorageData = await browser.execute(() => ({ ...localStorage }));

// позже
await browser.setCookies(cookies);
await browser.execute((data) => {
    Object.entries(data).forEach(([key, value]) => localStorage.setItem(key, value));
}, localStorageData);

Особенности работы с куки и хранилищем

  • Методы WebdriverIO для работы с куки и хранилищем выполняются асинхронно и требуют await.
  • Для SPA важно выполнять действия после полной загрузки страницы, иначе данные могут быть перезаписаны скриптами приложения.
  • Не все браузеры одинаково поддерживают куки с флагами httpOnly и secure в тестовой среде, что стоит учитывать при написании кросс-браузерных тестов.

Практические советы

  1. Использовать куки для ускорения тестов авторизации вместо прохождения UI-логина.
  2. Сохранять состояние localStorage между тестами для тестирования сложных сценариев.
  3. Проверять наличие данных перед их использованием, чтобы избежать неожиданных ошибок в тестах.
  4. Для параллельного запуска тестов хранение и восстановление куки должно быть изолированным, чтобы тесты не конфликтовали между собой.

Эти инструменты делают WebdriverIO удобным для гибкого управления состоянием приложения на стороне клиента и позволяют создавать надёжные автоматизированные сценарии, которые имитируют поведение реального пользователя с сохранением и восстановлением данных между тестами.