Вибрация и уведомления

Protractor — инструмент для автоматизированного тестирования Angular и AngularJS приложений. Он позволяет интегрировать проверку взаимодействия с элементами пользовательского интерфейса, включая обработку событий, уведомлений и откликов устройства, таких как вибрация.

Управление уведомлениями браузера

В веб-приложениях уведомления могут реализовываться с помощью Notification API. В Protractor тестирование уведомлений требует работы с асинхронным кодом и проверкой состояния уведомлений:

browser.executeScript(() => {
    return Notification.permission;
}).then(permission => {
    console.log('Текущее разрешение на уведомления:', permission);
});

Для симуляции разрешений можно использовать Chrome Options:

const { browser } = require('protractor');
browser.waitForAngularEnabled(false);

browser.getCapabilities().then(capabilities => {
    console.log(capabilities.get('browserName'));
});

Можно запретить или разрешить уведомления на уровне профиля браузера, что позволяет тестам работать предсказуемо.

Работа с вибрацией

API вибрации в браузере (navigator.vibrate) позволяет устройствам с поддержкой отдавать тактильный отклик. Protractor позволяет проверить вызов вибрации через executeScript:

browser.executeScript(() => {
    navigator.vibrate(200);
    return navigator.vibrate ? 'vibration triggered' : 'vibration not supported';
}).then(result => {
    console.log(result);
});

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

browser.executeScript(() => {
    navigator.vibrate([100, 50, 100, 50]);
});

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

Асинхронность и ожидания

Protractor использует WebDriverJS, что требует контроля асинхронных операций через async/await или then:

it('должен вызвать вибрацию', async () => {
    const result = await browser.executeScript(() => navigator.vibrate(300));
    expect(result).toBe(true);
});

Метод executeScript возвращает результат выполнения JavaScript в контексте страницы, что позволяет проверять корректность вызовов без взаимодействия с реальным устройством.

Отслеживание событий уведомлений

Уведомления генерируют события show, click и close. Их можно перехватывать и проверять:

browser.executeScript(() => {
    return new Promise(resolve => {
        const notification = new Notification('Тест', { body: 'Сообщение' });
        notification.ons how = () => resolve('show event fired');
    });
}).then(result => {
    expect(result).toBe('show event fired');
});

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

Интеграция с Angular

Protractor автоматически ожидает завершения Angular-зон, что облегчает тестирование уведомлений и вызовов вибрации в компонентах:

element(by.id('vibrate-button')).click();
browser.executeScript(() => navigator.vibrate(150));

В Angular компонентах можно комбинировать тестирование событий с наблюдением за состоянием компонентов через element.getText() или element.isDisplayed().

Особенности кросс-браузерного тестирования

Не все браузеры поддерживают Notification API или вибрацию. Для корректной работы тестов рекомендуется проверять наличие API перед вызовом:

browser.executeScript(() => {
    return !!(window.Notification && navigator.vibrate);
}).then(supported => {
    expect(supported).toBe(true);
});

Для мобильных эмуляторов можно использовать Chrome DevTools Protocol через browser.driver.sendChromiumCommand, чтобы имитировать вибрацию и уведомления в тестах.

Логирование и отладка

Protractor позволяет вести лог событий при тестировании уведомлений:

browser.manage().logs().get('browser').then(entries => {
    entries.forEach(entry => console.log(entry.message));
});

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

Советы по стабильности тестов

  • Всегда проверять разрешения на уведомления перед тестами.
  • Использовать browser.wait для контроля момента появления уведомления.
  • Разделять тесты на части: проверка вызова вибрации отдельно от проверки отображения уведомления.
  • Для мобильных сценариев эмулировать вибрацию через DevTools, чтобы тесты были воспроизводимы на CI/CD.

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