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

Confirm диалоги в веб-приложениях — это стандартные модальные окна браузера, которые предлагают пользователю подтвердить или отменить действие с помощью кнопок «OK» и «Отмена». В тестировании WebdriverIO их обработка требует особого подхода, так как это не просто элементы DOM, а нативные браузерные окна.

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

WebdriverIO предоставляет встроенные команды для взаимодействия с alert и confirm диалогами:

  • browser.getAlertText() — возвращает текст текущего alert/confirm окна.
  • browser.acceptAlert() — подтверждает диалог (эквивалент нажатия «OK»).
  • browser.dismissAlert() — отклоняет диалог (эквивалент нажатия «Отмена»).
  • browser.sendAlertText(text) — вводит текст в prompt (если используется), для confirm не применяется, но важно знать для полного набора alert-сценариев.

Пример обработки confirm диалога

it('должен подтвердить действие через confirm', async () => {
    await browser.url('/confirm-test');

    // Кликаем на кнопку, которая вызывает confirm диалог
    const confirmButton = await $('#confirmButton');
    await confirmButton.click();

    // Получаем текст диалога для проверки
    const alertText = await browser.getAlertText();
    console.log('Текст confirm:', alertText);

    // Подтверждаем диалог
    await browser.acceptAlert();

    // Проверяем результат действия после подтверждения
    const resultText = await $('#result').getText();
    expect(resultText).toBe('Действие подтверждено');
});

Отклонение confirm диалога

Для тестов, где требуется проверить сценарий отмены действия:

it('должен отклонить действие через confirm', async () => {
    await browser.url('/confirm-test');

    const confirmButton = await $('#confirmButton');
    await confirmButton.click();

    // Отклоняем диалог
    await browser.dismissAlert();

    const resultText = await $('#result').getText();
    expect(resultText).toBe('Действие отменено');
});

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

Важно учитывать, что появление confirm диалога не всегда моментально. WebdriverIO поддерживает ожидания через waitUntil, чтобы тесты не падали из-за того, что диалог еще не появился:

await browser.waitUntil(
    async () => await browser.isAlertOpen(),
    {
        timeout: 5000,
        timeoutMsg: 'Confirm диалог не появился'
    }
);
await browser.acceptAlert();

Метод isAlertOpen() проверяет наличие открытого alert/confirm окна и возвращает true или false. Это особенно полезно в динамических интерфейсах, где подтверждающие модальные окна могут появляться с задержкой.

Работа с confirm в контексте тестовых сценариев

  1. Валидация текста диалога — всегда важно проверять текст confirm перед подтверждением, чтобы убедиться, что правильный диалог появился.
  2. Разделение сценариев подтверждения и отмены — рекомендуется создавать отдельные тесты для каждого варианта, чтобы обеспечить полное покрытие логики.
  3. Использование waitUntil для надежности — гарантирует, что тест не упадет из-за асинхронного появления модального окна.

Тонкости взаимодействия

  • Confirm диалоги блокируют дальнейшее выполнение кода до момента взаимодействия, поэтому любые действия с DOM после вызова диалога без его закрытия приведут к ошибке.
  • WebdriverIO автоматически управляет фокусом на диалоге, что позволяет использовать команды accept/dismiss без дополнительных переключений контекста.
  • При параллельном тестировании важно контролировать вызовы confirm, чтобы один тест не взаимодействовал с диалогом, вызванным другим сценарием.

Совместимость с различными браузерами

Поддержка confirm диалогов стандартна для всех основных браузеров. Отличия могут возникать в поведении текста и локализации кнопок, но команды WebdriverIO (acceptAlert, dismissAlert) остаются универсальными.

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

  • В больших тестовых наборах стоит вынести обработку confirm в утилитарные функции для повторного использования:
async function handleConfirm(accept = true) {
    await browser.waitUntil(() => browser.isAlertOpen(), { timeout: 5000 });
    accept ? await browser.acceptAlert() : await browser.dismissAlert();
}
  • Для логирования и отладки полезно выводить текст confirm перед взаимодействием.
  • Сценарии с confirm должны быть изолированы, чтобы исключить влияние на другие тесты.

Работа с confirm диалогами в WebdriverIO позволяет полноценно тестировать критические действия пользователя, требующие подтверждения, обеспечивая надежность и предсказуемость тестов.