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

