Как навести курсор мыши и развернуть выпадающее меню на komoot с селеном?

#python #selenium #drop-down-menu #hover

Вопрос:

Моя цель-получить элемент в выпадающем меню, на который нужно нажать, чтобы он появился с помощью python selenium . Кроме того, кажется, что перед щелчком необходимо навести курсор. Я попытался щелкнуть по выпадающему меню следующим образом:

 element = wait().until(EC.presence_of_element_located((By.CLASS_NAME, "c-topmenu c-topmenu--create c-topmenu--userbar tw-inline-flex")))
element.click()
 
 def wait():
    return WebDriverWait(driver, 30)
 

И попытался использовать зависание:

 Hover = ActionChains(driver).move_to_element(element)
Hover.click().build().perform()
 

Тем не менее, я получаю исключение TimeoutException и не могу найти решение.

Веб-сайт komoot выглядит так, прежде чем нажать на выпадающее меню:

перед расширением выпадающего списка

Сайт komoot выглядит так после его расширения:

после расширения выпадающего списка

Комментарии:

1. можете ли вы показать событие, которое находится за тегом a. может быть, вы можете просто выполнить javascript вместо того, чтобы нажимать на него

2. Дайте мне знать, если мой ответ решит вашу проблему

3. @Пророк, спасибо, да. Изначально я искал другой элемент (альтернативное решение моей проблемы) с уникальным именем класса, и я использовал EC.element_to_be_clickable, но все равно это не сработало. С другим элементом я теперь забыл об уникальности. Спасибо, что указали, что одного присутствия недостаточно.

Ответ №1:

Хорошо, вот как мне удалось заставить это работать.

после входа в систему я захватил элемент оболочки из ссылки с:

 more_menu_wrapper = driver.find_element_by_css_selector("div[data-test-id='more_menu']")
 

после этого я мог нажать на нужный элемент с помощью:

 more_menu_wrapper.find_element_by_tag_name("a").click()
 

Ответ №2:

Вы используете неправильный локатор.
В случае нескольких имен классов вы должны использовать css_selector или XPath, а не по имени класса.
Кроме того, здесь у вас есть уникальный атрибут data-test-id , вы должны его использовать.
кроме того, вы должны ждать видимости или кликабельности элементов, а не только присутствия элементов.
Таким образом, ваш код может быть:

 element = wait().until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div[data-test-id='more_menu']")))