如何用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
相关产品推荐
相关产品推荐

