Закрытие окон

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


Получение идентификаторов окон

Каждое окно браузера имеет уникальный window handle, который используется для переключения и закрытия окон. Основные методы:

const handles = await browser.getWindowHandles();
const currentHandle = await browser.getWindowHandle();
  • getWindowHandles() возвращает массив всех активных окон.
  • getWindowHandle() возвращает идентификатор текущего окна.

Использование этих методов позволяет ориентироваться в множестве открытых окон и корректно управлять ими.


Закрытие текущего окна

Метод closeWindow() закрывает текущее активное окно. После закрытия необходимо убедиться, что браузер переключился на существующее окно, иначе последующие команды вызовут ошибку.

await browser.closeWindow();

// После закрытия нужно выбрать новое активное окно
const handles = await browser.getWindowHandles();
await browser.switchToWindow(handles[0]);

Особенности:

  • closeWindow() завершает только одно окно за вызов.
  • Если закрывается последнее окно, сессия браузера завершится.
  • Следует всегда проверять наличие других окон перед закрытием.

Закрытие всех окон кроме одного

Часто требуется закрыть все дополнительные вкладки или окна, оставив только главное. Для этого используется перебор всех window handles с исключением нужного.

const handles = await browser.getWindowHandles();
const mainHandle = handles[0]; // считаем, что главное окно первое

for (const handle of handles) {
    if (handle !== mainHandle) {
        await browser.switchToWindow(handle);
        await browser.closeWindow();
    }
}

await browser.switchToWindow(mainHandle);

Ключевой момент: переключение на окно перед закрытием обязательно, иначе WebdriverIO не сможет выполнить closeWindow() на неактивном окне.


Закрытие модальных окон и всплывающих диалогов

Для модальных окон браузера (alert, confirm, prompt) используется метод closeAlert() или современные аналоги acceptAlert() и dismissAlert():

await browser.acceptAlert(); // подтверждение
await browser.dismissAlert(); // отмена

Важно: Модальные окна блокируют основной поток выполнения скрипта, поэтому перед закрытием необходимо убедиться, что окно открыто:

if (await browser.isAlertOpen()) {
    await browser.dismissAlert();
}

Практика с множественными окнами

При автоматизации сценариев с открытием новых вкладок или окон:

// Открываем новую вкладку
await browser.newWindow('https://example.com');

// Закрываем только что открытую вкладку
const handles = await browser.getWindowHandles();
await browser.switchToWindow(handles[1]);
await browser.closeWindow();

// Возвращаемся на исходное окно
await browser.switchToWindow(handles[0]);

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

  • Всегда хранить исходный window handle для возврата.
  • Проверять количество открытых окон перед закрытием.
  • Для надежности использовать ожидания (waitUntil) при работе с динамическим открытием окон.

Заключение по техническим аспектам

  • closeWindow() — базовый метод закрытия текущего окна.
  • switchToWindow(handle) — обязательный инструмент для управления множеством окон.
  • Управление модальными окнами требует проверки наличия диалога через isAlertOpen().
  • Всегда важно поддерживать корректную последовательность действий при множественных окнах, чтобы избежать ошибок в тестах.

Эффективное закрытие окон обеспечивает стабильность автоматизированных тестов и предотвращает непредвиденные ошибки из-за неактивных или лишних вкладок.