Вариант выбора Python Selenium с помощью Select (элемент не виден?)

Я безуспешно пытался использовать несколько подходов, упомянутых в подобных вопросах. В исходном коде HTML явно есть свойства «значение» и «текст», но я не могу получить к ним доступ, когда использую selenium.webdriver для доступа к ним?

Выбор заметки приводит к изменению данных на странице...


Редактировать2:

Гай указал ниже, что фактический выпадающий список может быть элементом, а не элементом. Однако использование el.click() просто мерцает и не открывает раскрывающийся список.


РЕДАКТИРОВАТЬ1: Элементы и теперь можно идентифицировать, но я не могу сделать выбор. Я считаю, что страница также находится в javascript, и поэтому я не уверен, влияет ли это на используемые методы.


Исходный пост:

Страница в Интернете: https://www.racv.com.au/on-the-road/driving-maintenance/fuel-prices.html

HTML-код выбора, для наглядности некоторые опции опущены:

<select name = "filter-select-6" id = "filter-select-6" class = "js-dropdown js-select-map js-filter-select" data-filter = "#filter-list-60 .js-tab-item" data-url = "/bin/racv/fuelprice" style = "display: none;" data-parsley-id = "3">                            
    <option value = "11" data-index = "0">LRP</option>
    <option value = "2" selected = "true" data-index = "0">Unleaded</option>
    <option value = "3" data-index = "0">Diesel</option>
    <option value = "8" data-index = "0">Premium Unleaded 98</option>
</select>

Я считаю, что могу без проблем выбрать элемент Select:

from selenium import webdriver
from selenium.webdriver.support.ui import Select

url = 'https://www.racv.com.au/on-the-road/driving-maintenance/fuel-prices.html'
driver = webdriver.Chrome()
driver.get(url)
driver.implicitly_wait(20)

fuel_select = Select(driver.find_element_by_id('filter-select-6'))

Когда я печатаю параметры, я получаю:

for fuel_option in fuel_select.options:
    print(fuel_option)

<selenium.webdriver.remote.webelement.WebElement (session = "9a10aa750fa59f4412e0bea4d7aae990", element = "0.5927271524692566-2")>
<selenium.webdriver.remote.webelement.WebElement (session = "9a10aa750fa59f4412e0bea4d7aae990", element = "0.5927271524692566-3")>
<selenium.webdriver.remote.webelement.WebElement (session = "9a10aa750fa59f4412e0bea4d7aae990", element = "0.5927271524692566-8")>
<selenium.webdriver.remote.webelement.WebElement (session = "9a10aa750fa59f4412e0bea4d7aae990", element = "0.5927271524692566-11")>

Использование выбора():

for fuel_option in fuel_select.find_elements_by_tag_name('option'):
    if fuel_option.text == "Diesel":
        fuel_option.select()

Ошибка:

Traceback (most recent call last):
  File "C:/file.py", line 18, in <module>
    fuel_option.Select()
AttributeError: 'WebElement' object has no attribute 'select'

Используя click() или любой из методов select_by_xxx():

for fuel_option in fuel_select.find_elements_by_tag_name('option'):
    if fuel_option.text == "Diesel":
        fuel_option.click()

#or using select_by_xxx
fuel_select.select_by_value('8')

Ошибка:

selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable: Element is not currently visible and may not be manipulated
  (Session info: chrome=74.0.3729.169)
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Windows NT 10.0.17134 x86_64)

Можете ли вы провести нас к этому раскрывающемуся списку? Этот выпадающий список находится внутри элемента div. Этот Div имеет свойство, называемое скрытым.

cruisepandey 29.05.2019 07:30

Конечно, я только что просмотрел выпадающий список, который по умолчанию имеет значение «БЕЗ ЭЛЕКТРОНИРОВАНИЯ». Я считаю, что это должен быть <div> прямо под class = "hidden", он находится внутри <div class = "fuel-price">

Shiji M 29.05.2019 07:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
2 316
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Select — это оболочка для WebElement, метод select() не является допустимым. См. Выберите документ

