Опция выбора Python Selenium с помощью Select (элемент не виден?) - PullRequest
2 голосов
/ 29 мая 2019

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

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


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


EDIT1: Теперь можно определить элементы и, но я не могу сделать выбор. Я считаю, что страница также в 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>

Полагаю, я могу без проблем выбрать элемент Выбрать:

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")>

Использование select ():

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)

1 Ответ

2 голосов
/ 29 мая 2019

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")

EDIT1
Попробуйте сначала нажать (), чтобы сделать раскрывающийся список:

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

EDIT2:
Я считаю, что ваша проблема больше связана с тем, что вы используете свойство css style="display: none;" Вы также не сможете увидеть выпадающий список вручную.

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

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

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

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")

EDIT3:
Просто заметил, что вы предоставили сайт! Очень полезно. Таким образом, раскрывающийся список скрыт, являясь другим элементом, и становится доступным только после нажатия.

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...