使用python selenium从两个不同的下拉菜单中选择元素
我试图从动态表中提取数据。为此,我需要迭代地从两个不同的下拉菜单中选择元素。首先,我要选择dropdown\u secciones的第一个元素,然后我要选择dropdown\u circuitos的第一个元素,最后单击show按钮(mostrar\u click.click())。这将是第一次迭代。第二次迭代应选择下拉菜单的第二个元素,然后再次单击“显示”按钮。在从下拉菜单中选择所有元素之前,不应从第一个下拉菜单(下拉菜单)中选择新元素 到目前为止,我的代码工作不正常:使用python selenium从两个不同的下拉菜单中选择元素,python,selenium,web-scraping,Python,Selenium,Web Scraping,我试图从动态表中提取数据。为此,我需要迭代地从两个不同的下拉菜单中选择元素。首先,我要选择dropdown\u secciones的第一个元素,然后我要选择dropdown\u circuitos的第一个元素,最后单击show按钮(mostrar\u click.click())。这将是第一次迭代。第二次迭代应选择下拉菜单的第二个元素,然后再次单击“显示”按钮。在从下拉菜单中选择所有元素之前,不应从第一个下拉菜单(下拉菜单)中选择新元素 到目前为止,我的代码工作不正常: driver = web
driver = webdriver.Chrome('/Users/Administrador/Documents/chromedriver')
main_url = 'https://www.justiciacordoba.gob.ar/Estatico/JEL/Escrutinios/ReportesEleccion20190512/default.html'
driver.get(main_url)
driver.switch_to.frame("topFrame")
dropdown_secciones = driver.find_element_by_xpath('./html/body/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr[1]/td[2]/select')
select_box_secciones = Select(dropdown_secciones)
options_secciones = select_box_secciones.options
dropdown_circuitos = driver.find_element_by_xpath('//*[@id="cmbCircuitos"]')
select_box_circuitos = Select(dropdown_circuitos)
options_circuitos = select_box_circuitos.options
mostrar_click = driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr[3]/td/div/input[1]')
for index in range(0, len(options_secciones) - 1):
select_box_secciones.select_by_index(index)
mostrar_click.click()
for i in range(0, len(options_circuitos) - 1):
select_box_circuitos.select_by_index(i)
circuitos.append(select_box_circuitos.get_attribute('innerHtml'))
mostrar_click.click()
我对selenium很陌生,但我想我应该知道如何在找到元素时中断第一次迭代,然后“跳转”到第二次迭代。无论如何,关于如何改进代码有什么想法吗?我想我已经想出了一些有用的方法。以下是一些注意事项:
- 当您使用第一个下拉列表时,第二个下拉列表的行为会发生变化,因此我将这些内容移动到了循环中
- 需要一些帧开关,所以我刚刚添加了一些功能以使其更简单(将\u切换到\u top,将\u切换到\u main)
- for循环中的索引应该从1开始,因为0将选择默认值
- 当表加载时,我刚刚添加了一个等待来满足这一需求
- 我在一些使用xpath的地方使用了按id查找,因为我认为这是更好的做法
circuitos.append(select\u-box\u-circuitos.get\u-attribute('innerHtml'))
,所以我留下了它,我不知道这里的意图是什么,但我认为这行行不通。您可以在开始时对此进行注释,以检查其余的工作
还要确保为等待添加导入:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome('/Users/Administrador/Documents/chromedriver')
def switch_to_top():
driver.switch_to.default_content()
driver.switch_to.frame("topFrame")
def switch_to_main():
driver.switch_to.default_content()
driver.switch_to.frame("mainFrame")
main_url = 'https://www.justiciacordoba.gob.ar/Estatico/JEL/Escrutinios/ReportesEleccion20190512/default.html'
driver.get(main_url)
switch_to_top()
dropdown_secciones = driver.find_element_by_id('cmbSecciones')
select_box_secciones = Select(dropdown_secciones)
options_secciones = select_box_secciones.options
mostrar_click = driver.find_element_by_id('cmdMostrar')
for index in range(1, len(options_secciones)):
if (index > 1):
switch_to_top()
select_box_secciones.select_by_index(index)
dropdown_circuitos = driver.find_element_by_id('cmbCircuitos')
select_box_circuitos = Select(dropdown_circuitos)
items_circuitos = select_box_circuitos.options
for i in range(1, len(items_circuitos)):
if (i > 1):
switch_to_top()
select_box_circuitos.select_by_index(i)
circuitos.append(select_box_circuitos.get_attribute('innerHtml'))
mostrar_click.click()
switch_to_main()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "body>table")))