Нажмите на раскрывающийся список в AngularJS для других элементов, кроме выбора с использованием Python и Selenium - PullRequest
0 голосов
/ 17 октября 2018

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

После долгих исследований я обнаружил, что обычно в html есть элемент select, но это не так.Я достаточно уверен, что элемент, по которому нужно щелкнуть, следующий:

<div class="ui-select-container ui-select-bootstrap dropdown ng-valid ng-touched" ng-class="{open: $select.open}" ng-disabled="form.disabledSemanal" ng-change="getSemanaByYear(form.agno.code, form.fechaTermino)" tagging="" tagging-label="('new')" ng-model="form.agno" style="width: 70px" theme="bootstrap" title="Seleccionar año">

У меня есть еще один подозреваемый:

<i class="caret pull-right" ng-click="$select.toggle($event)"></i>

Это маленькая стрелка кнопки.

Я могу найти оба этих элемента с помощью следующего кода:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = "https://www.odepa.gob.cl/precios/precios-al-consumidor-en-linea"
driver = webdriver.Firefox()
driver.get(url)
# I have to go through an iframe first
frame_src = "'//aplicativos.odepa.gob.cl/precio-consumidor/serie-precio'"
frame = driver.find_element_by_xpath('//iframe[@src='+frame_src+']')
driver.switch_to.frame(frame)
# Now I find both elements
element1 = driver.find_element_by_xpath("//div[@class='ui-select-container ui-select-bootstrap dropdown ng-valid']")
element2 = driver.find_element_by_xpath("//i[@class='caret pull-right']")

Поскольку эти элементы не являются элементами выбора, я не могу использовать удобный:

from selenium.webdriver.support.ui import Select
select = Select(element1)
select.select_by_visible_text("Some_value")

Одним из решений является использование element1.click(), но раскрывающийся список не отображается.

Другое решение - дождаться нажатия, как в:

element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='form-control ui-select-search ng-pristine ng-untouched ng-valid ng-hide']")))
element.click()

Но список не отображается.

Использую ли я правильные элементы?Как мне решить эту задачу?

1 Ответ

0 голосов
/ 17 октября 2018

Я не думаю, что вы можете использовать класс Select, поскольку искомые элементы не относятся к типу Select.

Попробуйте этот подход, он сработал на моем конце.Вы должны щелкнуть наложенный элемент, чтобы открыть элемент ввода.

Если вы согласны с этим утверждением, замените ужасное время. Sleep на ожидание веб-драйвера и замените ключи на лучший подход

from selenium.webdriver import Firefox
from selenium.webdriver.common.keys import Keys
import time

driver = Firefox()
driver.get('https://www.odepa.gob.cl/precios/precios-al-consumidor-en-linea')

time.sleep(5)
# Switch
frame = driver.find_element_by_css_selector(
           'iframe[src="//aplicativos.odepa.gob.cl/precio-consumidor/serie-precio"]'
        )
driver.switch_to.frame(frame)

time.sleep(2)
tipo_de_serie = driver.find_element_by_css_selector('span[aria-label="Seleccionar 
                 tipo de serie activate"]'
                )
driver.execute_script('arguments[0].click();', tipo_de_serie)

time.sleep(2)
seleccionar_tipo_de_serie = driver.find_element_by_css_selector('input[aria- 
                             label="Seleccionar tipo de serie"]'
                            )
seleccionar_tipo_de_serie.send_keys('Anual')
seleccionar_tipo_de_serie.send_keys(Keys.ARROW_DOWN)
seleccionar_tipo_de_serie.send_keys(Keys.ENTER)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...