Взаимодействовать с Dropdown с классом «nesty-input», используя Selenium? - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь автоматизировать жалобы в FCC. У меня проблемы с взаимодействием с выпадающим списком, расположенным по адресу https://consumercomplaints.fcc.gov/hc/en-us/requests/new?ticket_form_id=39744. Элементом является раскрывающийся список Проблемы с телефоном :

enter image description here

HTML-код:

<div class="form-field string  required  request_custom_fields_22619354" >
  <label id="request_custom_fields_22619354_label" for="request_custom_fields_22619354">Phone Issues</label>
  <input type="hidden" name="request[custom_fields][22619354]" id="request_custom_fields_22619354" autocomplete="off" data-tagger="[{&quot;label&quot;:&quot;-&quot;,&quot;value&quot;:&quot;&quot;},{&quot;label&quot;:&quot;Unwanted Calls (including do not call and spoofing)&quot;,&quot;value&quot;:&quot;telemarketing_phone&quot;},{&quot;label&quot;:&quot;Junk Faxes&quot;,&quot;value&quot;:&quot;junk_faxes_phone&quot;},{&quot;label&quot;:&quot;Availability&quot;,&quot;value&quot;:&quot;availability_phone&quot;},{&quot;label&quot;:&quot;Billing&quot;,&quot;value&quot;:&quot;billing_phone&quot;},{&quot;label&quot;:&quot;Cramming (unauthorized charges on your phone bill)&quot;,&quot;value&quot;:&quot;cramming_phone&quot;},{&quot;label&quot;:&quot;Equipment&quot;,&quot;value&quot;:&quot;equipment_phone&quot;},{&quot;label&quot;:&quot;Interference&quot;,&quot;value&quot;:&quot;interference_phone&quot;},{&quot;label&quot;:&quot;Number Portability (keeping your number if you change providers)&quot;,&quot;value&quot;:&quot;number_portability_phone&quot;},{&quot;label&quot;:&quot;Privacy&quot;,&quot;value&quot;:&quot;privacy_phone&quot;},{&quot;label&quot;:&quot;Rural Call Completion&quot;,&quot;value&quot;:&quot;rural_call_completion_phone&quot;},{&quot;label&quot;:&quot;Slamming (change of your carrier without permission)&quot;,&quot;value&quot;:&quot;slamming_phone&quot;}]" aria-required="true" aria-describedby="request_custom_fields_22619354_hint" aria-labelledby="request_custom_fields_22619354_label" />

  <p id="request_custom_fields_22619354_hint">Please select the issue that best describes your complaint.</p>
</div>

Я хочу выбрать индекс 1 или текст Нежелательные звонки (в том числе не звонить и не подделывать) . (Индекс 0 - это текст с чертой).

Вот мои три попытки, но они приводят к исключениям:

dropdown_issue = driver.find_element_by_id("request_custom_fields_22619354")

# First try - ElementNotInteractableException
dropdown_issue.send_keys("Unwanted Calls");

# Second try - ElementNotInteractableException
dropdown_issue.send_keys(Keys.DOWN);
dropdown_issue.send_keys(Keys.DOWN);
dropdown_issue.send_keys(Keys.ENTER);

# Third try - 'WebElement' object has no attribute 'select_by_index'
dropdown_issue.select_by_index(1)

Я думаю, что мне нужно перейти к "nesty-вход ", который имеет стрелку вниз (но без имени или идентификатора). Я не уверен, как получить доступ к nesty-вводу.

Как выбрать нужный индекс для раскрывающегося списка?

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

ОБНОВЛЕНИЕ

Используйте WebDriverWait, чтобы убедиться, что элемент видим, и используйте Select для обработки выпадающего списка.

Вам нужно подождать, пока этот элемент не станет видимым:

By.XPATH -> //label[text()="Phone Issues"]//following-sibling::a[@class="nesty-input ae-exclude"]

А select element:

By.ID -> ae-request_custom_fields_22619354

Пожалуйста, попробуйте следующий код:

driver.get('https://consumercomplaints.fcc.gov/hc/en-us/requests/new?ticket_form_id=39744')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//label[text()="Phone Issues"]//following-sibling::a[@class="nesty-input ae-exclude"]')))
elmt = driver.find_element_by_id('ae-request_custom_fields_22619354')
select = Select(elmt)
select.select_by_index(1)

#select by other method
select.select_by_value('telemarketing_phone')
select.select_by_visible_text('Unwanted Calls (including do not call and spoofing)')

Следующий импорт:

from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
0 голосов
/ 01 ноября 2019

Чтобы выбрать элемент с текстом как Unwanted Calls (including do not call and spoofing) в раскрывающемся списке рядом с Проблемы с телефоном , расположенном на веб-сайте , необходимо вызвать WebDriverWait для visibility_of_element_located(), и вы можете использовать следующие Стратегии локатора :

  • Кодовый блок:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions()
    options.add_argument("start-maximized")
    #options.add_argument("--headless")
    #options.add_experimental_option("excludeSwitches", ["enable-automation"])
    #options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://consumercomplaints.fcc.gov/hc/en-us/requests/new?ticket_form_id=39744")
    driver.execute_script("scroll(0, 400)")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//p[text()='Please select the issue that best describes your complaint.']//preceding::a[1]"))).click()
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//p[text()='Please select the issue that best describes your complaint.']//preceding::select[@class='ae-select' and starts-with(@id, 'ae-request_custom_fields')]//option[contains(., 'Unwanted Calls')]"))).click()
    
  • Снимок браузера:

Unwantedcalls

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