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]);
После выполнения этого вызова все последующие действия будут применяться к выбранному окну.
Применение на практике:
await browser.execute(() => {
window.open('https://example.com', '_blank');
});
const handles = await browser.getWindowHandles();
await browser.switchToWindow(handles[handles.length - 1]);
await browser.switchToWindow(handles[0]);
Метод closeWindow закрывает текущее активное окно. После
закрытия необходимо переключиться на существующее окно, иначе
WebdriverIO не сможет выполнять дальнейшие действия:
await browser.closeWindow();
await browser.switchToWindow(handles[0]);
Совет: всегда хранить массив handles,
чтобы корректно управлять окнами после их закрытия.
Для модальных окон используются отдельные методы:
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();
Эти методы работают только с активным окном, поэтому важно перед вызовом убедиться, что переключение выполнено корректно.
Тестирование переходов на сторонние сайты: часто
на страницах есть ссылки, открывающие новое окно. С помощью
getWindowHandles и switchToWindow можно
проверить контент стороннего ресурса и вернуться обратно.
Всплывающие окна: многие формы или уведомления реализуются через pop-up. Автоматизация их тестирования невозможна без управления несколькими окнами.
Тестирование вкладок: современные веб-приложения могут открывать новые вкладки с результатами поиска или отчетами. 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, внешними ссылками и многовкладочными интерфейсами.