You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Selenium Python循环点击图标批量下载PDF/Excel文件

Selenium Python批量下载PDF/Excel的问题及优化建议

问题背景

我使用Selenium Python循环点击内网页面上的图标,批量下载PDF和Excel文件。页面每行包含2个图标(PDF和Excel各1个),每页共50行。
最初的代码仅能下载第一个文件,后续会抛出NoSuchElementException;2023/11/15更新后,通过在PDF循环末尾重新查找元素,已解决PDF下载问题,但Excel下载时,用WebDriverWait替代time.sleep()会报错,使用time.sleep()则运行正常,希望得到相关解决建议。

已解决的PDF下载代码

pdf_links = driver.find_elements(By.XPATH,'//div[@title="Download as PDF"]')

for i in range(len(pdf_links)):
    # print(pdf_links[i])
    
    pdf_links[i].click()
    select_all_box = WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH,'//input[@controlid="selectAll"]/following-sibling::span')))
    select_all_box.click()
    submit_select_button = WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH,'//button[@label="Submit"]'))).click()
    download_button = WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH,'//button[@label="Download"]'))).click()

    WebDriverWait(driver,5).until(EC.presence_of_element_located((By.XPATH,'//div[@title="Download as PDF"]')))
    
    pdf_links = driver.find_elements(By.XPATH,'//div[@title="Download as PDF"]')

Excel下载的当前代码

WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH,'//div[@title="Download as Excel"]')))

excel_links = driver.find_elements(By.XPATH,'//div[@title="Download as Excel"]')

for i in range(len(excel_links)):
    print(excel_links[i])

    excel_links[i].click()
    time.sleep(3)
    # WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,'//div[@title="Download as Excel"]')))
    
    excel_links = driver.find_elements(By.XPATH,'//div[@title="Download as Excel"]')

Excel下载替换time.sleep()的解决思路

  • 明确等待的核心状态:time.sleep(3)能正常运行,说明点击Excel图标后,页面需要时间完成状态重置(比如弹窗关闭、DOM重新渲染)。用WebDriverWait时,不能仅等待元素存在,要等元素完全可点击且页面状态稳定,避免DOM更新未完成就操作。
  • 调整等待条件示例:
    如果Excel下载也有类似PDF的弹窗流程,先等待弹窗消失,再等待图标可点击:
    excel_links = driver.find_elements(By.XPATH,'//div[@title="Download as Excel"]')
    
    for i in range(len(excel_links)):
        excel_links[i].click()
        # 等待下载弹窗消失(替换为实际弹窗的定位XPath)
        WebDriverWait(driver, 10).until(EC.invisibility_of_element_located((By.XPATH, '//div[@class="excel-download-modal"]')))
        # 等待Excel图标重新可点击,确保页面就绪
        WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,'//div[@title="Download as Excel"]')))
        # 重新获取元素列表
        excel_links = driver.find_elements(By.XPATH,'//div[@title="Download as Excel"]')
    
  • 避免陈旧元素引用:每次循环必须重新获取excel_links列表,不要依赖循环开始时的旧引用,防止StaleElementReferenceException。
  • 调试定位问题:可以在等待前后打印页面元素的状态或HTML片段,确认DOM何时完成更新,找到最精准的等待触发条件。

内容的提问来源于stack exchange,提问作者Jay Cheng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:36:07