簡體   English   中英

Selenium & Python:如何查找按鈕列表並循環單擊它們

[英]Selenium & Python: how to find a list of buttons and click them in a loop

有一個表格,其中包含一些我需要抓取的數據,但首先我需要為每一行單擊一個按鈕(表格內),這樣我就可以將 go 轉到另一個框架,然后選擇數據(更詳細的一個)。

之后,我使用 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)

但我的興趣是建立一個循環到 go 並單擊每個按鈕,一次一次。

以下是一些 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-crihs。

我建議做的是創建一個您希望單擊的按鈕列表,首先創建一個變量,該變量通過 xpath 找到所有元素。 然后,有一個 for 循環遍歷該列表以通過 get_attribute 找到按鈕 class。

然后,您需要從該列表中獲取鍵並將它們放入變量中。 最后,有另一個 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*

我在上面的代碼中做了一些假設。 查看您當前正在嘗試的完整代碼可能會有所幫助。

謝謝

對於每一行,您應該獲得按鈕,單擊它,獲取您的數據,然后返回。 這里有一個例子:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as ec  


table = WebDriverWait(driver, 10).until(ec.presence_of_element_located((By.XPATH, "//table")))
trs = WebDriverWait(table, 10).until(ec.presence_of_all_elements_located((By.XPATH, ".//tr")))
for i in range(len(trs)):
    table = WebDriverWait(driver, 10).until(ec.presence_of_element_located((By.XPATH, "//table")))
    trs = WebDriverWait(table, 10).until(ec.presence_of_all_elements_located((By.XPATH, ".//tr")))
    tds = WebDriverWait(trs[i], 10).until(ec.presence_of_all_elements_located((By.XPATH, ".//td")))
    last_td = tds[-1]
    button = WebDriverWait(last_td, 10).until(ec.element_to_be_clickable((By.XPATH, ".//a[@class='btn btn-black btn--small btn-registro']")))
    button.click()
    #get your data
    driver.back()

要獲取元素list ,您必須使用presence_of_all_elements_located ()

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

要讓所有 11 個按鈕單擊並返回 go,請執行以下操作。

driver.get("https://www.anbima.com.br/pt_br/informar/dados-de-emissao-de-cri.htm")  
wait=WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#LGPD_ANBIMA_global_sites__text__btn"))).click()
wait.until(EC.frame_to_be_available_and_switch_to_it((By.CLASS_NAME, 'full')))
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.btn.btn-black.right"))).click()
i=1
while True:
    try:
        #print("/html/body/div[1]/div/div/div/main/table/tbody/tr[{}]/td[12]/div/a[1]".format(i))
        elem=wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div/div/div/main/table/tbody/tr[{}]/td[12]/div/a[1]".format(i))))
        driver.execute_script("arguments[0].click();", elem)
        i+=1
        driver.back()
        wait.until(EC.frame_to_be_available_and_switch_to_it((By.CLASS_NAME, 'full')))
    except Exception as e:
        print(e)
        break

這將執行以下操作:

  1. 句柄彈出
  2. 切換到 iframe
  3. 打開表
  4. 循環所有按鈕

進口

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM