Получение текста алерта

Работа с алертами — одна из ключевых задач автоматизированного тестирования веб-приложений. Алерты, подтверждения и промпты создаются с помощью стандартного объекта window в браузере (alert, confirm, prompt) и требуют отдельного подхода, так как они блокируют выполнение основного потока скрипта до взаимодействия с ними. WebdriverIO предоставляет методы для безопасного получения текста этих окон и управления ими.


Методы WebdriverIO для работы с алертами

Для работы с алертами используется объект browser, предоставляющий следующие основные методы:

  • browser.isAlertOpen() — проверяет, открыто ли модальное окно. Возвращает true или false.
  • browser.getAlertText() — возвращает текст текущего алерта.
  • browser.acceptAlert() — принимает алерт, эквивалентно нажатию кнопки «OK».
  • browser.dismissAlert() — отклоняет алерт, эквивалентно нажатию кнопки «Отмена».
  • browser.sendAlertText(text) — вводит текст в промт.

Пример получения текста алерта:

it('должен получить текст алерта', async () => {
    await $('#trigger-alert').click(); // Кнопка, которая вызывает alert
    if (await browser.isAlertOpen()) {
        const alertText = await browser.getAlertText();
        console.log('Текст алерта:', alertText);
        await browser.acceptAlert();
    }
});

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


Проверка содержимого алерта

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

const { expect } = require('chai');

it('текст алерта должен быть корректным', async () => {
    await $('#trigger-alert').click();
    if (await browser.isAlertOpen()) {
        const alertText = await browser.getAlertText();
        expect(alertText).to.equal('Вы уверены, что хотите продолжить?');
        await browser.acceptAlert();
    }
});

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


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

Алерты confirm и prompt требуют дополнительных действий:

  • Confirm: позволяет либо принять, либо отклонить действие.
  • Prompt: позволяет вводить текст.

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

it('ввод текста в prompt и получение ответа', async () => {
    await $('#trigger-prompt').click();
    if (await browser.isAlertOpen()) {
        const alertText = await browser.getAlertText();
        console.log('Текст prompt:', alertText);
        await browser.sendAlertText('Test input'); // Ввод текста
        await browser.acceptAlert();
    }
});

После отправки текста в prompt можно проверить, что введённые данные корректно обработаны приложением, например, через DOM-элементы, отображающие результат.


Асинхронность и ожидание алертов

Алерты блокируют интерфейс, но WebdriverIO работает асинхронно. Для стабильной работы тестов рекомендуется использовать ожидания перед взаимодействием с алертом:

await browser.waitUntil(
    async () => await browser.isAlertOpen(),
    {
        timeout: 5000,
        timeoutMsg: 'Алерт не появился в течение 5 секунд'
    }
);
const alertText = await browser.getAlertText();
await browser.acceptAlert();

Использование waitUntil позволяет избежать ошибок no alert open, особенно при динамических интерфейсах, где алерт появляется с задержкой.


Рекомендации по структуре тестов

  • Всегда проверять наличие алерта перед получением текста.
  • Использовать ассерты для проверки текста, чтобы тесты фиксировали корректность сообщений.
  • Для промтов сначала вводить текст, затем принимать или отклонять окно.
  • В динамических интерфейсах использовать ожидания (waitUntil) для повышения стабильности тестов.

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