使用python selenium从两个不同的下拉菜单中选择元素

使用python selenium从两个不同的下拉菜单中选择元素,python,selenium,web-scraping,Python,Selenium,Web Scraping,我试图从动态表中提取数据。为此,我需要迭代地从两个不同的下拉菜单中选择元素。首先,我要选择dropdown\u secciones的第一个元素,然后我要选择dropdown\u circuitos的第一个元素,最后单击show按钮(mostrar\u click.click())。这将是第一次迭代。第二次迭代应选择下拉菜单的第二个元素,然后再次单击“显示”按钮。在从下拉菜单中选择所有元素之前,不应从第一个下拉菜单(下拉菜单)中选择新元素 到目前为止,我的代码工作不正常: driver = web

我试图从动态表中提取数据。为此,我需要迭代地从两个不同的下拉菜单中选择元素。首先,我要选择dropdown\u secciones的第一个元素,然后我要选择dropdown\u circuitos的第一个元素,最后单击show按钮(mostrar\u click.click())。这将是第一次迭代。第二次迭代应选择下拉菜单的第二个元素,然后再次单击“显示”按钮。在从下拉菜单中选择所有元素之前,不应从第一个下拉菜单(下拉菜单)中选择新元素

到目前为止,我的代码工作不正常:

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")))