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

Chrome下Selenium打印时持续弹出保存弹窗,如何实现自动下载?

问题

需要一个运行在Chrome浏览器上的自动打印页面脚本(Firefox无法满足打印输出要求),目前尝试的脚本仍需手动输入文件名,且savefile.default_directory和download.default_directory设置未生效。当前脚本如下:

import json
from selenium import webdriver
def main():
    TMP_DIR = "F:/Downloads"
    printer = "Microsoft Print to PDF"
    options = webdriver.ChromeOptions()
    
    print_settings = {
            "recentDestinations": [{
                "id": printer,
                "origin": "local",
                "account": "",
            }],
            "selectedDestinationId": printer,
            "version": 2,
            "isHeaderFooterEnabled": False,
            "isLandscapeEnabled": True
        }
    
    options.add_argument("--start-maximized")
    options.add_argument('--window-size=1920,1080')
    # options.add_argument("--headless")
    options.add_argument('--enable-print-browser')
    options.add_argument("--kiosk")
    options.add_argument("--kiosk-printing")
    options.add_argument("--safebrowsing-disable-download-protection");
    options.add_argument("--safebrowsing-disable-extension-blacklist");

    options.add_experimental_option("prefs", {
        "printing.print_preview_sticky_settings.appState": json.dumps(print_settings),
        "savefile.default_directory": TMP_DIR,  # Change default directory for downloads
        "download.default_directory": TMP_DIR,  # Change default directory for downloads
        "download.prompt_for_download": False,  # To auto download the file
        "download.directory_upgrade": True,
        "profile.default_content_setting_values.automatic_downloads": 1,
        "safebrowsing.enabled": True
    })

    driver = webdriver.Chrome(executable_path="C:/Users/97252/Downloads/chromedriver-win64/chromedriver-win64/chromedriver.exe", 
                    chrome_options=options)
    
    driver.get("https://www.google.com/")
    driver.execute_script("window.print();")

if __name__ == '__main__':
    main()

环境配置:Chrome/chromedriver 121.0.6167.184、Python 3.9.13、selenium==3.11.0

需求:实现强制自动下载(能设置文件名更佳,当前优先实现自动下载)

解决方案

1. 核心调整方向

  • 升级Selenium版本:旧版3.11.0对Chrome 121兼容性差,部分偏好设置无法正确传递,建议升级到4.x版本
  • 优化打印配置参数:针对Microsoft Print to PDF的特性补充保存路径和自动打印开关
  • 精简无效启动参数:移除对现代Chrome无意义的--enable-print-browser参数

2. 修改后的完整脚本

import json
import os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def main():
    TMP_DIR = "F:/Downloads"
    printer = "Microsoft Print to PDF"
    options = webdriver.ChromeOptions()
    
    # 补充打印配置的自动保存与路径参数
    print_settings = {
        "recentDestinations": [
            {
                "id": printer,
                "origin": "local",
                "account": "",
                "savePath": TMP_DIR
            }
        ],
        "selectedDestinationId": printer,
        "version": 2,
        "isHeaderFooterEnabled": False,
        "isLandscapeEnabled": True,
        "isAutoPrinting": True
    }
    
    options.add_argument("--start-maximized")
    options.add_argument('--window-size=1920,1080')
    # 若需无头模式,使用适配新版Chrome的参数
    # options.add_argument("--headless=new")
    options.add_argument("--kiosk-printing")
    options.add_argument("--safebrowsing-disable-download-protection")
    options.add_argument("--safebrowsing-disable-extension-blacklist")

    options.add_experimental_option("prefs", {
        "printing.print_preview_sticky_settings.appState": json.dumps(print_settings),
        "download.default_directory": TMP_DIR,
        "download.prompt_for_download": False,
        "download.directory_upgrade": True,
        "profile.default_content_setting_values.automatic_downloads": 1,
        "safebrowsing.enabled": True,
        # 强制匹配打印机规则
        "printing.default_destination_selection_rules": {
            "kind": "local",
            "namePattern": printer
        }
    })

    # 使用Selenium 4+的Service类初始化驱动
    service = Service(executable_path="C:/Users/97252/Downloads/chromedriver-win64/chromedriver-win64/chromedriver.exe")
    driver = webdriver.Chrome(service=service, options=options)
    
    driver.get("https://www.google.com/")
    # 等待页面加载完成后执行打印
    WebDriverWait(driver, 10).until(EC.presence_of_element_located(("tag name", "body")))
    driver.execute_script("window.print();")
    
    # 等待打印完成(可根据页面复杂度调整等待时间)
    driver.implicitly_wait(8)
    
    # 可选:自定义文件名(重命名最新下载的PDF)
    def get_latest_file(dir_path):
        files = [os.path.join(dir_path, f) for f in os.listdir(dir_path) if f.endswith('.pdf')]
        return max(files, key=os.path.getctime) if files else None
    
    latest_pdf = get_latest_file(TMP_DIR)
    if latest_pdf:
        new_name = os.path.join(TMP_DIR, "google_print.pdf")
        os.rename(latest_pdf, new_name)
    
    driver.quit()

if __name__ == '__main__':
    main()

3. 关键注意事项

  • 打印机名称匹配:确保printer变量值与系统中"Microsoft Print to PDF"的名称完全一致(可在控制面板-设备和打印机中确认)
  • 权限检查:确认TMP_DIR路径有读写权限,避免因权限不足导致保存失败
  • 无头模式适配:若启用无头模式,必须使用--headless=new参数,旧版--headless会导致打印对话框无法正常处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:23:08