Cypress предоставляет гибкие возможности для управления разрешениями браузера, что особенно важно при тестировании функционала, связанного с доступом к геолокации, камере, микрофону, уведомлениям и другим API браузера. Контроль над разрешениями позволяет эмулировать поведение пользователя в реальных условиях без необходимости вмешательства вручную.
Разрешения браузера (permissions) — это механизм, который ограничивает доступ веб-приложений к определённым функциям системы. К основным типам относятся:
geolocation — доступ к геопозиции пользователя.notifications — отправка уведомлений.camera и microphone — доступ к камере и
микрофону.clipboard-read и clipboard-write — доступ
к буферу обмена.midi, persistent-storage,
push и другие специализированные разрешения.Cypress использует механизм управления permissions через Chrome DevTools Protocol (CDP), что позволяет задавать поведение этих разрешений программно.
Для установки разрешений существует несколько подходов:
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, чтобы подменить
стандартное поведение браузера, возвращая заранее заданные координаты.
Это позволяет тестировать функционал карты или определения
местоположения без реального запроса геопозиции.
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' }));
}
});
В этом случае приложение должно корректно обработать ошибку, отобразить уведомление пользователю или скрыть недоступные функции.
cy.visit()
для тестов, где важно эмулировать разные сценарии отказа или
предоставления разрешений.Управление browser permissions в Cypress обеспечивает надежное и воспроизводимое тестирование функций, связанных с доступом к системным ресурсам. Комбинация стубов, CDP и аргументов браузера позволяет эмулировать любые сценарии и минимизировать зависимость тестов от внешней среды.