Я безуспешно пытался использовать несколько подходов, упомянутых в подобных вопросах. В исходном коде 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> прямо под class = "hidden", он находится внутри <div class = "fuel-price">
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)
Вы получите тот же результат, если сначала щелкнете, а затем выберите? Попробуйте el = driver.find_element_by_id('filter-select-6'), el.click().
Затем назначьте этот el
для выбора fuel_select = Select(el)
Я думаю, что click()
— это метод только для webdriver
, но не для Select(webriver.find_element_by_id()
? fuel_select.click()
возвращается AttributeError: 'Select' object has no attribute 'click'
Правильно, вам нужно нажать на элемент, я отредактировал код для большей наглядности.
Это все еще всплывает как selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable: Element is not currently visible and may not be manipulated
. Может ли это быть связано с другим <div>, который отображает выбор <select> под тем же <label>?
Я отредактировал ответ. Ваша проблема связана с тем, что для display
установлено значение None. Которые удаляют элемент из видимого вообще
При использовании обычного браузера Chrome и ввода с помощью мыши раскрывающийся список появляется. И выбор также влияет на другие объекты на странице...
Понял, только что заметил, что вы разместили сайт. Проверьте третье редактирование. Я протестировал код и работал на меня
Мой герой! Работал как шарм, однако раньше я даже не видел ни селектора css, ни TouchAction. Спасибо!
Можете ли вы провести нас к этому раскрывающемуся списку? Этот выпадающий список находится внутри элемента div. Этот Div имеет свойство, называемое скрытым.