Работа с browser permissions

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


Основные концепции browser permissions

Разрешения браузера (permissions) — это механизм, который ограничивает доступ веб-приложений к определённым функциям системы. К основным типам относятся:

  • geolocation — доступ к геопозиции пользователя.
  • notifications — отправка уведомлений.
  • camera и microphone — доступ к камере и микрофону.
  • clipboard-read и clipboard-write — доступ к буферу обмена.
  • midi, persistent-storage, push и другие специализированные разрешения.

Cypress использует механизм управления permissions через Chrome DevTools Protocol (CDP), что позволяет задавать поведение этих разрешений программно.


Настройка разрешений в Cypress

Для установки разрешений существует несколько подходов:

  1. Через cy.visit() с опцией onBeforeLoad

Пример настройки разрешений для геолокации:

cy.visit('https://example.com', {
  onBeforeLoad(win) {
    cy.stub(win.navigator.geolocation, 'getCurrentPosition').callsFake((cb) => {
      return cb({ coords: { latitude: 55.751244, longitude: 37.618423 } });
    });
  }
});

Здесь используется метод stub, чтобы подменить стандартное поведение браузера, возвращая заранее заданные координаты. Это позволяет тестировать функционал карты или определения местоположения без реального запроса геопозиции.


  1. Через плагины и CDP для Chrome

Cypress позволяет управлять разрешениями через события плагина before:browser:launch. Например:

module.exports = (on, config) => {
  on('before:browser:launch', (browser = {}, launchOptions) => {
    if (browser.family === 'chromium') {
      launchOptions.args.push('--use-fake-ui-for-media-stream');
      launchOptions.args.push('--use-fake-device-for-media-stream');
      launchOptions.args.push('--disable-notifications');
    }
    return launchOptions;
  });
};

Эти аргументы позволяют:

  • --use-fake-ui-for-media-stream — автоматическое одобрение запроса на доступ к камере и микрофону.
  • --use-fake-device-for-media-stream — использование виртуального устройства вместо реального микрофона или камеры.
  • --disable-notifications — блокировка всплывающих уведомлений.

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


Работа с разрешениями на уровне теста

Для динамической подмены разрешений внутри конкретного теста можно использовать методы Cypress.automation и CDP напрямую:

Cypress.automation('remote:debugger:protocol', {
  command: 'Browser.grantPermissions',
  params: {
    origin: 'https://example.com',
    permissions: ['geolocation', 'notifications']
  }
});

Ключевые моменты:

  • origin — домен, для которого предоставляются разрешения.
  • permissions — массив разрешений, которые будут активированы.

Аналогично, для отзыва разрешений используется команда Browser.resetPermissions. Это позволяет создавать сценарии с отказом в доступе и проверять обработку ошибок на фронтенде.


Тестирование сценариев с отказом в разрешениях

Очень важно проверять поведение приложения при ограниченном доступе к API браузера. Пример для геолокации:

cy.visit('https://example.com', {
  onBeforeLoad(win) {
    cy.stub(win.navigator.geolocation, 'getCurrentPosition')
      .callsFake((success, error) => error({ code: 1, message: 'User denied geolocation' }));
  }
});

В этом случае приложение должно корректно обработать ошибку, отобразить уведомление пользователю или скрыть недоступные функции.


Полезные советы

  • Использовать CDP и аргументы браузера для глобальной настройки разрешений в тестовой среде.
  • Применять стабы на уровне cy.visit() для тестов, где важно эмулировать разные сценарии отказа или предоставления разрешений.
  • Всегда проверять поведение интерфейса при отказе в доступе, чтобы покрыть edge-case сценарии.
  • Для кросс-браузерного тестирования убедиться, что соответствующие опции доступны в используемом браузере: не все аргументы Chromium работают в Firefox.

Управление browser permissions в Cypress обеспечивает надежное и воспроизводимое тестирование функций, связанных с доступом к системным ресурсам. Комбинация стубов, CDP и аргументов браузера позволяет эмулировать любые сценарии и минимизировать зависимость тестов от внешней среды.