使用Selenium Python下载文件失败:代码正常运行但无文件下载
问题排查与修复方案
以下是导致文件无法下载的核心问题及对应修复:
1. 转义字符错误导致headless下载配置失效
enable_download_headless函数中使用了不必要的引号转义([\"send_command\"]和\"send_command\"),导致命令注册失败,headless模式下的下载行为设置未生效。
2. Headless模式缺少必要参数
部分Chrome版本在headless模式下必须添加--disable-gpu参数,才能正常启用下载功能。
3. 未确保下载目录存在
如果指定的下载目录C:/Users/USER/Desktop/Stats不存在,Chrome不会自动创建目录,直接导致下载失败。
4. 等待机制不够可靠
依赖time.sleep()可能导致元素未完全就绪就执行操作,建议用显式等待替代,提升稳定性。
修复后的完整代码
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import os url = 'http://demo.automationtesting.in/FileDownload.html' download_dir = 'C:/Users/USER/Desktop/Stats' # 确保下载目录存在,不存在则创建 if not os.path.exists(download_dir): os.makedirs(download_dir) options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--disable-gpu') # 新增headless模式必要参数 options.add_experimental_option('prefs',{ 'download.default_directory': download_dir, 'download.prompt_for_download': False, 'safebrowsing_for_trusted_sources_enabled': False, 'download.directory_upgrade': True, 'safebrowsing.enabled': False }) def enable_download_headless(browser, download_dir): # 移除不必要的引号转义 browser.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command') params = {'cmd':'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': download_dir}} browser.execute("send_command", params) browser = webdriver.Chrome(options=options) enable_download_headless(browser, download_dir) browser.get(url) # 显式等待文本框加载完成 textbox = WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.XPATH, '//*[@id="textbox"]')) ) textbox.send_keys('Hello World') # 点击创建文本按钮 create_btn = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="createTxt"]')) ) create_btn.click() # 等待下载链接生成并可点击 download_link = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="link-to-download"]')) ) download_link.click() # 等待文件下载完成(可根据文件大小调整时长) time.sleep(3) browser.quit()
内容的提问来源于stack exchange,提问作者Cinedine Amyzene
相关产品推荐
相关产品推荐

