Управление куками

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

Основные операции с куками

WebdriverIO включает методы для работы с куками, позволяя их читать, создавать, изменять и удалять. Для работы с куками используется объект browser, который предоставляет несколько API-методов для управления куками.

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

Для получения всех куков на текущей странице используется метод browser.getCookies(). Этот метод возвращает массив объектов, каждый из которых представляет отдельный cookie.

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

Результат будет содержать список всех куков, например:

[
  {
    "name": "session_id",
    "value": "1234567890",
    "domain": ".example.com",
    "path": "/",
    "secure": true,
    "httpOnly": true,
    "sameSite": "Strict"
  },
  {
    "name": "user_preferences",
    "value": "{\"theme\":\"dark\"}",
    "domain": ".example.com",
    "path": "/",
    "secure": false,
    "httpOnly": false,
    "sameSite": "Lax"
  }
]

Для добавления нового cookie можно использовать метод browser.setCookies(). Он принимает объект с параметрами cookie: имя, значение, домен, путь, срок действия и другие параметры.

await browser.setCookies({
  name: 'user_token',
  value: 'abc123xyz',
  domain: '.example.com',
  path: '/',
  secure: true,
  httpOnly: true,
  sameSite: 'Strict'
});

При добавлении куки необходимо учитывать следующие параметры:

  • name — имя куки.
  • value — значение куки.
  • domain — домен, к которому относится cookie.
  • path — путь на сервере, к которому относится cookie.
  • secure — если true, cookie будет отправляться только через HTTPS.
  • httpOnly — если true, cookie нельзя будет получить через JavaScript.
  • sameSite — настройка, которая помогает предотвратить атаки CSRF, ограничивая отправку куки только с запросами с того же домена.

Изменение существующих cookie осуществляется также через метод browser.setCookies(). При этом важно, что для изменения cookie нужно указать все параметры, так как WebdriverIO перезаписывает cookie с указанным именем, если оно уже существует.

await browser.setCookies({
  name: 'user_token',
  value: 'newTokenValue',
  domain: '.example.com'
});

Для удаления cookie используется метод browser.deleteCookies(), который позволяет удалить один или несколько cookies. Если необходимо удалить все cookies, можно вызвать browser.deleteCookies() без параметров.

await browser.deleteCookies('user_token'); // удаляет только user_token
await browser.deleteCookies(); // удаляет все cookies

Для того чтобы проверить наличие конкретного cookie, можно использовать метод browser.getCookie(), который принимает имя cookie и возвращает его данные, если оно существует, или null, если cookie не найдено.

const cookie = await browser.getCookie('session_id');
if (cookie) {
  console.log('Cookie найдено:', cookie);
} else {
  console.log('Cookie не найдено');
}

Работа с куками в тестах

Управление куками необходимо для создания изолированных тестов. Например, если требуется, чтобы каждый тест запускался с новыми cookies, можно удалить все cookies перед началом теста, используя метод browser.deleteCookies(). Также можно установить необходимые cookies, чтобы симулировать определённое состояние пользователя.

beforeEach(async () => {
  await browser.deleteCookies(); // удаление всех cookies
  await browser.setCookies({ name: 'auth_token', value: 'test_token', domain: '.example.com' });
});

Ограничения

  • Сессионные cookies: Некоторые cookies действуют только для текущей сессии браузера и удаляются при закрытии браузера. Если требуется, чтобы cookie оставался между сессиями, необходимо установить параметр expires в объект cookie, указав срок действия.
await browser.setCookies({
  name: 'persistent_cookie',
  value: 'some_value',
  domain: '.example.com',
  expires: Math.floor(Date.now() / 1000) + 3600 // cookie истекает через 1 час
});
  • Доступность cookies в разных доменах: Некоторые cookies могут быть доступны только для определённых поддоменов или путей. WebdriverIO позволяет манипулировать cookies на уровне каждого конкретного домена и пути.

Тестирование на основе cookies

Cookies могут использоваться для выполнения специфичных для пользователя тестов, таких как авторизация и управление состоянием сессии. Например, при автоматизированном тестировании веб-приложений можно предварительно установить cookie, имитируя успешную авторизацию пользователя.

beforeEach(async () => {
  await browser.setCookies({
    name: 'auth_token',
    value: 'valid_token',
    domain: '.example.com'
  });
});

it('Должен загрузить страницу с учётными данными', async () => {
  await browser.url('https://example.com/dashboard');
  const userProfile = await $('div.profile');
  expect(await userProfile.isDisplayed()).toBe(true);
});

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

Заключение

WebdriverIO предоставляет полный набор инструментов для работы с cookies. Это включает создание, изменение, удаление и получение cookie, а также возможность управления их параметрами. Управление cookies может существенно улучшить стабильность и предсказуемость тестов, а также сэкономить время на повторных авторизациях или настройках сессий.