Работа с множественными окнами и вкладками в веб-тестировании часто
вызывает сложности из-за архитектуры браузеров и ограничений
инструментов автоматизации. Cypress, как инструмент для end-to-end
тестирования, изначально ориентирован на управление одним окном
браузера, поэтому прямой работы с новыми окнами
(window.open) и вкладками (target="_blank")
нет. Для корректного тестирования необходимо использовать альтернативные
подходы и обходные методы.
cy.window().then(win => win.open(...)) приведет к тому,
что Cypress не сможет напрямую управлять содержимым этого окна.cy.visit() полностью заменяет текущий контент, что делает
управление множественными окнами невозможным в классическом смысле.Наиболее практичный подход при работе с внешними ссылками — принудительное открытие их в текущей вкладке. Это позволяет сохранить контроль Cypress над страницей.
Пример:
cy.get('a[target="_blank"]').invoke('removeAttr', 'target').click();
invoke('removeAttr', 'target') удаляет атрибут
target="_blank".Ключевой момент: Этот метод работает только для тестов, где нет необходимости проверять именно отдельное окно, а важен только контент страницы.
window.openЕсли в приложении используется window.open, управление
им можно реализовать через стабилизацию или перехват вызова
окна:
cy.window().then((win) => {
cy.stub(win, 'open').as('windowOpen');
});
// Действие, которое вызывает window.open
cy.get('#open-window-button').click();
// Проверка параметров нового окна
cy.get('@windowOpen').should('be.calledWith', 'https://example.com');
cy.stub позволяет перехватить вызов
window.open.Существуют плагины, расширяющие возможности работы с несколькими окнами, например cypress-real-events или cypress-window-switch. Они позволяют имитировать пользовательские действия с вкладками и окнами.
Пример с имитацией перехода на новую вкладку:
cy.get('a[target="_blank"]')
.then((link) => {
const url = link.prop('href');
cy.visit(url);
});
href ссылки позволяет напрямую посетить URL в
текущей вкладке.В большинстве современных приложений модальные окна заменяют открытие новых вкладок для сохранения UX. Cypress работает с модальными окнами без ограничений:
cy.get('#open-modal-button').click();
cy.get('.modal-content').should('be.visible');
cy.get('.modal-close').click();
cy.get('.modal-content').should('not.exist');
cy.visit для перехода на
новый URL, вместо прямого открытия нового окна.target="_blank" у ссылок, если
важно продолжить тест в текущем окне.window.open, если нужно
проверить параметры открытия окна.Работа с множественными окнами и вкладками в Cypress строится вокруг
упрощения потоков переходов. Основные подходы включают:
принудительное открытие ссылок в текущей вкладке, перехват вызовов
window.open, использование модальных окон и прямой переход
через cy.visit. Такой подход позволяет сохранить
надёжность и стабильность тестов, избегая ошибок из-за
недоступного контекста нового окна.