首页 > 解决方案 > 使用 python selenium 从两个不同的下拉菜单中选择元素

问题描述

我正在尝试从动态表中抓取数据。为此,我需要从两个不同的下拉菜单中迭代地选择元素。首先,我要选择 dropdown_secciones 的第一个元素,然后我要选择 dropdown_circuitos 的第一个元素,最后单击显示按钮(mostrar_click.click())。这将是第一次迭代。第二次迭代应该选择 dropdown_circuitos 的第二个元素,然后再次单击显示按钮。在从 dropdown_circuitos 中选择所有元素之前,不应选择第一个下拉列表 (dropdown_secciones) 中的新元素。

这是我到目前为止无法正常工作的代码:

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

我对硒很陌生,但我想我应该在找到一个元素时如何打破第一次迭代,然后“跳转”到第二次迭代。无论如何,关于如何改进代码的任何想法?

标签: pythonseleniumweb-scraping

解决方案


我想我想出了一些应该有所帮助的东西。以下是一些注意事项:

  • 当您使用第一个下拉菜单时,第二个下拉行为会发生变化,因此我已将这些内容移动到循环本身中
  • 需要一些帧开关,所以我刚刚添加了一些功能以使其更容易(switch_to_top 和 switch_to_main)
  • for 循环中的索引应从 1 开始,因为 0 将选择默认值
  • 当表格加载时,我刚刚添加了一个等待来满足这个
  • 我在您使用过 xpath 的某些地方使用了 find by id,因为我相信这是更好的做法

我不确定的一条线是circuitos.append(select_box_circuitos.get_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")))

推荐阅读