Protractor является инструментом для автоматизированного тестирования
Angular и не только, обеспечивая взаимодействие с веб-элементами через
браузер. Одним из важных аспектов работы с UI является симуляция
действий пользователя, таких как наведение курсора на элемент или
перемещение мыши. Для этого используются методы mouseMove и
hover.
mouseMoveМетод mouseMove принадлежит объекту
browser.actions() и позволяет перемещать курсор мыши к
определенному элементу или координатам.
Синтаксис:
browser.actions().mouseMove(elementOrCoordinates).perform();
elementOrCoordinates — объект
ElementFinder или объект с координатами
{x: number, y: number}.perform() — обязательный вызов для выполнения действий,
определённых в цепочке actions.Пример использования:
let menu = element(by.css('.menu-item'));
browser.actions().mouseMove(menu).perform();
В этом примере курсор будет перемещён на элемент с классом
.menu-item.
Особенности метода mouseMove:
browser.actions().mouseMove(menu, {x: 10, y: 5}).perform();
let menu = element(by.css('.menu-item'));
browser.wait(protractor.ExpectedConditions.visibilityOf(menu), 5000);
browser.actions().mouseMove(menu).perform();
hoverВ Protractor нет встроенного метода hover, но поведение
наведения реализуется через mouseMove. Обычно под
hover подразумевается перемещение курсора на элемент с
последующим открытием всплывающих элементов (например, dropdown
меню).
Пример реализации hover через
mouseMove:
let dropdown = element(by.css('.dropdown'));
browser.actions().mouseMove(dropdown).perform();
// Проверка видимости элементов после hover
let dropdownMenu = element(by.css('.dropdown-menu'));
expect(dropdownMenu.isDisplayed()).toBe(true);
В этом примере после наведения курсора проверяется отображение подменю.
Особенности hover:
browser.actions()
.mouseMove(dropdown)
.click(element(by.css('.dropdown-item')))
.perform();
browser.sleep() или ожидания
ExpectedConditions, чтобы избежать flaky-тестов.Метод mouseMove позволяет перемещать курсор к конкретной
точке относительно элемента:
browser.actions().mouseMove(menu, {x: 15, y: 20}).perform();
Это полезно, если нужно навести курсор на определённую область элемента (например, на иконку внутри кнопки).
Примечания по координатам:
actions()Метод mouseMove можно комбинировать с другими действиями
в цепочке actions() для моделирования сложного поведения
пользователя:
let elementA = element(by.css('.item-a'));
let elementB = element(by.css('.item-b'));
browser.actions()
.mouseMove(elementA)
.mouseDown()
.mouseMove(elementB)
.mouseUp()
.perform();
В данном примере реализуется drag-and-drop.
Ключевые моменты:
perform().mouseMove не работает, причина часто в том, что
элемент перекрыт другим слоем или находится вне видимой области. В таких
случаях помогает
browser.executeScript("arguments[0].scrollIntoView();", element.getWebElement());.let tooltip = element(by.css('.tooltip'));
browser.wait(protractor.ExpectedConditions.visibilityOf(tooltip), 5000);
sleep()
только как временное решение, предпочтительнее использовать ожидания
ExpectedConditions.mouseMove — основной инструмент для симуляции наведения
мыши.Эти методы обеспечивают точное управление курсором в Protractor и позволяют тестировать интерактивные элементы пользовательского интерфейса, которые зависят от действия мыши.