Tosca中带分页表格遍历与PDF批量下载自动化问题咨询
批量下载分页表格PDF的自动化实现方案
核心流程
- 循环遍历表格每一页
- 逐行点击当前页的「View」按钮,跳转详情页完成PDF下载
- 返回列表页,切换至下一页重复操作,直至所有页处理完毕
具体实现步骤
1. 分页循环逻辑
先确定表格的总页数(如果页面有明确显示,比如「第X页/共Y页」,直接提取总页数);如果没有总页数,就通过「下一页」按钮的状态判断是否还有后续页面。
以Selenium为例的代码示例:
from selenium import webdriver 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() driver.get("你的表格页面URL") # 方式1:从页面提取总页数 total_pages = int(driver.find_element(By.CSS_SELECTOR, ".total-page-text").text.split("/")[-1].strip()) current_page = 1 while current_page <= total_pages: # 处理当前页所有行 process_current_page(driver) # 切换下一页(非最后一页时) if current_page < total_pages: next_btn = driver.find_element(By.CSS_SELECTOR, ".next-page-btn") next_btn.click() # 等待页面刷新完成(等待表格元素失效,确保新页加载) WebDriverWait(driver, 10).until( EC.staleness_of(driver.find_element(By.CSS_SELECTOR, ".table-row")) ) current_page += 1 # 方式2:通过下一页按钮是否可用判断(无总页数时) # next_btn = driver.find_element(By.CSS_SELECTOR, ".next-page-btn") # while next_btn.is_enabled(): # process_current_page(driver) # next_btn.click() # WebDriverWait(driver, 10).until(EC.staleness_of(driver.find_element(By.CSS_SELECTOR, ".table-row"))) # next_btn = driver.find_element(By.CSS_SELECTOR, ".next-page-btn")
2. 单页行遍历与PDF下载
每次处理新页面时,必须重新定位所有「View」按钮(页面刷新后旧元素会失效);点击按钮后处理详情页下载,再返回列表页。
def process_current_page(driver): # 获取当前页所有「View」按钮数量 row_count = len(driver.find_elements(By.CSS_SELECTOR, ".table-row .view-btn")) for i in range(row_count): # 重新定位当前行的「View」按钮,避免Stale Element错误 view_btn = driver.find_elements(By.CSS_SELECTOR, ".table-row .view-btn")[i] view_btn.click() # 调用你已实现的PDF下载模块 download_pdf(driver) # 返回列表页:分两种情况处理 if len(driver.window_handles) > 1: # 详情页在新窗口打开:关闭新窗口,切回原列表页 driver.switch_to.window(driver.window_handles[-1]) driver.close() driver.switch_to.window(driver.window_handles[0]) else: # 详情页在当前窗口跳转:点击返回按钮或执行浏览器后退 driver.back() # 等待列表页重新加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".table-row")) ) def download_pdf(driver): # 这里放入你已开发的PDF下载逻辑 download_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, ".download-pdf-btn")) ) download_btn.click() # 可选:等待PDF下载完成(可检查下载目录文件是否存在/大小稳定)
3. 常见问题处理
- Stale Element 错误:分页切换或页面跳转后,之前定位的元素会失效,每次循环必须重新获取元素
- PDF下载等待:避免未完成下载就跳转,可通过监听下载目录的文件状态(如文件大小不再变化)判断完成
- 分页按钮失效判断:如果页面用
disabled属性禁用下一页按钮,可通过next_btn.get_attribute("disabled")判断是否停止循环
优化建议
- 优先使用显式等待(
WebDriverWait)替代硬等待(time.sleep()),提升脚本稳定性 - 如果表格数据量极大,可先爬取所有页的详情页链接,再批量打开下载,减少页面切换的耗时
- 配置自动化工具的默认下载目录,避免文件重名覆盖
内容的提问来源于stack exchange,提问作者Anubhab Mondal
相关产品推荐
相关产品推荐

