Работа с cookies

В Protractor управление cookies является важной частью автоматизации тестирования веб-приложений. Cookies используются для хранения пользовательских сессий, настроек и других данных, необходимых для корректного функционирования веб-сайтов. Protractor предоставляет удобные методы для работы с cookies через объект browser.manage().cookies(), который позволяет создавать, получать, удалять и проверять cookies.


Получение cookies

Для получения всех cookies используется метод getAll(), который возвращает массив объектов, содержащих свойства каждой cookie:

browser.manage().cookies.getAll().then(function(cookies) {
    console.log(cookies);
});

Каждый объект cookie имеет следующие ключевые свойства:

  • name — имя cookie
  • value — значение cookie
  • path — путь, к которому применима cookie
  • domain — домен, для которого cookie действительна
  • secure — флаг безопасности (true, если cookie передается только по HTTPS)
  • httpOnly — флаг, запрещающий доступ к cookie из JavaScript

Для получения конкретной cookie используется метод get(name):

browser.manage().cookies.get('session_id').then(function(cookie) {
    console.log(cookie);
});

Если cookie с указанным именем отсутствует, метод возвращает null.


Добавление cookies

Добавление cookie выполняется методом add(cookieObj). Передаваемый объект должен содержать хотя бы name и value. Дополнительно можно указать path, domain, secure и expiry (в секундах с момента UNIX-эпохи):

browser.manage().cookies.add({
    name: 'user',
    value: 'JohnDoe',
    path: '/',
    secure: true,
    httpOnly: true
});

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


Удаление cookies

Protractor позволяет удалять отдельные cookies или все сразу.

Удаление конкретной cookie:

browser.manage().cookies.delete('user');

Если требуется удалить все cookies:

browser.manage().cookies.deleteAll();

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


Проверка существования cookies

Проверка наличия cookie может выполняться через get(name), возвращая null при отсутствии. Для автоматизации тестов часто используется цепочка методов then или async/await:

let cookie = await browser.manage().cookies.get('session_id');
if (cookie) {
    console.log('Cookie существует');
} else {
    console.log('Cookie отсутствует');
}

Особенности работы с cookies в Protractor

  1. Асинхронность Все методы работы с cookies возвращают промисы, что требует использования .then() или async/await. Это позволяет избежать гонок при работе с браузером.

  2. Сессии и контексты Cookies привязаны к текущему окну/сессии браузера. Если тест открывает новые вкладки или окна, cookies нужно учитывать отдельно.

  3. HTTPOnly cookies JavaScript не имеет доступа к cookies с флагом httpOnly. Protractor может работать с ними, только если браузер получает cookie через HTTP-запрос.

  4. Совместимость с разными браузерами Некоторые браузеры могут ограничивать доступ к cookies при использовании определённых протоколов, например file://. Для надежного тестирования рекомендуется запускать тесты через http:// или https://.


Примеры практического использования

Эмуляция авторизации через cookie:

await browser.manage().cookies.add({
    name: 'auth_token',
    value: 'abcdef123456',
    path: '/',
    secure: true
});
await browser.get('https://example.com/dashboard');

Очистка cookies перед тестом:

beforeEach(async () => {
    await browser.manage().cookies.deleteAll();
});

Проверка удаления cookie:

await browser.manage().cookies.delete('auth_token');
let cookie = await browser.manage().cookies.get('auth_token');
expect(cookie).toBeNull();

Использование cookies в Protractor позволяет управлять сессиями, ускорять тестирование авторизации и контролировать состояние приложения между тестами. Корректное понимание методов get, add и delete обеспечивает гибкость в автоматизации и предотвращает непредсказуемое поведение тестов.