【问题标题】:How to verify table element and click on other element with Selenium如何使用 Selenium 验证表格元素并单击其他元素
【发布时间】:2020-04-02 16:43:46
【问题描述】:

我正在尝试创建一个 scraper,它可以进入网站并下载包含房地产基金资产负债表的 XML 文件。

使用下面的代码,我输入文档编号为 07000400000146(在 URL 末尾)的特定基金的网站,使用网站上的搜索栏过滤文档,然后单击以下载表格中的第一个文档XPath。

driver.get('https://fnet.bmfbovespa.com.br/fnet/publico/abrirGerenciadorDocumentosCVM?cnpjFundo=07000400000146')
driver.find_element_by_css_selector(f'input[type="search"]').click()
driver.find_element_by_css_selector(f'input[type="search"]').send_keys('informe mensal')
time.sleep(1)
driver.find_element_by_xpath('//*[@id="tblDocumentosEnviados"]/tbody/tr[1]/td[10]/div/a[2]/i').click()

我如何创建一个布尔表达式来发现行是 03/2020 或 02/2020 还是 01/2020,在“参考数据”列中,然后下载每个相应日期的所有可用文件?

【问题讨论】:

    标签: python python-3.x selenium xpath selenium-chromedriver


    【解决方案1】:

    您可以尝试使用datelist=[ '03/2020','02/2020','01/2020'] 之类的列表,并使用下面的 xpath 选项检查网页上可用的日期。如果可用的日期将单击并下载,否则将显示没有可用的日期。 使用try..exceptblock.ignore sleep() 使用WebDriverWait()

    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    
    driver=webdriver.Chrome()
    driver.get('https://fnet.bmfbovespa.com.br/fnet/publico/abrirGerenciadorDocumentosCVM?cnpjFundo=07000400000146')
    driver.find_element_by_css_selector('input[type="search"]').click()
    driver.find_element_by_css_selector('input[type="search"]').send_keys('informe mensal')
    datelist=[ '03/2020','02/2020','01/2020']
    for dates in datelist:
        try:
           WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH,"//table[@id='tblDocumentosEnviados']//td[text()='"+ dates + "']/following-sibling::td[5]//a[@title='Download do Documento']"))).click()
           print('file downloaded with dates available ' + dates)
        except:
           print("No such dates available " + dates) 
    

    这将像这样在控制台上打印。

    No such dates available 03/2020
    file downloaded with dates available 02/2020
    file downloaded with dates available 01/2020
    

    更新代码,状态为Ativo

    driver.get('https://fnet.bmfbovespa.com.br/fnet/publico/abrirGerenciadorDocumentosCVM?cnpjFundo=07000400000146')
    driver.find_element_by_css_selector('input[type="search"]').click()
    driver.find_element_by_css_selector('input[type="search"]').send_keys('informe mensal')
    datelist=[ '03/2020','02/2020','01/2020']
    for dates in datelist:
        try:
           WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH,"//table[@id='tblDocumentosEnviados']//td[text()='"+ dates +"']/following-sibling::td[.//span[text()='Ativo']]/following-sibling::td//a[@title='Download do Documento']"))).click()
           print('file downloaded with dates available ' + dates)
        except:
           print("No such dates available " + dates)
    

    【讨论】:

    • 你的回答完全符合我的问题!
    • 我注意到我没有在问题上添加“状态”列的要求,我需要“状态”为“Ativo”。你能帮我把它添加到上面的代码中吗?
    • 你能帮我解决这个问题吗? stackoverflow.com/q/61686680/12880475
    【解决方案2】:

    请尝试以下代码下载您的 pdf

    driver.get('https://fnet.bmfbovespa.com.br/fnet/publico/abrirGerenciadorDocumentosCVM?cnpjFundo=07000400000146')
    driver.maximize_window()
    wait = WebDriverWait(driver, 20)
    elemnt=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'label > input')))
    elemnt.send_keys('informe mensal')
    
    mylist=[ '03/2020','02/2020','01/2020']
    for list in mylist:
    button = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH,
                                                                        "//td[text()='" + list + "']//following-sibling::td//a[@title='Download do Documento']")))
    driver.execute_script("arguments[0].click();", button);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2021-05-22
      • 1970-01-01
      • 2016-06-08
      • 2021-05-06
      • 2021-03-31
      • 1970-01-01
      相关资源
      最近更新 更多