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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 00:02:54