Объект window является корневым объектом браузера и
предоставляет доступ к глобальному контексту веб-страницы. В контексте
тестирования с Cypress его использование позволяет взаимодействовать с
глобальными переменными, функциями, локальным хранилищем
(localStorage) и сессиями (sessionStorage).
Cypress обеспечивает удобный API для работы с window,
сохраняя при этом контроль над асинхронностью и гарантируя стабильность
тестов.
windowДля получения доступа к глобальному объекту страницы используется команда:
cy.window().then((win) => {
// win — объект window страницы
});
Ключевой момент: Cypress автоматически ожидает загрузки страницы
перед вызовом cy.window(). Это исключает необходимость
ручной синхронизации с событием load.
Пример:
cy.visit('/dashboard');
cy.window().then((win) => {
expect(win.document.title).to.equal('Dashboard');
});
Многие приложения создают глобальные объекты для конфигурации или
вспомогательных функций. Через window можно их получить и
протестировать:
cy.window().then((win) => {
expect(win.myAppConfig.apiUrl).to.contain('https://api.example.com');
win.initializeWidgets();
});
Важно помнить, что прямое вмешательство в глобальные объекты может влиять на последующие тесты, поэтому изменения стоит ограничивать локально.
localStorage и sessionStorageCypress позволяет безопасно манипулировать данными хранилищ браузера
через объект window:
cy.window().then((win) => {
// Сохраняем данные
win.localStorage.setItem('token', '123456');
// Проверяем значение
expect(win.localStorage.getItem('token')).to.equal('123456');
// Удаляем данные
win.localStorage.removeItem('token');
});
Для sessionStorage принцип аналогичен:
cy.window().then((win) => {
win.sessionStorage.setItem('sessionId', 'abc123');
expect(win.sessionStorage.getItem('sessionId')).to.equal('abc123');
});
Существуют также специальные команды Cypress
cy.setLocalStorage() и cy.getLocalStorage(),
но использование cy.window() позволяет гибко управлять
любыми аспектами хранилища.
Объект window предоставляет возможность перехватывать
вызовы функций и контролировать их поведение. Для этого используют
cy.stub() или cy.spy():
cy.window().then((win) => {
cy.stub(win, 'alert').as('alertStub');
});
// Вызов функции на странице
cy.get('#submit').click();
// Проверка вызова
cy.get('@alertStub').should('have.been.calledWith', 'Форма отправлена');
Такой подход позволяет тестировать обработчики событий и глобальные функции без реального выполнения побочных эффектов.
Если приложение использует setTimeout или
setInterval, объект window позволяет
контролировать их с помощью Cypress:
cy.window().then((win) => {
cy.spy(win, 'setTimeout').as('timeoutSpy');
});
// Инициация таймера
cy.get('#startTimer').click();
cy.get('@timeoutSpy').should('have.been.called');
Для более сложных сценариев можно использовать библиотеку
sinon через Cypress для замены таймеров и точного контроля
времени.
Cypress поддерживает цепочку команд, что позволяет безопасно
использовать свойства объекта window внутри асинхронных
действий:
cy.window()
.its('myApp')
.invoke('initializeWidgets')
.then(() => {
cy.get('#widgetContainer').should('exist');
});
Метод .its() позволяет напрямую получить вложенное
свойство объекта, а .invoke() — вызвать функцию, сохраняя
синхронизацию с Cypress.
cy.window() только после полной загрузки
страницы или целевого компонента..its() и .should().alert,
confirm) применять cy.stub() или
cy.spy().Объект window в Cypress открывает доступ к глубинным
возможностям браузера, позволяя тестировать как функциональность
страницы, так и интеграцию с глобальными переменными, хранилищем и
таймерами. Грамотное использование cy.window() обеспечивает
стабильные и масштабируемые тесты с высокой степенью контроля над
поведением приложения.