Ввод текста в prompt

В Protractor взаимодействие с элементами формы является одной из базовых задач при автоматизации тестирования веб-приложений. Ввод текста в prompt требует особого внимания, так как стандартные элементы DOM отличаются от встроенных браузерных диалогов. Для работы с ними используется объект browser.switchTo().alert().

Работа с alert, confirm и prompt

В JavaScript браузеры предоставляют три типа встроенных диалогов:

  1. Alert — простое сообщение с кнопкой «ОК».
  2. Confirm — сообщение с кнопками «ОК» и «Отмена».
  3. Prompt — поле для ввода текста с кнопками «ОК» и «Отмена».

Protractor позволяет переключаться на эти диалоговые окна с помощью метода browser.switchTo().alert(). Этот объект предоставляет методы для чтения текста, ввода значения и подтверждения действия.

Основные методы для работы с prompt

  • getText() — возвращает текст текущего диалога.
  • sendKeys(value) — вводит текст в поле prompt.
  • accept() — подтверждает диалог, эквивалентно нажатию «ОК».
  • dismiss() — закрывает диалог, эквивалентно нажатию «Отмена».

Пример кода для работы с prompt:

it('должен ввести текст в prompt и подтвердить', async () => {
    await element(by.id('promptButton')).click(); // вызов prompt
    const alertDialog = await browser.switchTo().alert();
    const message = await alertDialog.getText(); // считываем текст prompt
    console.log('Текст prompt:', message);
    await alertDialog.sendKeys('Тестовый ввод'); // ввод текста
    await alertDialog.accept(); // подтверждаем ввод
});

В этом примере:

  • element(by.id('promptButton')).click() инициирует открытие prompt.
  • browser.switchTo().alert() переключается на диалог.
  • sendKeys вводит текст, который будет использоваться после нажатия «ОК».

Особенности работы с prompt в Protractor

  1. Асинхронность: Методы getText, sendKeys, accept возвращают промисы, поэтому необходимо использовать await или цепочки then.
  2. Тайминги: Иногда диалог может открываться с небольшой задержкой. Для надёжности стоит использовать browser.wait с условием ExpectedConditions.alertIsPresent().

Пример с ожиданием:

const EC = protractor.ExpectedConditions;

it('должен дождаться открытия prompt и ввести текст', async () => {
    await element(by.id('promptButton')).click();
    await browser.wait(EC.alertIsPresent(), 5000, 'Prompt не открылся за 5 секунд');
    const alertDialog = await browser.switchTo().alert();
    await alertDialog.sendKeys('Автоматический ввод');
    await alertDialog.accept();
});
  1. Отмена ввода: Использование dismiss() вместо accept() закрывает диалог без сохранения введённого текста.
await alertDialog.sendKeys('Тест');
await alertDialog.dismiss(); // ввод игнорируется
  1. Чтение введённого текста в приложении: После закрытия prompt необходимо проверить, что введённый текст был корректно обработан приложением.
const result = await element(by.id('result')).getText();
expect(result).toEqual('Вы ввели: Тестовый ввод');

Интеграция с другими элементами формы

Prompt часто используется вместе с формами и кнопками, где нажатие кнопки запускает диалог. Важно учитывать порядок действий:

  • Сначала нужно вызвать действие, открывающее prompt.
  • Затем переключиться на alert.
  • Ввести текст и подтвердить.
  • Наконец, проверить результат в DOM.

Советы по надежной автоматизации

  • Всегда использовать ExpectedConditions.alertIsPresent() перед обращением к alert(), чтобы избежать ошибок типа NoAlertPresentError.
  • Если тесты выполняются в разных браузерах, убедиться, что диалог prompt поддерживается — некоторые headless-браузеры могут не отображать стандартные alert/confirm/prompt.
  • Не смешивать синхронный и асинхронный код: методы alert возвращают промисы, поэтому обязательны await или then.

Эти методы позволяют полностью контролировать ввод текста в prompt и проверять реакции приложения на пользовательский ввод.