Выбор параметра из раскрывающегося списка (используется несколько вызовов класса) с использованием Python и Selenium

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

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

chosen_homepage = "https://www.facebook.com/"
browser = webdriver.Chrome()
browser.maximize_window()
browser.get(chosen_homepage)

the_month_id = "month"
the_day_id = "day"
the_year_id = "year"

element5 = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, the_month_id)))

from selenium.webdriver.support.select import Select

the_month = Select(browser.find_element_by_id(the_month_id))
the_month.select_by_visible_text("Mar")

the_day = Select(browser.find_element_by_id(the_day_id))
the_day.select_by_visible_text("15")

the_year = Select(browser.find_element_by_id(the_year_id))
the_year.select_by_visible_text("1985")

Однако этот веб-сайт оказывается более сложным. Я пытаюсь войти в здесь

Чтобы автоматически выбрать регион из раскрывающегося списка, например. «АК», что в данном случае является вариантом 3. Я могу выбрать (щелкнуть) раскрывающийся список и отобразить параметры его значения в графическом интерфейсе, используя:

# Successfully manages to click on the drop down and displays the drop down list
region_option = "rpOptionCheck"
wait_region = WebDriverWait(browser, 5).until(EC.element_to_be_clickable((By.ID, region_option)))
menu_accounts = browser.find_element_by_id(region_option)
menu_accounts.click()

Здесь все становится сложнее, я пробовал несколько альтернативных подходов к выбору параметра внутри этого списка, например. использование sendkeys() с использованием значений и даже действия со стрелкой вниз (для перехода по списку) без успеха.

Поэтому я попытался разбить проблему еще немного. Кажется, есть несколько вызовов вложенных объектов, я попытался перечислить основные компоненты, которые, как я вижу, срабатывают при выборе из раскрывающегося списка, т.е. reOptionCheck => jfpw-select=wrapper => jfpw-select-wrapper jfpw-select -список-контейнер

<div id="rpOptionCheck">

<div class="jfpw-select-wrapper">

<div class="jfpw-select-wrapper jfpw-select-list-container"
<ul class="ui-selectmenu-menu ui-widget ui-widget-content ui-selectmenu-menu-dropdown ui-corner-bottom jfpw-select ui-selectmenu-open" aria-hidden="false" role="listbox" aria-labelledby="RegionalPricingLocation-snapshot-button" id="RegionalPricingLocation-snapshot-menu" aria-activedescendant="RegionalPricingLocation-snapshot-menu-option-4" tabindex="0" style="width: 258px; max-height: 160px; float: left; overflow: hidden; outline: none; z-index: 1002; top: 0px; left: 0px; position: relative; border-style: none;"><li role="option" tabindex="-1" aria-selected="false" id="RegionalPricingLocation-snapshot-menu-option-0" class=""><span class="ui-selectmenu-item-header">Select a State</span></li><li role="option" tabindex="-1" aria-selected="false" id="RegionalPricingLocation-snapshot-menu-option-1" class=""><span class="ui-selectmenu-item-header">AA</span></li><li role="option" tabindex="-1" aria-selected="false" id="RegionalPricingLocation-snapshot-menu-option-2" class=""><span class="ui-selectmenu-item-header">AE</span></li><li role="option" tabindex="-1" aria-selected="false" id="RegionalPricingLocation-snapshot-menu-option-3" class=""><span class="ui-selectmenu-item-header">AK</span></li><li role="option" tabindex="-1" aria-selected="true" id="RegionalPricingLocation-snapshot-menu-option-4" class="ui-selectmenu-item-selected"><span class="ui-selectmenu-item-header">AL</span></li><li role="option" tabindex="-1" aria-selected="false" id="RegionalPricingLocation-snapshot-menu-option-5"><span class="ui-selectmenu-item-header">AP</span></li><li role="option" tabindex="-1" aria-selected="false" 
...

Мне удалось прокрутить элементы, пишущие этот код

region_option3 = "RegionalPricingLocation-snapshot-menu"        # Called in last component listed above
html_list = browser.find_element_by_id(region_option3)
items = html_list.find_elements_by_tag_name("li")               # Collects all List Elements
# items.get(1).click()

option_no3 = "RegionalPricingLocation-snapshot-menu-option-3"    # As a test look for 3rd item "AK"
for item in items:
    print(item.get_attribute("value"), item.get_attribute("text"), item.get_attribute("id"))
    if item.get_attribute("id") == option_no3:
        print("Found 3rd Item - Option 3")
        break   

Вывод этого фрагмента кода: Результаты вывода

Как вы можете видеть, вывод не соответствует реальным значениям, отображаемым в списке, больше похож на позиционные индикаторы, например. «RegionalPricingLocation-snapshot-menu-option-3» Я подозреваю, что я пришел на этот раз с неправильного уровня, но пытался установить фокус и выбрать на более высоких уровнях объекта различными способами, которые, кажется, вызывают исключения. Я вижу, что aria-selected="true" для выбранного параметра, в данном случае это для третьего элемента списка (RegionalPricingLocation-snapshot-menu-option-3) но не уверен, как его установить, так как похоже, что это вход, который передается.

Возвращаясь к верхнему уровню (rpOptionCheck) и глядя на сгенерированный HTML, я вижу значения списка внутри параметра выбора, как показано на экране, что позволило мне поверить, что я мог бы использовать тот же подход, что и в приведенном выше примере Facebook, с использованием подхода Select().

В данный момент я связываю себя узлами, не совсем уверен, как подойти к этому. Я новичок в Python и Selenium, и это будет моя первая публикация. Надеюсь, в правильном формате. Более чем счастлив внести поправки по мере необходимости, чтобы соответствовать стандартам.

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

Обновление 1: я нашел эту тему, которая выглядит похожей по проблеме. вызовы класса с нестандартными реализациями Select
Selenium, выбор элемента внутри ‹промежутка›

Так попробовал это

# <div class="jfpw-select-wrapper jfpw-select-list-container" Note: sits above ul class 
# <ul class="ui-selectmenu ui-widget ui-state-default jfpw-select ui-selectmenu-dropdown ui-corner-all
jfpw_select = "jfpw-select"
find_call = browser.find_element_by_class_name(jfpw_select)
# find_call.send_keys('AK')
find_call.send_keys(Keys.DOWN)
#Error Message "selenium.common.exceptions.ElementNotVisibleException: Message: element not visible"

Это немного отличается от примера Google, так как кажется, что есть два вызова класса из того, что я могу решить (я думаю)...


person Kellogs    schedule 31.01.2017    source источник
comment
Вы уверены, что это не веб-сайт мешает вам сделать это?   -  person WhatsThePoint    schedule 31.01.2017
comment
Привет, я не уверен. Не совсем уверен, как я мог определить это, если это было так. Спасибо за ответ.   -  person Kellogs    schedule 26.01.2018