Методы взаимодействия: sendKeys()

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


Основы sendKeys()

Метод sendKeys() вызывается на элементе, найденном с помощью локатора (element(by.css(...)), element(by.id(...)) и др.), и позволяет передать последовательность символов, которые будут введены в поле.

Пример базового использования:

const usernameInput = element(by.id('username'));
usernameInput.sendKeys('testuser');

В этом примере в элемент с id="username" вводится строка "testuser".

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

  • Метод асинхронный, возвращает Promise.
  • Поддерживает ввод как строк, так и специальных клавиш из объекта protractor.Key.
  • Можно комбинировать текст и специальные клавиши, например, ENTER, TAB или BACK_SPACE.

Ввод специальных клавиш

Protractor предоставляет объект Key, который позволяет использовать клавиши клавиатуры для имитации действий пользователя:

const passwordInput = element(by.id('password'));
passwordInput.sendKeys('securepassword', protractor.Key.ENTER);

В данном примере после ввода пароля автоматически отправляется форма нажатием ENTER.

Среди часто используемых клавиш:

  • Key.ENTER — нажатие Enter.
  • Key.TAB — переход к следующему элементу формы.
  • Key.BACK_SPACE — удаление предыдущего символа.
  • Key.CONTROL + Key.A — выделение всего текста (с помощью комбинаций клавиш).

Комбинирование текста и клавиш

sendKeys() поддерживает последовательное использование текста и клавиш, что позволяет эмулировать сложные сценарии ввода:

const searchInput = element(by.css('.search-box'));
searchInput.sendKeys('Protractor', Key.TAB, 'Tutorial', Key.ENTER);

В этом примере выполняется:

  1. Ввод текста "Protractor".
  2. Переход к следующему элементу через TAB.
  3. Ввод текста "Tutorial".
  4. Отправка формы через ENTER.

Очистка поля перед вводом

Перед вводом нового текста часто требуется очистить поле. Protractor предоставляет метод clear() для этих целей:

const emailInput = element(by.name('email'));
emailInput.clear().then(() => {
    emailInput.sendKeys('example@test.com');
});

Важно учитывать, что clear() также возвращает Promise, поэтому ввод нового значения следует выполнять после его завершения.


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

sendKeys() работает с элементами, доступными на странице, поэтому рекомендуется использовать ожидания (ExpectedConditions) для предотвращения ошибок, связанных с отсутствием элемента:

const EC = protractor.ExpectedConditions;
const inputField = element(by.id('city'));

browser.wait(EC.visibilityOf(inputField), 5000);
inputField.sendKeys('Moscow');

В этом примере ввод текста будет выполнен только после того, как поле станет видимым на странице, что предотвращает ошибки ElementNotVisibleError.


Многострочный ввод

Метод sendKeys() поддерживает ввод символов новой строки через Key.ENTER. Это полезно для работы с текстовыми областями (textarea):

const messageBox = element(by.css('.message-box'));
messageBox.sendKeys('Первая строка', Key.ENTER, 'Вторая строка');

В результате в поле будут введены две строки текста с переносом.


Ограничения и особенности

  • sendKeys() работает только с элементами, которые поддерживают ввод текста. Попытка использования на элементах без фокуса или с атрибутом readonly может вызвать ошибки.
  • Метод имитирует физический ввод, поэтому скорость ввода зависит от браузера и состояния страницы.
  • Для сложных клавиатурных комбинаций иногда используется browser.actions().sendKeys(...), что позволяет более гибко управлять последовательностью нажатий и удержанием клавиш.

Использование в комбинации с browser.actions()

Для сценариев, требующих удержания клавиш, sendKeys() может быть интегрирован с browser.actions():

const input = element(by.css('.input-field'));

browser.actions()
    .keyDown(protractor.Key.SHIFT)
    .sendKeys(input, 'protractor')
    .keyUp(protractor.Key.SHIFT)
    .perform();

В данном примере ввод текста будет выполнен с зажатым SHIFT, что приведет к вводу заглавных букв.


sendKeys() является фундаментальным методом для взаимодействия с формами в Protractor, обеспечивая возможность точного и гибкого эмулирования действий пользователя при тестировании веб-приложений.