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

使用Selenium Chrome Driver无头模式打印PDF遇问题

Chrome无头模式下Selenium无法打印PDF的解决方法

问题场景

非无头模式下使用Selenium打印PDF完全正常,但启用无头模式后就无法完成打印。开发带GUI的应用时需要隐藏浏览器窗口,当前环境为Selenium 4.2.0 + Python 3.9,原代码如下:

import os
from os.path import exists
import json
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver import Chrome, ChromeOptions

# Paths
dir_path = os.getcwd()
download_path = os.path.join(dir_path, "letters")
chrome_path = os.path.join(dir_path, "chromium\\app\\Chrome-bin\\chrome.exe")
user_data_path = os.path.join(dir_path, "sessions")

website = "https://www.google.com/"


def main():
    print_settings = {
        "recentDestinations": [{
            "id": "Save as PDF",
            "origin": "local",
            "account": "",
        }],
        "selectedDestinationId": "Save as PDF",
        "version": 2,
        "isHeaderFooterEnabled": False,
        "isLandscapeEnabled": True
    }

    options = ChromeOptions()
    options.binary_location = chrome_path
    options.add_argument("--start-maximized")
    options.add_argument('--window-size=1920,1080')
    options.add_argument(f"user-data-dir={user_data_path}")
    options.add_argument("--headless")
    options.add_argument('--enable-print-browser')
    options.add_experimental_option("prefs", {
        "printing.print_preview_sticky_settings.appState": json.dumps(print_settings),
        "savefile.default_directory": download_path,  # Change default directory for downloads
        "download.default_directory": download_path,  # 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
    })
    options.add_argument("--kiosk-printing")

    driver = Chrome(service=Service(ChromeDriverManager().install()), options=options)
    driver.get(website)
    driver.execute_script("window.print();")

    if exists(os.path.join(user_data_path, "Google.pdf")):
        print("YAY!")
    else:
        print(":(")


if __name__ == '__main__':
    main()

解决思路与修改方案

问题核心在于Chrome旧版无头模式的兼容性缺陷,以及代码中的路径、等待逻辑问题,调整方案如下:

  • 替换旧版--headless参数为--headless=new:新版无头模式行为更接近正常浏览器,修复了打印、下载相关的兼容性问题
  • 修正文件检查路径:原代码设置下载目录为download_path,但检查的却是user_data_path下的文件,路径不匹配
  • 添加等待逻辑:PDF生成是异步操作,直接检查会因文件未生成导致判断错误
  • 移除无效参数:--enable-print-browser并非必要参数,可移除优化配置
  • 确保下载目录存在:避免因目录不存在导致PDF保存失败

修改后的完整代码

import os
import time
from os.path import exists
import json
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver import Chrome, ChromeOptions

# Paths
dir_path = os.getcwd()
download_path = os.path.join(dir_path, "letters")
chrome_path = os.path.join(dir_path, "chromium\\app\\Chrome-bin\\chrome.exe")
user_data_path = os.path.join(dir_path, "sessions")

# 确保下载目录存在,避免保存失败
os.makedirs(download_path, exist_ok=True)

website = "https://www.google.com/"


def main():
    print_settings = {
        "recentDestinations": [{
            "id": "Save as PDF",
            "origin": "local",
            "account": "",
        }],
        "selectedDestinationId": "Save as PDF",
        "version": 2,
        "isHeaderFooterEnabled": False,
        "isLandscapeEnabled": True
    }

    options = ChromeOptions()
    options.binary_location = chrome_path
    options.add_argument('--window-size=1920,1080')
    options.add_argument(f"user-data-dir={user_data_path}")
    # 使用Chrome新版无头模式,兼容性更好
    options.add_argument("--headless=new")
    options.add_experimental_option("prefs", {
        "printing.print_preview_sticky_settings.appState": json.dumps(print_settings),
        "savefile.default_directory": download_path,
        "download.default_directory": download_path,
        "download.prompt_for_download": False,
        "download.directory_upgrade": True,
        "profile.default_content_setting_values.automatic_downloads": 1,
        "safebrowsing.enabled": True
    })
    options.add_argument("--kiosk-printing")

    driver = Chrome(service=Service(ChromeDriverManager().install()), options=options)
    driver.get(website)
    driver.execute_script("window.print();")

    # 等待PDF生成,可根据页面复杂度调整等待时长
    time.sleep(3)
    
    # 检查下载目录下的目标PDF文件
    pdf_file_path = os.path.join(download_path, "Google.pdf")
    if exists(pdf_file_path):
        print("YAY!")
    else:
        print(":(")
    
    # 关闭浏览器,释放资源
    driver.quit()


if __name__ == '__main__':
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:35:29