Работа с мобильными клавиатурами

Protractor изначально был создан для автоматизированного тестирования Angular-приложений, однако его возможности позволяют работать и с мобильными веб-приложениями, включая управление виртуальными клавиатурами на устройствах с iOS и Android. Работа с мобильной клавиатурой требует понимания особенностей взаимодействия с элементами ввода и асинхронного характера мобильных событий.


Управление полями ввода на мобильных устройствах

На мобильных устройствах активация текстового поля автоматически вызывает виртуальную клавиатуру. В Protractor взаимодействие с такими полями осуществляется с помощью стандартных методов WebDriver, таких как sendKeys() и clear(). Важно учитывать, что не все события клавиатуры сразу генерируются, поэтому иногда необходимо использовать дополнительные действия для гарантии корректного ввода.

const inputField = element(by.id('username'));
await inputField.click();          // активирует клавиатуру на мобильном устройстве
await inputField.clear();          // очищает поле
await inputField.sendKeys('test'); // ввод текста

Если поле ввода находится внутри динамически загружаемого компонента, следует использовать ожидания (ExpectedConditions) для надежного взаимодействия:

const EC = protractor.ExpectedConditions;
await browser.wait(EC.elementToBeClickable(inputField), 5000);
await inputField.sendKeys('mobileUser');

Управление виртуальной клавиатурой

Прямое управление клавишами виртуальной клавиатуры в Protractor ограничено, но с помощью sendKeys можно эмулировать нажатия на специальные клавиши:

const inputField = element(by.css('input[name="password"]'));
await inputField.sendKeys(protractor.Key.ENTER); // эмуляция нажатия Enter
await inputField.sendKeys(protractor.Key.BACK_SPACE); // удаление последнего символа

Ключи, доступные через protractor.Key, позволяют управлять Enter, Tab, Backspace, Escape, а также навигацией по тексту (ArrowLeft, ArrowRight). Это важно для мобильных форм, где некоторые поля могут автоматически переключаться после нажатия Enter.


Скроллинг к полям ввода

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

await browser.executeScript('arguments[0].scrollIntoView(true);', inputField.getWebElement());
await inputField.click();
await inputField.sendKeys('exampleText');

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


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

Мобильные клавиатуры вызывают отложенные события ввода, особенно на Android и iOS. Для корректного тестирования следует использовать ожидания завершения анимации или появления текста:

await browser.wait(async () => {
  const value = await inputField.getAttribute('value');
  return value === 'expectedText';
}, 5000);

Это предотвращает ситуации, когда тест продолжает выполнение до того, как клавиатура завершила ввод.


Специфические особенности iOS и Android

  • iOS: Ввод текста в полях часто требует предварительного click(), иначе клавиатура не появится. Иногда помогает tap() через browser.actions().
await browser.actions().tap(inputField).perform();
await inputField.sendKeys('iOSUser');
  • Android: На устройствах с аппаратными клавишами клавиатура может не появляться автоматически. В этом случае можно эмулировать нажатие через sendKeys или использовать Appium для прямого управления клавиатурой.

Использование Appium вместе с Protractor

Для более сложного управления мобильной клавиатурой часто используют Protractor в связке с Appium. Appium предоставляет API для скрытия/показа клавиатуры, работы с автозаполнением и переключением языков. Пример скрытия клавиатуры на Android:

await browser.driver.hideKeyboard();

Для iOS аналогично:

await browser.driver.hideKeyboard('Done'); // нажать Done на виртуальной клавиатуре

Это особенно важно для форм с множеством полей, где клавиатура может перекрывать следующий элемент ввода.


Практические рекомендации

  • Всегда использовать ожидания элементов перед вводом текста.
  • Эмулировать нажатия специальных клавиш через protractor.Key.
  • Скроллить элементы с помощью scrollIntoView перед взаимодействием.
  • Для сложных сценариев применять Appium для управления клавиатурой.
  • Проверять значение поля после ввода, так как на мобильных устройствах ввод может быть асинхронным.

Работа с мобильной клавиатурой в Protractor требует сочетания стандартных методов WebDriver, ожиданий, эмуляции специальных клавиш и, при необходимости, интеграции с Appium для расширенного управления. Такое сочетание обеспечивает надежное и стабильное тестирование мобильных форм и ввода данных.