Выбор значения из выпадающего списка Selenium Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы выбрать значение из выпадающего списка в Selenium в связке с Python, используется класс Select. Сперва необходимо отыскать элемент списка по его идентификатору, а затем с помощью Select отметить требуемую опцию, используя её значение, индекс или видимый текст.

Python
Скопировать код
from selenium.webdriver.support.ui import Select

# Предположим, что инициализацию веб-драйвера вы уже осуществили
select = Select(driver.find_element_by_id("menu")) # Это наш выпадающий список, скажем, в меню ресторана
select.select_by_value("optionValue")  # Выбираем элемент по его значению, представьте, что это особенное блюдо в меню.
# И тут для нас открываются другие возможности:
# select.select_by_index(42) # Если мы точно знаем индекс нужного нам пункта.
# select.select_by_visible_text("Text") # Если мы хотим выбрать элемент по его видимому тексту.

Тут select_by_value("optionValue") осуществляет выбор значения в выпадающем списке с id="menu". От вас требуется подставить свои реальные данные вместо "menu" и "optionValue".

Если элемент динамический и возникла необходимость дождаться его активации, воспользуйтесь WebDriverWait, чтобы дождаться возможности кликнуть по опциям.

Python
Скопировать код
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10) # Немного терпения всегда пригодится.
select = Select(wait.until(EC.element_to_be_clickable((By.ID, "menu"))))

Данный подход критически важен для списков, которые подгружают свои опции динамически.

Кинга Идем в IT: пошаговый план для смены профессии

Работа с динамическими выпадающими списками

Для управления динамическими списками, которые асинхронно загружают опции, вам пригодится WebDriverWait, который помогает успешно взаимодействовать как с AJAX-элементами, так и с прочими особенностями веб-страниц:

Python
Скопировать код
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

dropdown = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.ID, "dynamicDropdownID"))
) # Именно так мы ожидаем появления элемента, как опоздавшего друга.
select = Select(dropdown)
select.select_by_visible_text("Dynamic Option Text") # И выбираем требуемую опцию, когда нашего терпения уже попросту не хватает.

Освоение Select на уровне Супер Сайян

Перечислить и покорить

Если набор возможных вариантов выбора огромен, пройдитесь по всем опциям, чтобы обнаружить нужную:

Python
Скопировать код
select = Select(driver.find_element_by_id("menu"))
options = select.options # Быстрый взгляд на все доступные варианты.

for index, option in enumerate(options):
    if "DesiredOption" in option.text: # Нашли то, что искали.
        select.select_by_index(index)
        break # Если вариантов действительно слишком много, лучше своевременно остановиться.

Поиск элементов при отсутствии ID

Если ID отсутствует или необходимо найти элемент в сложной структуре HTML, воспользуйтесь поиском по XPath или CSS-селекторам:

Python
Скопировать код
# XPath для поиска при отсутствии ID
select = Select(driver.find_element_by_xpath("//select[@name='dropdownName']"))

# CSS-селектор, всегда готовый прийти на помощь
select = Select(driver.find_element_by_css_selector("select.classname"))

Избегайте лишних действий

Помните, что некоторые списки показывают свои опции без дополнительных кликов. Избегайте ненужных действий.

Лучшие практики (или Как стать шепчущимся с Dropdown)

Доверяй, но проверяй – подтвердите свой выбор

Всегда будет неплохо убедиться, что выбрана именно та опция, которую вы хотели:

Python
Скопировать код
selected_option = select.first_selected_option
assert "Visible Text" in selected_option.text  # Подтверждение – залог успешного выполнения.

Правильное начало – это уже половина успеха

Перед тем, как начать взаимодействовать с элементом списка, убедитесь, что драйвер загрузил требуемую страницу и список доступен для работы.

Кликайте, когда это нужно

Если список требует активации, используйте driver.click() и дождитесь появления конкретных опций при помощи WebDriverWait.

Визуализация

Представьте грузовой корабль, полный опций выпадающего списка:

Markdown
Скопировать код
Грузовой корабль (🚢) переполнен выпадающими опциями:
[📄 Опция 1, 📑 Опция 2, 📃 Опция 3, 📜 Опция 4]

Выбор опции с помощью Selenium можно представить как работу крана:

Python
Скопировать код
select = Select(driver.find_element(By.ID, 'menu'))
select.select_by_visible_text('Опция 3')  # 🏗️ поднял контейнер 📃

Таким образом, мы выбираем опцию 3, а все остальные продолжают ждать своего часа.

Markdown
Скопировать код
📃 Опция 3 выбрана
Все остальные (📄, 📑, 📜) продолжают оставаться невыбранными

Код успешно выполнен, задача решена! 🎉

Полезные материалы

  1. Selenium с Python — Официальная документация — полный справочник по возможностям Selenium с примерами на Python.
  2. 7. WebDriver API — Документация по Selenium Python Bindings — подробная информация о классе Select и других возможностях API.
  3. Инструкция Selenium на Python (BrowserStack) — руководство по выполнению автоматизированных веб-тестов с помощью Selenium на Python.
  4. Глава 4 – Определение объектов страницы — практические рекомендации по работе с объектами страниц для Selenium, включая клики и выбор из выпадающих списков.