Работа с prompt диалогами

Prompt диалог — это модальное окно браузера, которое требует от пользователя ввода текста и обычно сопровождается кнопками OK и Cancel. В автоматизированном тестировании с использованием Protractor взаимодействие с такими окнами требует особого подхода, так как они блокируют поток выполнения скрипта до момента закрытия.

Основные методы работы с alert/prompt/confirm

В Protractor модальные окна управляются через объект browser.switchTo().alert(). Основные методы:

  • getText() — возвращает текст, отображаемый в диалоговом окне.
  • accept() — имитирует нажатие кнопки OK.
  • dismiss() — имитирует нажатие кнопки Cancel.
  • sendKeys(text) — вводит текст в prompt диалог.

Пример работы с prompt

it('Должен вводить текст в prompt и подтверждать', async () => {
    await browser.get('https://example.com/prompt-test');

    // Триггер для появления prompt
    const triggerButton = element(by.id('trigger-prompt'));
    await triggerButton.click();

    // Переключение на alert
    const promptDialog = await browser.switchTo().alert();

    // Получение текста диалога
    const dialogText = await promptDialog.getText();
    console.log('Текст диалога:', dialogText);

    // Ввод текста в prompt
    await promptDialog.sendKeys('Тестовый ввод');

    // Подтверждение
    await promptDialog.accept();
});

В данном примере происходит последовательное:

  1. Навигация к странице с тестируемым prompt.
  2. Вызов диалога через клик по кнопке.
  3. Переключение контекста на диалоговое окно.
  4. Считывание текста и ввод данных.
  5. Подтверждение действия.

Обработка отмены prompt

Иногда требуется проверить поведение приложения при нажатии Cancel. Для этого используется метод dismiss():

it('Должен отменять prompt', async () => {
    await browser.get('https://example.com/prompt-test');

    const triggerButton = element(by.id('trigger-prompt'));
    await triggerButton.click();

    const promptDialog = await browser.switchTo().alert();

    // Отмена prompt
    await promptDialog.dismiss();
});

Асинхронная природа и ожидания

Так как Protractor построен на WebDriverJS, работа с alert/prompt требует использования async/await или промисов. Важно учитывать, что попытка взаимодействия с диалогом до его появления приведет к ошибке NoAlertPresentError. Для корректного выполнения следует использовать ожидания:

const EC = protractor.ExpectedConditions;

await browser.wait(EC.alertIsPresent(), 5000, 'Ожидание prompt превысило лимит');

const promptDialog = await browser.switchTo().alert();
await promptDialog.sendKeys('Ввод с ожиданием');
await promptDialog.accept();

В этом примере ExpectedConditions.alertIsPresent() обеспечивает безопасное ожидание появления диалога до начала взаимодействия.

Валидация данных после prompt

После закрытия prompt часто требуется проверить, что введенные данные корректно обработаны на странице. Пример:

it('Проверка отображения введенного текста', async () => {
    await browser.get('https://example.com/prompt-test');
    const triggerButton = element(by.id('trigger-prompt'));
    await triggerButton.click();

    const promptDialog = await browser.switchTo().alert();
    await promptDialog.sendKeys('Protractor Test');
    await promptDialog.accept();

    const output = element(by.id('prompt-output'));
    expect(await output.getText()).toEqual('Вы ввели: Protractor Test');
});

Здесь текст, введенный в prompt, должен появиться на странице. Использование await гарантирует корректное последовательное выполнение действий.

Обработка ошибок и нестандартных ситуаций

  • Нет диалога: попытка вызвать browser.switchTo().alert() без появления окна вызывает ошибку.
  • Неправильный ввод: sendKeys работает только если диалог ожидает текст.
  • Длительные задержки: использовать ExpectedConditions.alertIsPresent() для предотвращения гонки событий.

Рекомендации по использованию

  1. Всегда ожидать появления диалога перед взаимодействием.
  2. Разделять сценарии с подтверждением (accept) и отменой (dismiss) для полного покрытия тестов.
  3. Проверять текст диалога перед вводом данных, чтобы убедиться в корректности контекста.
  4. Использовать sendKeys только с prompt; для обычного alert этот метод вызовет ошибку.

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