我正在使用 selenium 的 chrome webdriver 打开一个网页,然后将该网页保存到本地驱动器上的文件位置。出于某种原因,脚本 (‘window.print();’) 将打开另存为网页选项,但不会继续单击“打印”并在本地保存文件。JavaScript 似乎永远无法完成并且会超时。
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options import time chrome_options = Options() chrome_options.add_argument("--disable-gpu") pdf_path = "C:\\Test_Data\\output.pdf" driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.google.com") time.sleep(5) driver.set_script_timeout(5) driver.execute_script('window.print();') time.sleep(5) driver.quit()
我尝试增加超时时间,但该过程并未真正完成。
Selenium 和 window.print() 的主要问题在于: window.print() 依赖浏览器 UI 交互完成打印流程,而 Selenium 默认无法直接与打印对话框或系统 UI 进行交互。打印对话框的行为由操作系统和浏览器控制,而不是网页内容或 JavaScript 脚本。
window.print()
要解决这个问题,可以使用以下几种方法来将网页保存为 PDF,而不需要使用 window.print()。
--print-to-pdf
Chrome 提供了一个内置功能,可以直接将网页渲染为 PDF。
代码示例:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless") # 使用无头模式 chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--print-to-pdf") # 将页面保存为 PDF chrome_options.add_argument(f"--print-to-pdf={pdf_path}") # 保存的 PDF 文件路径 driver = webdriver.Chrome(options=chrome_options) try: driver.get("https://www.google.com") finally: driver.quit()
说明: - --print-to-pdf 是一个 Chrome 特有的标志,它会将网页直接保存为 PDF。 - 这种方法无需用户交互,适用于静态页面的直接保存。
使用 Chrome DevTools Protocol(CDP),可以更精确地控制 PDF 的生成过程。
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--disable-gpu") driver = webdriver.Chrome(options=chrome_options) pdf_path = "C:\\Test_Data\\output.pdf" try: driver.get("https://www.google.com") # 通过 DevTools Protocol 执行 PDF 渲染 result = driver.execute_cdp_cmd("Page.printToPDF", { "path": pdf_path, "printBackground": True, "paperWidth": 8.5, "paperHeight": 11.0 }) # 将生成的 PDF 内容保存到文件中 with open(pdf_path, "wb") as file: file.write(result["data"].encode("latin1")) finally: driver.quit()
说明: - Page.printToPDF 是 DevTools Protocol 的一个命令,用于生成网页的 PDF 渲染。 - 可以通过选项设置页面大小、背景颜色等。
Page.printToPDF
pdf_path
printToPDF
通过以上两种方法,你可以轻松地将网页保存为 PDF,而无需通过交互式的打印对话框完成任务。