В автоматизированном тестировании веб-приложений часто возникает
необходимость работать с несколькими окнами или вкладками браузера. В
Protractor управление окнами осуществляется через объект
browser и его методы для работы с 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 и является ключевым инструментом при
тестировании динамичных и многовкладочных веб-приложений.