Переключение между окнами

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


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

Каждое окно браузера имеет уникальный window handle — строковый идентификатор, с помощью которого WebdriverIO может однозначно определить окно. Получение списка всех открытых окон выполняется через метод:

const handles = await browser.getWindowHandles();
console.log(handles); // ['CDwindow-1234...', 'CDwindow-5678...']

Для получения текущего активного окна используется:

const currentHandle = await browser.getWindowHandle();
console.log(currentHandle); // 'CDwindow-1234...'

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


Переключение между окнами

Переключение на нужное окно выполняется методом switchToWindow, который принимает идентификатор окна:

await browser.switchToWindow(handles[1]);

После выполнения этого вызова все последующие действия будут применяться к выбранному окну.

Применение на практике:

  1. Открытие новой вкладки через Jav * aScript:
await browser.execute(() => {
    window.open('https://example.com', '_blank');
});
  1. Получение списка окон:
const handles = await browser.getWindowHandles();
  1. Переключение на новую вкладку:
await browser.switchToWindow(handles[handles.length - 1]);
  1. Выполнение действий в новой вкладке и возврат к исходной:
await browser.switchToWindow(handles[0]);

Закрытие окон и возврат к предыдущему

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

await browser.closeWindow();
await browser.switchToWindow(handles[0]);

Совет: всегда хранить массив handles, чтобы корректно управлять окнами после их закрытия.


Работа с модальными окнами (alert, confirm, prompt)

Для модальных окон используются отдельные методы:

  • browser.getAlertText() — получить текст алерта.
  • browser.acceptAlert() — подтвердить действие.
  • browser.dismissAlert() — отклонить действие.
  • browser.sendAlertText('текст') — ввести текст в prompt.

Пример:

await browser.execute(() => alert('Введите имя'));
const alertText = await browser.getAlertText();
await browser.sendAlertText('WebdriverIO');
await browser.acceptAlert();

Эти методы работают только с активным окном, поэтому важно перед вызовом убедиться, что переключение выполнено корректно.


Сценарии использования

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

  2. Всплывающие окна: многие формы или уведомления реализуются через pop-up. Автоматизация их тестирования невозможна без управления несколькими окнами.

  3. Тестирование вкладок: современные веб-приложения могут открывать новые вкладки с результатами поиска или отчетами. WebdriverIO позволяет управлять вкладками точно так же, как окнами.


Рекомендации по стабильности тестов

  • Всегда проверять длину массива getWindowHandles() после открытия нового окна.
  • Не полагаться на индекс окна в массиве; лучше сохранять идентификаторы в переменные с понятными именами.
  • Использовать явные ожидания (waitUntil, waitForDisplayed) после переключения окна, чтобы убедиться, что контент полностью загрузился.
  • После закрытия окна всегда переключаться на существующее окно, чтобы не получить ошибку no such window.

Полезные методы для управления окнами

Метод Описание
getWindowHandle() Получить идентификатор текущего окна
getWindowHandles() Получить массив идентификаторов всех окон
switchToWindow(handle) Переключиться на окно по идентификатору
closeWindow() Закрыть текущее окно
getTitle() Получить заголовок окна (для проверки успешного переключения)
getUrl() Получить текущий URL окна

Пример комплексного сценария

await browser.url('https://main-site.com');

// Открыть новое окно через ссылку
await $('a[target="_blank"]').click();

// Получить все окна
const handles = await browser.getWindowHandles();

// Переключиться на новое окно
await browser.switchToWindow(handles[1]);

// Проверить заголовок и URL
await expect(browser).toHaveTitleContaining('Example');
await expect(browser).toHaveUrlContaining('example.com');

// Закрыть новое окно и вернуться к исходному
await browser.closeWindow();
await browser.switchToWindow(handles[0]);

// Продолжить тест на основном сайте
await expect(browser).toHaveUrl('https://main-site.com');

Эффективное управление окнами и вкладками является фундаментом для автоматизации сложных сценариев в WebdriverIO, позволяя тестировать многозадачные веб-приложения и обеспечивать стабильность тестов при работе с pop-up, внешними ссылками и многовкладочными интерфейсами.