Пропадает фокус с элемента после hover/moveToElement/click

На тестируемом сайте используется меню с подпунктами. Список с новыми элементами выпадает после наведения или клика на один из пунктов меню. Также в выпадающем списке могут быть элементы, при наведении на которые открываются дополнительные меню (и так далее).

Раньше, после того как юзер убрал курсор с элемента, выпадающее меню пропадало примерно через 1 секунду, теперь же в рамках улучшений меню скрываются практически моментально.

Но после этого появились проблемы с UI тестами (используем Java + Selenide/WebDriver + Firefox + TestNG).
В большом количестве тестов доступ к страницам как раз происходит через манипуляции с этим меню - либо после клика на пункт основного меню и сразу же клика на один из пунктов в под-меню, либо через множественные moveToElement/hover к пунктам меню, что находятся дальше.
Так вот, регулярно падает около 10-15 тестов, по причине NoSuchElementException для требуемого пункта меню, на скриншотах видно, что меню действительно скрыто на момент клика. Причем, падать могут как обращение к элементам в самых первых уровнях меню (после одного клика), так и в более дальних, когда нужно пройти цепочку moveToElement.

Насколько я понимаю, проблема в том, что фокус после hover (Selenide) или moveToElement (WebDriver) не сохраняется на требуемом элементе, в результате меню скрывается. Гуглил, нашел похожие проблемы у людей, но какого-нибудь решения найти не удалось. (вот наиболее близкая тема, которую удалось найти: Hover with native events on Windows is not persisted · Issue #2067 · SeleniumHQ/selenium-google-code-issue-archive · GitHub)

Перемещение к элементу с помощью Selenide делаю вот так:

  elem.should(appear).hover();

С помощью WebDriver:

  new Actions(getDriver()).moveToElement(getWebElement(by))
             .build()
             .perform();

При клике на элемент сначала перемещаюсь к нему, только потом делаю клик.

Подскажите, пожалуйста, сталкивался ли кто-нибудь с подобной проблемой и как удалось решить?

Мы сталкивались.
Hover в принципе ненаадёжная вещь: если браузер потеряет фокус (например, в этот момент откроется другой браузер - если параллельные тесты бегут), то hover пропадает.

Мы побороли это так, что тупо не используем $.hover() в тестах. Вместо этого эмулируем соответствующие события через JavaScript.

1 лайк

Мне помогло использование contextClick, по выпадающему пункту.

1 лайк

Здравствуйте.
Подскажите, пожалуйста, пример эмуляции hover через JavaScript.

попробуйте использовать ховер сейчас как есть в библиотеке, 3 года нормально всё работало в параллели, не думаю что сейчас будут проблемы какие-то

Есть проблема. Popup открывается при наведении мышкой, затем сразу же исчезает, хотя не должен.

базовое что могу предложить банально поставить задержку после наведения на попап, мейби у вас код что-то дальше делает, из-за чего курсор переводится в другое место

прощёлкайте тест в дебаге, скорее всего всё будет работает, если делать небольшие паузы (у вас на бою ведь наверняка реальные пользователи не селенидом ходят заказы оформляют, а ручками мышку водят)

если и так не получится, то наверно имеет смысл где-то в браузере точки останова сделать в js коде и посмотреть, что идёт не так при событии наведения на элемент

еще может ролять разрешение экрана и тому подобные вещи:
в ide вы делаете фулскрин 2k например, а потом тесты молотят 1366*768, из-за чего элементы по другому себя вести могут (хоть и не должны, но уже не раз тут на форуме всплывало, что разное разрешение - разное поведение)

еще важный нюанс в ux/ui читал в амазоновских сайтах и других, где пользователей миллиарды:
они делают так, что реакция на наведение мышкой и её перемещение наступает через условно полсекунды; они это делают, чтобы при открытии выпадашек пользователю не надо было пиксель перфектно вести курсор, боясь навести на другое поле, а просто как получится, чтобы из одной выпадашки попадать в другую, и система не реагировала на это моментально, а давала право на ошибку

Большое спасибо!