Наведение курсора (hover) — одна из ключевых интеракций при
тестировании пользовательских интерфейсов. В веб-приложениях оно часто
используется для отображения всплывающих подсказок, раскрытия меню или
изменения стиля элементов. Cypress не предоставляет встроенной команды
hover, поэтому требуется использование специальных подходов
для эмуляции движения мыши.
.trigger()Команда .trigger() позволяет инициировать события на
DOM-элементах. Для эмуляции наведения курсора используется событие
mouseover:
cy.get('.menu-item').trigger('mouseover');
Важные моменты:
mouseover — событие, которое активируется при наведении
мыши на элемент.mouseenter или mousemove, чтобы более точно
эмулировать поведение:cy.get('.menu-item').trigger('mouseenter');
cy.get('.menu-item').trigger('mousemove', { clientX: 100, clientY: 50 });
clientX и clientY позволяют
задать позицию курсора, что может быть критично для сложных
интерактивных элементов.Наведение курсора обычно сопровождается изменением стиля элемента.
Проверка этих изменений выполняется с использованием
.should():
cy.get('.menu-item')
.trigger('mouseover')
.should('have.css', 'background-color', 'rgb(200, 200, 200)');
Особенности:
rgb, rgba, px
и т.д.).cy.get('.tooltip')
.should('not.be.visible');
cy.get('.menu-item')
.trigger('mouseover');
cy.get('.tooltip')
.should('be.visible');
.realHover()Для более реалистичной имитации взаимодействия используется сторонняя библиотека cypress-real-events. Она позволяет эмулировать реальное движение мыши, что важно для тестирования динамических интерфейсов.
Установка:
npm install cypress-real-events --save-dev
Использование:
import "cypress-real-events/support";
cy.get('.menu-item').realHover();
Преимущества:
mouseover, mouseenter,
mousemove).В интерфейсах часто требуется сначала навести курсор, а затем кликнуть на элемент, который становится видимым:
cy.get('.dropdown-button').realHover();
cy.get('.dropdown-menu-item')
.should('be.visible')
.click();
Ключевые моменты:
.trigger().click()
при простых интерфейсах без анимаций.Если элемент находится внутри iframe, стандартный
cy.get() работать не будет. Необходимо сначала получить
контент iframe:
cy.get('iframe#frame-id').then($iframe => {
const body = $iframe.contents().find('body');
cy.wrap(body).find('.menu-item').trigger('mouseover');
});
Особенности:
cy.wrap() позволяет интегрировать элементы iframe в
цепочку команд Cypress.wait или should('be.visible')
перед наведение курсора для элементов, которые подгружаются
динамически.force: true при вызове
.click() или .trigger(), если элемент перекрыт
другими слоями.cypress-real-events для сложных интерфейсов с анимацией и
динамическим отображением элементов.Наведение курсора является критическим элементом для тестирования
интерактивных компонентов. Правильное использование
.trigger(), .realHover(), а также проверка
видимости и стилей обеспечивает надежное и воспроизводимое тестирование
динамических интерфейсов.