首页 > 解决方案 > Selenium 和 Python:如何查找按钮列表并在循环中单击它们

问题描述

有一个表格,其中包含我需要抓取的一些数据,但首先我需要为每一行单击一个按钮(表格内),以便我可以转到另一个框架,然后选择数据(更详细的一个)。

之后,我使用 driver.back() 并单击下一步按钮,但我没有得到它。

这是我尝试获取按钮列表然后构建循环的内容:

list_buttons_consult_cri = WebDriverWait(driver, 10).until(EC.presence_of_elements_located((By.XPATH, "//a[@class='btn btn-black btn--small btn-registro']")))

但它不起作用,它给了我一个包含 [0] 元素的列表。

也尝试使用 By.CLASS 来查找元素

当我尝试这个时,我可以通过第一个按钮:

button_cri = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//a[@class='btn btn-black btn--small btn-registro']")))

driver.execute_script("arguments[0].click();", button_cri)

但我的兴趣是建立一个循环去点击每个按钮,一次一次。

这是一些 html(在 a 标签中带有两个第一个按钮):

<table id="resultEmissaoCri" class="table table--black">
    <thead>
        <tr>
            <th scope="col" class="no-break">Companhia Emissora</th>
            <th scope="col" class="no-break">Agente Fiduciário</th>
            <th scope="col" class="break-column">Nº Emissão</th>
            <th scope="col" class="no-break">Tipo de Oferta </th>
            <th scope="col" class="no-break">Código CETIP</th>
            <th scope="col" class="break-column">Nº Série</th>
            <th scope="col" class="no-break">Tipo de Série</th>
            <th scope="col" class="no-break">Vl. Global Série<br>(R$ em milhões)</th>
            <th scope="col" class="no-break">Vl. Total Oferta<br>(R$ em milhões)</th>
            <th scope="col" class="break-column">Data de Emissão</th>
            <th scope="col" class="no-break">Identificação do CRI</th>
            <th scope="col" class="no-break"></th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td data-label="Companhia Emissora" data-type="fantasiaEmissor">RB CAPITAL COMPANHIA DE SECURITIZACAO</td>
            <td data-label="Agente Fiduciário" data-type="nomeAgenteFiduciario">OLIVEIRA TRUST DISTRIBUIDORA DE TÍTULOS E VALORES MOBILIÁRIOS S.A.</td>
            <td data-label="Nº Emissão" data-type="numEmissao">1</td>
            <td data-label="Tipo de Oferta " data-type="indTipoOferta">Pública de Esforços Restritos</td>
            <td data-label="Código CETIP" data-type="codCETIP"></td>
            <td data-label="Nº Série" data-type="numSerie">296</td>
            <td data-label="Tipo de Série" data-type="indTipoCRI">Série Única</td>
            <td data-label="Vl. Global Série (R$ em milhões)" data-type="valorGlobalSerie" class="align-right">21,54</td>
            <td data-label="Vl. Total Oferta (R$ em milhões)" data-type="valorTotalOferta" class="align-right">21,53</td>
            <td data-label="Data de Emissão" data-type="dataEmissao">06/11/2020</td>
            <td data-label="Identificação do CRI" data-type="descrIdentificacaoCRI" class="break-row">1407</td>
            <td data-label="" data-type="button">
                <div class="table__buttons"><a class="btn btn-black btn--small btn-registro" title="Dados Emissão" href="/emissao/1407/1/296"><i class="fa fa-file-text-o" aria-hidden="true"></i></a><a class="btn btn-black btn--small btn-dados" title="Dados Periódicos" href="/periodica/1407/1/296"><i class="fa fa-calendar" aria-hidden="true"></i></a></div>
          
        </td>
    </tr>
    <tr>
        <td data-label="Companhia Emissora" data-type="fantasiaEmissor">RB CAPITAL COMPANHIA DE SECURITIZACAO</td>
        <td data-label="Agente Fiduciário" data-type="nomeAgenteFiduciario">VORTX DTVM LTDA</td>
        <td data-label="Nº Emissão" data-type="numEmissao">1</td>
        <td data-label="Tipo de Oferta " data-type="indTipoOferta">Pública de Esforços Restritos</td>
        <td data-label="Código CETIP" data-type="codCETIP"></td>
        <td data-label="Nº Série" data-type="numSerie">303</td>
        <td data-label="Tipo de Série" data-type="indTipoCRI">Série Única</td>
        <td data-label="Vl. Global Série (R$ em milhões)" data-type="valorGlobalSerie" class="align-right">20,00</td>
        <td data-label="Vl. Total Oferta (R$ em milhões)" data-type="valorTotalOferta" class="align-right">20,00</td>
        <td data-label="Data de Emissão" data-type="dataEmissao">29/10/2020</td>
        <td data-label="Identificação do CRI" data-type="descrIdentificacaoCRI" class="break-row">1403</td>
        <td data-label="" data-type="button">
            <div class="table__buttons"><a class="btn btn-black btn--small btn-registro" title="Dados Emissão" href="/emissao/1403/1/303"><i class="fa fa-file-text-o" aria-hidden="true"></i></a><a class="btn btn-black btn--small btn-dados" title="Dados Periódicos" href="/periodica/1403/1/303"><i class="fa fa-calendar" aria-hidden="true"></i></a></div>
        </td>

如果有人想要的话,还有 html 的链接: https ://www.anbima.com.br/pt_br/informar/dados-de-emissao-de-cri.htm

标签: pythonseleniumloops

解决方案


我建议做的是创建一个您希望单击的按钮列表,首先创建一个通过 xpath 查找所有元素的变量。然后,有一个 for 循环遍历该列表以通过 get_attribute 找到按钮类。

然后,您需要从该列表中获取键并将它们放入变量中。最后,有另一个 for 循环遍历列表中的每个项目并执行您想要的操作。请参见下面的示例。

buttons = []
button_cri = driver.find_elements(By.XPATH, '(//a[@class="btn btn-black btn--small btn-registro"])')

for i in range(len(button_cri)):
    buttons.append(button_cri[i].get_attribute("button"))

all_buttons = list(dict.fromkeys(buttons))

for b in all_buttons:
    driver.get(b)
    *Rest of your code here*

我在上面的代码中做了一些假设。查看您当前正在尝试的完整代码可能会有所帮助。

谢谢


推荐阅读