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

如何使用Selenium Python打印弹出窗口中的PDF文档?

问题解决:Selenium定位Chrome PDF打印按钮失败

原代码问题分析

  1. 窗口切换时机过早:未等待新窗口完全加载就直接查找元素,导致元素未渲染完成
  2. 错误使用Select类:Select仅适用于<select>标签,而打印按钮是cr-icon-button,属于按钮元素,不能用该类操作
  3. 无显式等待:直接调用find_element未做等待,无法应对PDF加载的延迟

修正后的完整脚本

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
import time

# 配置Chrome参数,确保PDF在浏览器内置查看器打开
chrome_options = Options()
chrome_options.add_experimental_option("prefs", {
    "download.default_directory": "/tmp",
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "plugins.always_open_pdf_externally": False  # 核心:禁用外部PDF打开,强制用Chrome内置查看器
})
# Linux Mint适配参数
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
# 可选:静默打印配置(直接保存为PDF,无需弹窗)
# chrome_options.add_argument('--kiosk-printing')
# chrome_options.add_experimental_option('prefs', {
#     'printing.print_preview_sticky_settings.appState': """{"recentDestinations":[{"id":"Save as PDF","origin":"local","account":""}],"selectedDestinationId":"Save as PDF","version":2}""",
#     'savefile.default_directory': '/home/your-user/pdf-output'  # 替换为你的保存路径
# })

# 初始化驱动
driver = webdriver.Chrome(options=chrome_options)
driver.maximize_window()

# -------------------
# 此处添加触发PDF弹出的代码
# 示例:driver.get("目标页面URL")
# 示例:driver.find_element(By.XPATH, "//a[text()='打开PDF']").click()
# -------------------

# 等待新窗口出现并切换
WebDriverWait(driver, 20).until(lambda d: len(d.window_handles) > 1)
original_window = driver.current_window_handle
for handle in driver.window_handles:
    if handle != original_window:
        driver.switch_to.window(handle)
        break

# 等待PDF加载完成,定位并点击打印按钮
try:
    # 显式等待打印按钮可点击
    print_btn = WebDriverWait(driver, 30).until(
        EC.element_to_be_clickable((By.ID, "print"))
    )
    print_btn.click()
    print("打印按钮已触发")

    # 若未配置静默打印,需模拟系统对话框操作(需安装pyautogui:pip install pyautogui)
    # import pyautogui
    # time.sleep(2)  # 等待打印对话框弹出
    # pyautogui.press('enter')  # 按回车确认打印

except Exception as e:
    print(f"操作失败: {str(e)}")
finally:
    # 清理操作
    driver.close()
    driver.switch_to.window(original_window)
    driver.quit()

关键优化点

  1. 窗口切换等待:用WebDriverWait等待新窗口出现,避免切换到未加载完成的窗口
  2. 显式元素等待:最长等待30秒确保打印按钮渲染完成,彻底解决NoSuchElementException
  3. Chrome参数配置:强制PDF在内置查看器打开,避免下载后处理本地文件的复杂度
  4. 系统对话框处理:提供两种方案——静默打印直接保存为PDF,或用pyautogui模拟按键操作系统打印对话框

内容的提问来源于stack exchange,提问作者Omar Morales Rivera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 08:45:37