Выбор значения из выпадающего списка Selenium Python
Быстрый ответ
Для того чтобы выбрать значение из выпадающего списка в Selenium в связке с Python, используется класс Select
. Сперва необходимо отыскать элемент списка по его идентификатору, а затем с помощью Select
отметить требуемую опцию, используя её значение, индекс или видимый текст.
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
, чтобы дождаться возможности кликнуть по опциям.
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"))))
Данный подход критически важен для списков, которые подгружают свои опции динамически.
Работа с динамическими выпадающими списками
Для управления динамическими списками, которые асинхронно загружают опции, вам пригодится WebDriverWait
, который помогает успешно взаимодействовать как с AJAX-элементами, так и с прочими особенностями веб-страниц:
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 на уровне Супер Сайян
Перечислить и покорить
Если набор возможных вариантов выбора огромен, пройдитесь по всем опциям, чтобы обнаружить нужную:
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-селекторам:
# XPath для поиска при отсутствии ID
select = Select(driver.find_element_by_xpath("//select[@name='dropdownName']"))
# CSS-селектор, всегда готовый прийти на помощь
select = Select(driver.find_element_by_css_selector("select.classname"))
Избегайте лишних действий
Помните, что некоторые списки показывают свои опции без дополнительных кликов. Избегайте ненужных действий.
Лучшие практики (или Как стать шепчущимся с Dropdown)
Доверяй, но проверяй – подтвердите свой выбор
Всегда будет неплохо убедиться, что выбрана именно та опция, которую вы хотели:
selected_option = select.first_selected_option
assert "Visible Text" in selected_option.text # Подтверждение – залог успешного выполнения.
Правильное начало – это уже половина успеха
Перед тем, как начать взаимодействовать с элементом списка, убедитесь, что драйвер загрузил требуемую страницу и список доступен для работы.
Кликайте, когда это нужно
Если список требует активации, используйте driver.click()
и дождитесь появления конкретных опций при помощи WebDriverWait
.
Визуализация
Представьте грузовой корабль, полный опций выпадающего списка:
Грузовой корабль (🚢) переполнен выпадающими опциями:
[📄 Опция 1, 📑 Опция 2, 📃 Опция 3, 📜 Опция 4]
Выбор опции с помощью Selenium можно представить как работу крана:
select = Select(driver.find_element(By.ID, 'menu'))
select.select_by_visible_text('Опция 3') # 🏗️ поднял контейнер 📃
Таким образом, мы выбираем опцию 3, а все остальные продолжают ждать своего часа.
📃 Опция 3 выбрана
Все остальные (📄, 📑, 📜) продолжают оставаться невыбранными
Код успешно выполнен, задача решена! 🎉
Полезные материалы
- Selenium с Python — Официальная документация — полный справочник по возможностям Selenium с примерами на Python.
- 7. WebDriver API — Документация по Selenium Python Bindings — подробная информация о классе Select и других возможностях API.
- Инструкция Selenium на Python (BrowserStack) — руководство по выполнению автоматизированных веб-тестов с помощью Selenium на Python.
- Глава 4 – Определение объектов страницы — практические рекомендации по работе с объектами страниц для Selenium, включая клики и выбор из выпадающих списков.