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

使用Selenium ChromeDriver点击下载按钮后文件未下载的问题排查

Selenium ChromeDriver 文件未下载到指定目录的排查与解决

可能的原因及对应解决方案

1. 自定义Chrome配置文件覆盖了下载设置

你加载了已有的Chrome用户配置文件(user-data-dir和--profile-directory),此时Chrome会优先使用该配置文件中保存的下载路径,而非代码里设置的prefs。

解决方法:

  • 方案一:移除自定义配置文件参数,使用全新的临时Chrome实例:
    # 注释掉这两行配置文件相关代码
    # chrome_options.add_argument(r"user-data-dir=C:\Users\YourUser\AppData\Local\Google\Chrome\User Data")
    # chrome_options.add_argument("--profile-directory=ProfileName")
    
  • 方案二:手动修改你正在使用的Chrome配置文件的默认下载路径,使其与代码中的路径一致;
  • 方案三:创建一个专门用于自动化脚本的新Chrome配置文件,预先设置好目标下载路径。

2. 下载路径格式或权限问题

Windows系统下路径格式可能存在兼容性问题,同时目标目录需要有写入权限。

解决方法:

  • 将路径改为双反斜杠格式或原始字符串,避免转义问题:
    prefs = {
        "download.default_directory": r"C:\Users\timit\Downloads",  # 原始字符串写法
        # 也可以写成 "C:\\Users\\timit\\Downloads"
        "download.prompt_for_download": False,
        "download.directory_upgrade": True,
        "safebrowsing.enabled": False  # 尝试关闭安全浏览,避免拦截下载
    }
    
  • 确认C:\Users\timit\Downloads目录存在,且当前运行脚本的用户拥有该目录的写入权限。

3. 文件类型被Chrome安全策略拦截

某些文件类型(如压缩包、可执行文件)可能被Chrome的安全浏览功能拦截,导致下载无法触发或完成。

解决方法:

  • 在prefs中添加允许自动下载的配置,例如:
    prefs = {
        # 保留原有设置...
        "safebrowsing.enabled": False,
        "download.extensions_to_open": "",  # 不自动打开任何文件,直接下载
        "plugins.always_open_pdf_externally": True  # 如果是PDF文件,强制下载而非打开
    }
    

4. 下载等待逻辑不可靠

time.sleep(10)是固定等待,可能不足以完成下载,甚至可能下载还没触发就提前关闭了浏览器。

解决方法:

  • 编写代码监听下载目录,等待新文件出现并确认下载完成(文件大小不再变化):
    import os
    import time
    
    def wait_for_download(download_dir, timeout=60):
        start_time = time.time()
        initial_files = set(os.listdir(download_dir))
        while time.time() - start_time < timeout:
            current_files = set(os.listdir(download_dir))
            new_files = current_files - initial_files
            if new_files:
                # 等待文件下载完成(大小稳定)
                for file in new_files:
                    file_path = os.path.join(download_dir, file)
                    prev_size = -1
                    while prev_size != os.path.getsize(file_path):
                        prev_size = os.path.getsize(file_path)
                        time.sleep(1)
                return True
            time.sleep(1)
        return False
    
    # 点击下载按钮后调用该函数
    if wait_for_download(r"C:\Users\timit\Downloads"):
        print("下载完成")
    else:
        print("下载超时")
    

5. 会话或页面跳转问题

点击下载按钮后,可能打开了新标签页、弹窗,或者需要额外的请求验证,导致下载请求未正确发送。

解决方法:

  • 检查点击下载按钮后是否有新窗口打开,切换到对应窗口:
    # 点击下载按钮前记录主窗口句柄
    main_window = driver.current_window_handle
    # 点击下载按钮
    WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//*[@id="rakkeszw_footer"]/table/tbody/tr/td/input'))
    ).click()
    # 切换到新窗口(如果存在)
    for window in driver.window_handles:
        if window != main_window:
            driver.switch_to.window(window)
            break
    
  • 开启网络日志查看下载请求是否发送:
    chrome_options.set_capability("goog:loggingPrefs", {"performance": "ALL"})
    # 点击下载后获取并打印网络日志
    logs = driver.get_log("performance")
    for log in logs:
        if "download" in log["message"]:
            print(log["message"])
    

6. ChromeDriver与Chrome版本不匹配

即使使用了WebDriverManager,偶尔也会出现版本不匹配的情况,导致部分功能异常。

解决方法:

  • 手动检查Chrome版本(Chrome菜单→帮助→关于Google Chrome),下载对应版本的ChromeDriver替换WebDriverManager安装的版本;
  • 强制指定ChromeDriver版本:
    driver = webdriver.Chrome(service=Service(ChromeDriverManager(version="120.0.6099.109").install()), options=chrome_options)
    

额外排查步骤

  • 手动操作一次下载流程,确认是否有隐藏的弹窗(如“保存位置确认”“文件覆盖提示”),这些弹窗可能在自动化中被忽略;
  • 检查浏览器的下载历史,确认文件是否被下载到了其他路径;
  • 查看服务器返回的响应,确认下载链接是否有效,是否需要携带特定的Cookie或请求头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:57:15