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

如何使用Selenium在下载文件时自定义文件名?

解决方案:Selenium下载文件时自定义文件名

通常Selenium无法直接在下载请求阶段修改服务器返回的随机文件名,但可以通过两种可靠方式实现自定义文件名:

方法1:下载后立即重命名文件

这是通用且兼容性最好的方案,核心逻辑是:

  • 固定浏览器下载目录,避免文件分散
  • 触发下载后,等待文件完成下载
  • 将随机文件名的文件重命名为自定义名称

示例代码(Chrome浏览器)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os
import time

# 设置自定义下载目录
download_dir = os.path.abspath("receipt_downloads")
os.makedirs(download_dir, exist_ok=True)

# 配置Chrome下载选项
chrome_options = Options()
chrome_options.add_experimental_option("prefs", {
    "download.default_directory": download_dir,
    "download.prompt_for_download": False,  # 关闭下载确认弹窗
    "download.directory_upgrade": True,
    "safebrowsing.enabled": True
})

# 启动浏览器
driver = webdriver.Chrome(options=chrome_options)

# 替换为你的实际下载操作
driver.get("your_receipt_download_page_url")
download_button = driver.find_element("xpath", "//button[contains(text(), '下载收据')]")
download_button.click()

# 等待文件下载完成(生产环境建议替换为更精确的文件检测逻辑)
def wait_for_download_completed(download_dir, timeout=30):
    start_time = time.time()
    while time.time() - start_time < timeout:
        # 排除Chrome下载临时文件(后缀为.crdownload)
        completed_files = [f for f in os.listdir(download_dir) if not f.endswith(".crdownload")]
        if completed_files:
            return completed_files[-1]
        time.sleep(1)
    raise TimeoutError("文件下载超时")

latest_file = wait_for_download_completed(download_dir)
old_file_path = os.path.join(download_dir, latest_file)

# 自定义文件名(可根据业务动态生成,比如订单号、日期)
new_file_name = f"receipt_{time.strftime('%Y%m%d')}_order12345.pdf"
new_file_path = os.path.join(download_dir, new_file_name)

# 重命名文件
os.rename(old_file_path, new_file_path)

driver.quit()

方法2:通过浏览器偏好设置指定固定文件名(限部分场景)

如果需要固定文件名,且下载文件的MIME类型明确,可通过浏览器偏好直接设置保存名称,但仅支持固定值,无法动态生成:

示例代码(Firefox浏览器)

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
import os

download_dir = os.path.abspath("receipt_downloads")
os.makedirs(download_dir, exist_ok=True)

firefox_options = Options()
firefox_options.set_preference("browser.download.folderList", 2)
firefox_options.set_preference("browser.download.dir", download_dir)
firefox_options.set_preference("browser.download.manager.showWhenStarting", False)
# 指定PDF类型文件直接下载,不弹窗
firefox_options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf")
# 设置固定保存文件名
firefox_options.set_preference("browser.download.saveAsFilename", "通用收据.pdf")

driver = webdriver.Firefox(options=firefox_options)
# 执行下载操作...
driver.quit()

注意事项

  • 优先选择方法1,支持动态生成文件名,适配所有浏览器
  • 确保下载目录有读写权限,避免重命名失败
  • 生产环境中避免使用固定time.sleep(),改用文件状态检测逻辑更稳定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:31:07