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

