динамическое выпадающее меню python селена - PullRequest
0 голосов
/ 26 октября 2019

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

<div id="field_type_group" class="field trigger-option group0" style="">
  <div class="label"><label>Input Type</label></div>
  <div class="input">
    <select>
      <option data-item-id="100" value="text_field_validation_type">Text input</option>
      <option data-item-id="200" value="dropdown_field_type">Dropdown list</option>
      <option data-item-id="300" value="location_field_type">Location based input</option>
    </select>
  </div>
</div>

<div id="text_field_validation_type" class="field trigger-option group100" style="display: none;">
  <div class="label"><label>Input validation</label></div>
  <div class="input">
    <select>
      <option data-item-id="0" data-displayfield="text_raw" value="none">No validation required</option>
      <option data-item-id="500" value="text_field_type">Validation required</option>
    </select>
  </div>
</div>

<div id="dropdown_field_type" class="field trigger-option group200" style="">
  <div class="label"><label>Data source for dropdown list</label></div>
  <div class="input">
    <select>
      <option data-item-id="6" data-displayfield="dropdown_static" value="none">Populate with list items specified here</option>
      <option data-item-id="7" data-displayfield="dropdown_dynamic" value="none">Retrieve list items from my service</option>
    </select>
  </div>
</div>

Выпадающее меню похоже на это, и я могу успешно выбрать его дляпервое меню после многих попыток использования этого кода.

wait.until(ec.visibility_of_element_located((By.XPATH, "//select[option[@value='text_field_validation_type']]"))).click()
browser.find_element_by_xpath(".//option[text()[contains(.,'Dropdown list')]]").click()

Но проблемы возникают, когда мне нужно выбрать подменю.

Я пробовал много способов (также попробуйте использовать Select иActionChains) и ничего не работает.

Мой код с помощью Select:

select_element = browser.find_element_by_xpath("//select[option[@value='text_field_validation_type']]")
select = Select(select_element)
select.select_by_index(1)

select_element = browser.find_element_by_xpath("//select[option[@data-item-id='6']]")
select = Select(select_element)
select.select_by_index(1)

Мой другой код:

wait.until(ec.visibility_of_element_located((By.XPATH, "//select[option[@data-item-id ='6']]"))).click()
browser.find_element_by_xpath(".//option[@data-displayfield='dropdown_dynamic']").click()

Я пытаюсь разными способами изменить значение xpath, но ничего не работает, и моя среда не поддерживаетActionChains.

РЕДАКТИРОВАТЬ:

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

wait.until(ec.visibility_of_element_located((By.XPATH, "//select[option[@value='text_field_validation_type']]"))).click()
sleep(2)
select_element = browser.find_element_by_xpath("//select[option[@value='dropdown_field_type']]")
select = Select(select_element)
#select.select_by_index(1)
select.select_by_visible_text('Dropdown list')

Я также заметил, что в динамическом раскрывающемся подменю они используют другой элемент div с style="display:none;", когда это не раскрывающееся подменю моего выбранного меню, влияет ли это на мою проблему? Я немного добавляю меню HTML.

Может кто-нибудь мне помочь? Большое спасибо.

Ответы [ 3 ]

1 голос
/ 27 октября 2019

Можете ли вы попробовать использовать xpath, как это?

dd1 = "//*[text() = 'Input Type']//following::select[1]"
dd2 = "//*[contains(text() , 'Data source')]//following::select[1]"

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

select = Select(driver.find_element_by_xpath(dd1))

# select by visible text
select.select_by_visible_text('Dropdown list')
# OR select by value 
select.select_by_value('dropdown_field_type')

, а затем выберите второй раскрывающийся список

select = Select(driver.find_element_by_xpath(dd2))
# select by visible text
select.select_by_visible_text('Populate with list items specified here')

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

1 голос
/ 26 октября 2019

Попробуйте код ниже с Selenium Select, xpath на основе метки и подождите, пока элемент будет кликабелен:

sub_menu = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@id='dropdown_field_type' and .//label[.='Data source for dropdown list']]//select")))
select = Select(sub_menu)
select.select_by_index(0)
# or
select.select_by_visible_text("Populate with list items specified here")
0 голосов
/ 27 октября 2019

После многих попыток, решение состоит в том, чтобы обновить веб-браузер и использовать последнюю версию geckodriver, а затем использовать функцию выбора. Виноват. Большое спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...