使用SeleniumBase下载文件遇阻:如何确保下载完成再关闭浏览器?
确认文件下载完成的几种可靠方案
针对你用SeleniumBase处理JS渲染站点下载的场景,以下几种方法可以有效确保文件完成下载后再执行后续操作:
方法1:监控下载目录的文件状态(最通用)
Chrome下载文件时,会先创建带.crdownload后缀的临时文件,下载完成后会自动移除该后缀。通过监控目标目录下的文件变化,就能判断下载是否完成。
修改你的代码,替换# add wait for download部分:
import os import time # 设置超时时间(秒) download_timeout = 60 start_time = time.time() download_completed = False while time.time() - start_time < download_timeout: # 遍历下载目录下的文件 for filename in os.listdir(downloads_folder): # 过滤掉临时下载文件和非Excel文件 if filename.endswith(".xlsx") and not filename.endswith(".crdownload"): download_completed = True break if download_completed: break time.sleep(1) if not download_completed: raise TimeoutError("文件下载超时")
方法2:利用Chrome DevTools监听下载请求
通过CDP命令监听Network事件,捕获下载请求的完成状态:
import time # 设置超时时间(秒) download_timeout = 60 download_completed = False download_url = None def handle_download(event): nonlocal download_url # 捕获下载请求的响应 if "response" in event and "url" in event["response"]: # 判断是否为Excel类型的响应 if event["response"]["mimeType"] == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": download_url = event["response"]["url"] # 注册Network.responseReceived事件监听 driver.add_cdp_listener("Network.responseReceived", handle_download) # 点击下载按钮 driver.click('button:contains("Excel export (max 50 000 rows)")') # 等待下载请求完成并配合文件监控 start_time = time.time() while time.time() - start_time < download_timeout: if download_url: for filename in os.listdir(downloads_folder): if filename.endswith(".xlsx") and not filename.endswith(".crdownload"): download_completed = True break if download_completed: break time.sleep(1) # 移除监听 driver.remove_cdp_listener("Network.responseReceived", handle_download) if not download_completed: raise TimeoutError("文件下载超时")
方法3:等待页面交互反馈(如果站点有提示)
如果点击下载后,页面有按钮状态变化(比如变成"下载中"或不可点击),或者出现下载完成的提示框,可以直接等待这些元素:
# 等待下载按钮变为不可点击(需根据实际页面调整选择器) driver.wait_for_element_not_clickable('button:contains("Excel export (max 50 000 rows)")', timeout=60) # 或者等待下载完成提示出现 driver.wait_for_element('div:contains("下载完成")', timeout=60)
注意事项
- 确保
downloads_folder是绝对路径,避免路径解析问题,比如改成C:\\Users\\YourName\\Downloads或者/home/yourname/Downloads - 超时时间根据文件大小调整,大文件适当延长
- 如果遇到同名文件,Chrome会自动添加
(1)后缀,代码中可以用模糊匹配(比如if ".xlsx" in filename and ".crdownload" not in filename)
内容的提问来源于stack exchange,提问作者Øyvind Hagen
相关产品推荐
相关产品推荐

