В веб-тестировании взаимодействие с элементами страницы часто требует
контроля над событиями фокуса (focus) и его потери
(blur). Эти события критически важны для проверки поведения
форм, валидации данных и динамического изменения интерфейса. Protractor,
как надстройка над Selenium WebDriver для Angular-приложений,
предоставляет инструменты для работы с этими событиями, хотя прямой
поддержки focus и blur через стандартные
методы нет, но их можно реализовать через комбинацию действий и
выполнения скриптов в браузере.
1. element(by.css(...)).click()
Наиболее простой способ установить фокус на элемент — клик по нему. Этот
метод подходит для интерактивных элементов (input,
textarea, button), которые реагируют на клик
событием focus.
let inputField = element(by.css('#username'));
inputField.click();
После вызова click() элемент получает фокус, и браузер
инициирует событие focus. Для проверки последствий этого
события можно использовать ожидания (ExpectedConditions)
или проверку атрибутов/классов элемента.
2. Использование browser.actions() Для
более сложного управления фокусом, особенно если необходимо имитировать
наведение клавиатурой или перемещение по элементам, применяется API
actions().
let inputField = element(by.css('#password'));
browser.actions().mouseMove(inputField).click().perform();
Этот подход гарантирует, что событие focus будет
сгенерировано, аналогично реальному поведению пользователя.
3. Вызов событий через JavaScript В случаях, когда
клик или действия мышью невозможны или не подходят, можно вручную
инициировать событие focus через
executeScript().
let inputField = element(by.css('#email'));
browser.executeScript("arguments[0].focus();", inputField.getWebElement());
Аналогично, для события blur используется:
browser.executeScript("arguments[0].blur();", inputField.getWebElement());
Этот метод особенно полезен для проверки поведения форм с кастомной валидацией или сложной логикой, зависящей от потери фокуса.
focus и blurПосле того как фокус установлен или потерян, часто требуется проверить реакцию интерфейса:
1. Проверка CSS-классов Элементы могут менять стиль при получении или потере фокуса.
let inputField = element(by.css('#username'));
inputField.click();
expect(inputField.getAttribute('class')).toContain('focused');
browser.executeScript("arguments[0].blur();", inputField.getWebElement());
expect(inputField.getAttribute('class')).not.toContain('focused');
2. Проверка текста и сообщений валидации Многие
формы показывают сообщения только после события blur.
let inputField = element(by.css('#email'));
inputField.sendKeys('invalid-email');
browser.executeScript("arguments[0].blur();", inputField.getWebElement());
let errorMsg = element(by.css('.error-message'));
expect(errorMsg.isDisplayed()).toBe(true);
focus/blur с ожиданиямиИспользование ExpectedConditions позволяет корректно
обрабатывать асинхронные реакции на события:
let inputField = element(by.css('#username'));
inputField.click();
let EC = protractor.ExpectedConditions;
let submitBtn = element(by.css('#submit'));
browser.wait(EC.elementToBeClickable(submitBtn), 5000);
submitBtn.click();
Этот подход предотвращает гонку между генерацией событий и проверкой результатов, что особенно важно при динамически обновляемых Angular-приложениях.
Иногда тестирование требует комбинации focus, ввода
данных и blur. Для этого удобно использовать цепочки
действий:
let inputField = element(by.css('#password'));
browser.actions()
.mouseMove(inputField)
.click()
.sendKeys('Secret123')
.perform()
.then(() => browser.executeScript("arguments[0].blur();", inputField.getWebElement()));
Такой подход имитирует реальное поведение пользователя: фокус, ввод текста и выход из поля, что триггерит все связанные события.
В Angular-приложениях часто применяются директивы
ng-focus и ng-blur. Protractor автоматически
синхронизируется с зоной Angular (Zone.js), поэтому события
focus и blur, вызванные через
click() или actions(), корректно учитываются в
жизненном цикле приложения. Для кастомных компонентов, не использующих
стандартные HTML-элементы, иногда требуется прямое выполнение скриптов
для генерации этих событий.
browser.pause() для интерактивного
отслеживания событий.click() для надежного
фокуса.focus/blur с ожиданиями
(ExpectedConditions) для устойчивых тестов.Контроль над событиями focus и blur
позволяет детально тестировать формы, сложные UI-компоненты и поведение
Angular-приложений в ответ на пользовательские действия. Правильная
комбинация действий, скриптов и ожиданий обеспечивает точное
воспроизведение пользовательского взаимодействия и стабильность
автотестов.