Selenium выбирает выпадающий список опций - PullRequest
2 голосов
/ 13 февраля 2020

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

Я получаю эту ошибку при запуске модуля.

Traceback (последний вызов был последним): файл "sel_test_elements2.py", строка 20, в печати ([o.text for o в select_element.options]) AttributeError: у объекта 'FirefoxWebElement' нет атрибута 'options'

В настоящее время мой код выглядит следующим образом.

from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By

# Define Global Variables
url = "https://games.pcaha.ca/teams/4329"
csv_file = "game_schedule_4329.csv"
games = []

# create a new Firefox session
driver = webdriver.Firefox()
driver.get(url)
driver.implicitly_wait(30)

# Locate the Sector and create a Select object
select_element = driver.find_element_by_css_selector(".team-filters")
# this will print out strings available for selection on select_element, used in visible text below
print ([o.text for o in select_element.options])```


Ответы [ 2 ]

1 голос
/ 13 февраля 2020

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

Я изменил ваш код, и он работает для меня в Chrome:

from selenium.webdriver import Chrome
from time import sleep

# Define Global Variables
url = "https://games.pcaha.ca/teams/4329"
csv_file = "game_schedule_4329.csv"
games = []

# create a new Chrome session
driver = Chrome()
driver.get(url)
driver.implicitly_wait(30)

sleep(3) # make sure svgs load before interaction

# Click on arrow down
arrow = driver.find_elements_by_css_selector(".team-filters svg")[1].click()

# Collect options
options = driver.find_elements_by_xpath("//div[contains(@id, 'react-select-2')]")

# Print text from options
print([o.text for o in options])

Примечание: при ручном открытии раскрывающегося списка в браузере и попытке использовать веб-инспектор он закрывается, поэтому чтобы получить html внутри выпадающего списка, вы можете использовать что-то вроде:

dropdown = driver.find_element_by_css_selector("div.css-kj6f9i-menu")
dropdown_html = dropdown.get_attribute('innerHTML')

Я надеюсь, что это помогло. Удачи!

1 голос
/ 13 февраля 2020

Я использовал нечто похожее в небольшом написанном мною сценарии, может быть, он может дать вам подсказку о том, как go о

Подход 1 Это для выбора последней из доступных опций

Переменная options в приведенном ниже коде будет опция, доступная для выпадающего списка

select_datebox = driver.find_element_by_id('jrnyDateSrchTxt') # Drop down selection, you have to change the id appropriately
select_datebox.click()
time.sleep(2)
options = select_datebox.find_elements_by_tag_name('option')
options[len(options)-1].click() #selecting the last option

Подход 1 , ввод опции через переменную

select = Select(driver.find_element_by_id("jrnyDateSrchTxt")) # Drop down selection, you have to change the id appropriately
time.sleep(1)
select.select_by_value(datadate) # Date selection
time.sleep(2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...