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

如何通过Selenium模拟打印快捷键保存并命名PDF文件

问题:Selenium触发打印后无法保存PDF,按下Enter程序停止运行

我用Selenium从网站保存PDF,已经成功定位并触发打印按钮,但点击后无法保存文档。尝试切换窗口句柄、用ActionChains发送Enter键,执行代码后按下Enter程序就停止,没实现保存PDF的效果,求解决。

我的代码:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains


webdriver_path = "D:/chromedriver-win64/chromedriver.exe"
service = Service(webdriver_path)
driver = webdriver.Chrome(service=service)
driver.maximize_window()
actions = ActionChains(driver)
url = "https://web.bcpa.net/BcpaClient/#/Record-Search"
driver.get(url)
driver.implicitly_wait(10)
text_input = driver.find_element(By.XPATH, '//input[@class="form-control"]').send_keys("2216 NW 6 PL FORT LAUDERDALE, FL 33311")
driver.implicitly_wait(10)
search_button = driver.find_element(By.XPATH, '//span[@class="input-group-addon"]/span[@class="glyphicon glyphicon-search"]').click()
    
driver.implicitly_wait(10)
printer_click = driver.find_element(By.XPATH, '//div[@class="col-sm-1  btn-printrecinfo"]').click()
driver.implicitly_wait(15)
all_handles =  driver.window_handles
driver.switch_to.window(all_handles[1])
actions.send_keys(Keys.ENTER)

问题分析

  1. ActionChains未执行perform():代码中调用了actions.send_keys(Keys.ENTER)但没执行perform()方法,导致按键操作根本没触发。
  2. 错误切换窗口句柄:Chrome的打印对话框是系统级弹窗,不属于浏览器标签页窗口,切换window_handles完全无效,因为all_handles仅包含浏览器标签页的句柄。
  3. 隐式等待滥用:重复调用driver.implicitly_wait()没必要,隐式等待是全局设置,初始化时设置一次即可。
  4. 系统对话框难以控制:Selenium本身无法直接操作系统级的打印/保存对话框,依赖模拟按键容易出现兼容性问题。

解决方案

推荐直接配置Chrome浏览器的打印选项,让它自动将打印内容保存为PDF,跳过手动操作对话框的步骤,这是最稳定的方案:

步骤1:配置Chrome选项

设置打印相关偏好,指定默认保存路径、自动保存不弹窗等。

步骤2:替换触发打印的逻辑

用Chrome命令直接触发打印并保存,确保页面加载完成后执行操作。

修正后的完整代码:

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
from selenium.webdriver.common.by import By
import json

webdriver_path = "D:/chromedriver-win64/chromedriver.exe"
service = Service(webdriver_path)

# 配置Chrome自动保存PDF的选项
chrome_options = webdriver.ChromeOptions()
prefs = {
    "printing.print_preview_sticky_settings.appState": json.dumps({
        "recentDestinations": [{
            "id": "Save as PDF",
            "origin": "local",
            "account": ""
        }],
        "selectedDestinationId": "Save as PDF",
        "version": 2
    }),
    "savefile.default_directory": "D:/your_save_path",  # 替换为你的PDF保存路径
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "plugins.always_open_pdf_externally": False
}
chrome_options.add_experimental_option("prefs", prefs)
chrome_options.add_argument("--kiosk-printing")  # 启用 kiosk 模式,自动打印不弹窗

driver = webdriver.Chrome(service=service, options=chrome_options)
driver.maximize_window()
driver.implicitly_wait(10)  # 全局隐式等待,只需设置一次

url = "https://web.bcpa.net/BcpaClient/#/Record-Search"
driver.get(url)

# 输入地址并搜索(用显式等待确保元素加载完成)
text_input = WebDriverWait(driver, 15).until(
    EC.presence_of_element_located((By.XPATH, '//input[@class="form-control"]'))
)
text_input.send_keys("2216 NW 6 PL FORT LAUDERDALE, FL 33311")

search_button = WebDriverWait(driver, 15).until(
    EC.element_to_be_clickable((By.XPATH, '//span[@class="input-group-addon"]/span[@class="glyphicon glyphicon-search"]'))
)
search_button.click()

# 等待打印按钮可点击并触发
printer_button = WebDriverWait(driver, 15).until(
    EC.element_to_be_clickable((By.XPATH, '//div[@class="col-sm-1  btn-printrecinfo"]'))
)
printer_button.click()

# 等待PDF保存完成(根据实际情况调整等待时间)
driver.implicitly_wait(20)

driver.quit()

补充说明

  • 将"D:/your_save_path"替换为你实际的PDF保存文件夹路径。
  • --kiosk-printing参数会让Chrome直接执行打印操作,不弹出预览对话框,配合偏好设置自动保存PDF到指定路径。
  • 显式等待(WebDriverWait)比隐式等待更可靠,能确保元素加载完成后再操作,避免页面加载慢导致的元素未找到问题。

如果一定要用模拟按键的方式(不推荐,兼容性差),需修正ActionChains代码,且注意打印对话框是系统窗口,可能需要额外工具(如pyautogui)辅助,但稳定性极低:

# 仅作参考的按键触发代码
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time

# 触发打印按钮后等待对话框弹出
time.sleep(3)
actions = ActionChains(driver)
actions.send_keys(Keys.ENTER).perform()  # 必须调用perform()执行操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:57:06