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

