Сохранение состояния между тестами

В процессе автоматизации тестирования с использованием WebdriverIO часто возникает необходимость сохранять состояние между различными тестами. Это может быть полезно для ускорения тестов, избежания излишней повторной аутентификации, сохранения данных формы или переноса сессии между тестами, что позволяет тестировать различные функциональности без необходимости каждый раз начинать с “чистого листа”. В WebdriverIO есть несколько методов для управления состоянием между тестами.

Работа с cookies

Один из самых простых способов сохранить состояние между тестами — это использование cookies. Cookies содержат важные данные сессии, такие как информация о пользователе, авторизация и другие параметры, которые могут быть полезны для повторного использования между тестами.

Сохранение и загрузка cookies

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

// Сохранение cookies
const cookies = await browser.getCookies();

// Загрузка cookies перед выполнением теста
await browser.setCookies(cookies);

Сохранение cookies в одном тесте и загрузка их в другом позволяет избежать повторной аутентификации и ускоряет выполнение тестов.

Пример использования

Для того чтобы сохранить cookies между тестами, можно использовать WebdriverIO hooks, такие как before и after, чтобы реализовать логирование состояния cookies перед и после выполнения тестов.

let savedCookies = [];

before(async () => {
    // Сохранение cookies перед тестами
    savedCookies = await browser.getCookies();
});

after(async () => {
    // Восстановление cookies после тестов
    await browser.setCookies(savedCookies);
});

Локальное хранилище (localStorage и sessionStorage)

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

Работа с localStorage

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

// Получение данных из localStorage
const value = await browser.execute(() => {
    return window.localStorage.getItem('key');
});

// Установка данных в localStorage
await browser.execute(() => {
    window.localStorage.setItem('key', 'value');
});

Работа с sessionStorage

Работа с sessionStorage аналогична localStorage, однако данные сохраняются только на время текущей сессии.

// Получение данных из sessionStorage
const value = await browser.execute(() => {
    return window.sessionStorage.getItem('key');
});

// Установка данных в sessionStorage
await browser.execute(() => {
    window.sessionStorage.setItem('key', 'value');
});

Использование состояния браузера

WebdriverIO позволяет управлять состоянием самого браузера, что полезно, если необходимо сохранять, например, масштабирование окна или позиции элементов. Для этого можно использовать методы управления окном браузера, такие как browser.getWindowRect() и browser.setWindowRect().

Пример работы с окнами

// Сохранение текущего состояния окна
const windowState = await browser.getWindowRect();

// Восстановление состояния окна
await browser.setWindowRect(windowState.x, windowState.y, windowState.width, windowState.height);

Сохранение состояния в переменных окружения

Если в проекте используется переменная окружения для управления состоянием тестов, это можно интегрировать с WebdriverIO. Например, можно хранить информацию о состоянии сессии, аутентификации или другие параметры в переменных окружения и передавать их между тестами.

// Сохранение состояния сессии в переменной окружения
process.env.USER_SESSION = 'your-session-data';

Для восстановления состояния в другом тесте можно использовать переданные значения.

// Восстановление данных сессии из переменной окружения
const sessionData = process.env.USER_SESSION;

Использование тестовых фреймворков и их методов для управления состоянием

Многие тестовые фреймворки, такие как Mocha или Jasmine, позволяют настроить хуки (before, after, beforeEach, afterEach) для управления состоянием между тестами. Например, можно сохранить состояние перед запуском теста и восстановить его после выполнения.

Пример с Mocha

let sessionData;

beforeEach(async () => {
    // Сохранение состояния перед каждым тестом
    sessionData = await browser.getCookies();
});

afterEach(async () => {
    // Восстановление состояния после каждого теста
    await browser.setCookies(sessionData);
});

Проблемы, связанные с сохранением состояния

Хотя сохранение состояния между тестами позволяет значительно ускорить процесс тестирования, существует несколько моментов, на которые стоит обратить внимание:

  • Изоляция тестов: Если тесты не изолированы должным образом, изменение состояния в одном тесте может повлиять на результаты других тестов. Важно убедиться, что каждый тест работает в своем собственном контексте.

  • Многофазное тестирование: При работе с данными сессии или cookies стоит помнить, что они могут изменяться в процессе выполнения тестов, поэтому важно отслеживать их актуальность.

  • Управление состоянием в браузере: Если используется несколько окон или вкладок браузера, нужно тщательно следить за тем, чтобы состояние передавалось и восстанавливалось для каждого окна или вкладки.

Заключение

Сохранение состояния между тестами в WebdriverIO является мощным инструментом для повышения эффективности тестирования, позволяя избежать повторных действий, таких как авторизация или загрузка данных. Использование cookies, localStorage, sessionStorage и других методов управления состоянием позволяет сохранять информацию, необходимую для успешного выполнения тестов. Однако при этом необходимо учитывать возможные проблемы с изоляцией тестов и корректным управлением состоянием между тестами.