Получение списка всех окон

В автоматизированном тестировании веб-приложений часто возникает необходимость работать с несколькими окнами или вкладками браузера. В Protractor управление окнами осуществляется через объект browser и его методы для работы с window handles.


Window Handles

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

  • Получение текущего окна:
const currentWindow = await browser.getWindowHandle();

Этот метод возвращает строку — идентификатор активного окна.

  • Получение всех открытых окон:
const allWindows = await browser.getAllWindowHandles();

Метод возвращает массив строк, где каждая строка — идентификатор отдельного окна или вкладки.

Пример:

const allWindows = await browser.getAllWindowHandles();
console.log(allWindows); // ['CDwindow-1A2B3C', 'CDwindow-4D5E6F']

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

После получения списка всех окон можно переключаться между ними с помощью browser.switchTo().window(handle):

const allWindows = await browser.getAllWindowHandles();
await browser.switchTo().window(allWindows[1]); // Переключение на второе окно

После переключения все действия Protractor будут выполняться в выбранном окне.


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

Для закрытия окна используется метод browser.close(). Важно помнить, что этот метод закрывает текущее активное окно, поэтому перед его вызовом необходимо переключиться на нужное окно:

await browser.switchTo().window(allWindows[1]);
await browser.close();

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

await browser.switchTo().window(allWindows[0]);

Применение в тестах

Работа с множественными окнами актуальна в следующих сценариях:

  • Всплывающие окна (pop-ups) Многие веб-приложения используют отдельные окна для авторизации или уведомлений. Получение всех window handles позволяет перехватить эти окна и взаимодействовать с ними.

  • Ссылки, открывающиеся в новой вкладке При клике на ссылку с target="_blank" открывается новая вкладка. С помощью метода getAllWindowHandles() можно получить идентификаторы всех вкладок и переключиться на новую для проверки содержимого.

  • Тестирование интеграции с внешними сервисами Например, переход к платежной системе или внешнему OAuth-провайдеру требует управления несколькими окнами.


Советы по использованию

  • Всегда получать список окон после действия, которое открывает новое окно.
  • Для устойчивых тестов использовать асинхронные ожидания, чтобы убедиться, что новое окно открылось:
await browser.wait(async () => {
    const handles = await browser.getAllWindowHandles();
    return handles.length > 1;
}, 5000, 'Новое окно не открылось');
  • После работы с новым окном возвращаться к основному окну, чтобы продолжить основной сценарий.

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

// Клик по кнопке, открывающей новое окно
await element(by.id('open-new-window')).click();

// Ожидание появления нового окна
await browser.wait(async () => (await browser.getAllWindowHandles()).length === 2, 5000);

// Получение всех окон
const allWindows = await browser.getAllWindowHandles();

// Переключение на новое окно
await browser.switchTo().window(allWindows[1]);

// Выполнение действий в новом окне
const headerText = await element(by.tagName('h1')).getText();
console.log(headerText);

// Закрытие нового окна
await browser.close();

// Возврат к основному окну
await browser.switchTo().window(allWindows[0]);

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


Использование методов getAllWindowHandles и switchTo().window обеспечивает надежное управление окнами в Protractor и является ключевым инструментом при тестировании динамичных и многовкладочных веб-приложений.