python - 单击AngularJS中的下拉列表以获取除使用Python和Selenium选择之外的元素
问题描述
我正在使用 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()
但我没有显示列表。
我使用了正确的元素吗?我怎样才能完成这项任务?
解决方案
我认为您不能使用 Select 类,因为您要查找的元素不是 Select 类型。
试试这种方法,它对我有用。您必须单击覆盖元素才能显示输入元素。
如果您获得此批准,请将可怕的 time.sleep 替换为 webdriver wait 并用更好的方法替换 Keys
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)
推荐阅读
- angular - aws-放大错误!TypeError:无法读取 null 的属性“indexOf”
- ibm-cloud - 如何下载在 Watson Studio 中创建的文本转语音文件
- c++ - 如何将 poppler 包含到 QT Creator?
- php - PHP & MySQLi:从多个准备好的语句中获取结果
- firebase - Firebase 云功能:服务器端是否可以使用`createId()`?
- javascript - ReactJS 和谷歌地图 - 显示标记
- python - Python Pandas 无法导入 QUOTE_MINIMAL
- csv - awk 根据单列的唯一值组合其他列的唯一值
- javascript - 断言错误:应用版本已经注册
- android - Android 多行求和:请求代码缩短