Выбор значения из выпадающего списка 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 # Если вариантов действительно слишком много, лучше своевременно остановиться.
Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Поиск элементов при отсутствии 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, включая клики и выбор из выпадающих списков.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой класс используется для работы с выпадающими списками в Selenium с Python?
1 / 5