Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

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

firefox
webdriver
selenide
Теги: #<Tag:0x00007fedc7b30030> #<Tag:0x00007fedc7b37e98> #<Tag:0x00007fedc7b37ce0>

#1

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

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

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

Насколько я понимаю, проблема в том, что фокус после hover (Selenide) или moveToElement (WebDriver) не сохраняется на требуемом элементе, в результате меню скрывается. Гуглил, нашел похожие проблемы у людей, но какого-нибудь решения найти не удалось. (вот наиболее близкая тема, которую удалось найти: https://github.com/SeleniumHQ/selenium-google-code-issue-archive/issues/2067)

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

  elem.should(appear).hover();

С помощью WebDriver:

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

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

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


(asolntsev) #2

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

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


(Decem) #3

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