Вы пытались использовать select_by_value:

fuel_select = Select(driver.find_element_by_id('filter-select-6'))
fuel_select.select_by_value("8")

Или видимым текстом:

fuel_select = Select(driver.find_element_by_id('filter-select-6'))
fuel_select.select_by_visible_text("Premium Unleaded 98")

РЕДАКТИРОВАТЬ1
Попробуйте сначала нажать(), чтобы сделать раскрывающийся список видимым:

el = driver.find_element_by_id('filter-select-6')
el.click()
fuel_select = Select(el)

РЕДАКТИРОВАТЬ2:
Я считаю, что ваша проблема больше связана с тем, что вы используете свойство css style = "display: none;" Вы также не должны видеть раскрывающийся список вручную.

Пожалуйста, обратитесь к css синтаксис документ для более подробной информации.

При использовании Нет: Элемент полностью удален

Возможно, это не «идеально», но вы можете изменить значение этого свойства, чтобы снова сделать его видимым, используя:

driver.execute_script('arguments[0].style.display = "block";', el)

Тогда код будет выглядеть так:

el = driver.find_element_by_id('filter-select-6')
driver.execute_script('arguments[0].style.display = "block";', el)

fuel_select = Select(el)
fuel_select.select_by_value("8")

РЕДАКТИРОВАТЬ3:
Только что заметил, что вы предоставили сайт! Очень полезно. Таким образом, раскрывающийся список скрыт как еще один элемент и становится доступным только после нажатия.

Вот код, и это сработало для меня

from selenium import webdriver
from selenium.webdriver.common.touch_actions import TouchActions
from selenium.webdriver.support.ui import Select

# Get the first element and tap on it, note you might have to tap few time.
el = driver.find_element_by_css_selector('.chosen-single > div')
action = TouchActions(driver)
action.tap(el).perform()

# once the dropdown is open it does not seems that the Select el is the one to use
els = driver.find_elements_by_css_selector('.active-result')
for el in els:
    if el.text == 'Diesel':
        el.click()
        break

Спасибо за ответ Ник. Только что попробовал вашу рекомендацию и вернулся с той же ошибкой: «Traceback (последний последний вызов): файл «file.py», строка 16, в <module> fuel_select.select_by_value («8»)» selenium.common.exceptions.ElementNotVisibleException: Сообщение: элемент не взаимодействует: элемент в настоящее время не виден и не может быть изменен (информация о сеансе: chrome=74.0.3729.169) (информация о драйвере: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/‌​3729@{# 29}), платформа‌​=Windows NT 10.0.17134 x86_64)

Shiji M 29.05.2019 07:44

Вы получите тот же результат, если сначала щелкнете, а затем выберите? Попробуйте el = driver.find_element_by_id('filter-select-6'), el.click(). Затем назначьте этот el для выбора fuel_select = Select(el)

Nic Laforge 29.05.2019 07:53

Я думаю, что click() — это метод только для webdriver, но не для Select(webriver.find_element_by_id()? fuel_select.click() возвращается AttributeError: 'Select' object has no attribute 'click'

Shiji M 29.05.2019 07:59

Правильно, вам нужно нажать на элемент, я отредактировал код для большей наглядности.

Nic Laforge 29.05.2019 08:02

Это все еще всплывает как selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable: Element is not currently visible and may not be manipulated. Может ли это быть связано с другим <div>, который отображает выбор <select> под тем же <label>?

Shiji M 29.05.2019 08:11

Я отредактировал ответ. Ваша проблема связана с тем, что для display установлено значение None. Которые удаляют элемент из видимого вообще

Nic Laforge 29.05.2019 08:12

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

Shiji M 29.05.2019 08:26

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

Nic Laforge 29.05.2019 08:52

Мой герой! Работал как шарм, однако раньше я даже не видел ни селектора css, ни TouchAction. Спасибо!

Shiji M 29.05.2019 09:13

Другие вопросы по теме