如何使用 Selenium 生成 PDF

在本文中,我们介绍了何使用 Selenium 4 的print() 方法从网页生成 PDF 文件。我们通过在 Chrome 和 Firefox 上尝试print()演示在不同平台上实现相同功能的能力。

此外,我们还探索可通过PrintOptions 类提供的自定义选项,该选项允许定制输出 PDF 文档以满足特定要求。

在本教程中,我们将探讨如何使用Selenium 4 的ChromeDriver类中提供的print()方法从网页生成 PDF 文件。print ()方法提供了一种将网页内容直接捕获到 PDF 文件的简单方法。

我们将介绍如何使用 Chrome 和 Firefox 浏览器生成 PDF,并演示如何使用PrintOptions类自定义 PDF 输出。这包括调整方向、页面大小、比例和边距等参数,以使 PDF 符合特定要求。

此外,我们的实际示例将涉及使用 Java 和JUnit 测试打印网页内容。

设置和配置
配置环境需要两个依赖项:Selenium Java和WebDriverManager。Selenium Java 提供了必要的自动化框架,以便以编程方式与 Web 浏览器交互并对其进行控制。

WebDriverManager 通过自动处理浏览器驱动程序的下载和配置来简化浏览器驱动程序的管理。此设置对于顺利执行我们的自动化测试和 Web 交互至关重要。

让我们添加 Maven 依赖项:

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.23.1</version>
</dependency>
<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>5.8.0</version>
<dependency>

使用 Chrome 和 Selenium 生成 PDF
在本节中,我们将展示如何使用 Chrome 中的 Selenium WebDriver 将网页转换为 PDF 文件。我们的目标是捕获Baeldung 的 Java 每周更新的内容并将其保存为 PDF 文档。

让我们编写一个 JUnit 测试来在项目的根目录中创建一个名为Baeldung_Weekly.pdf的 PDF 文件:

@Test
public void whenNavigatingToBaeldung_thenPDFIsGenerated() throws IOException {
    ChromeDriver driver = new ChromeDriver();
    driver.get("https://www.baeldung.com/library/java-web-weekly");
    Pdf pdf = driver.print(new PrintOptions());
    byte[] pdfContent = Base64.getDecoder().decode(pdf.getContent());
    Files.write(Paths.get(
"./Baeldung_Weekly.pdf"), pdfContent);
    assertTrue(Files.exists(Paths.get(
"./Baeldung_Weekly.pdf")), "PDF file should be created");
    driver.quit();
}

运行测试后,ChromeDriver打开网页并使用print() 方法创建 PDF。系统解码 Base64 编码的 PDF 并将其保存为Baeldung_Weekly.pdf。然后检查文件是否存在以确认成功生成 PDF。最后,使用 driver.quit ()方法关闭浏览器。关闭浏览器始终很重要,以确保没有资源被挂起。

此外,即使 Chrome 在无头模式(即浏览器无需 GUI 即可运行的模式)下运行,print()方法也能无缝运行。

我们可以使用options.addArguments(“–headless”)方法启用无头模式, 以在没有 GUI 的情况下在后台运行浏览器:

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver driver = new ChromeDriver(options);

使用 Firefox 和 Selenium 生成 PDF
Firefox 浏览器也支持 print() 方法。让我们探索如何使用 Firefox 和 Selenium WebDriver 自动生成 PDF。与以前一样,目标是捕获 URL 中提供的页面并使用 Firefox 将其保存为 PDF 文档。

让我们编写一个 JUnit 测试来 在项目当前目录中生成一个名为Firefox_Weekly.pdf的 PDF 文件:

@Test
public void whenNavigatingToBaeldungWithFirefox_thenPDFIsGenerated() throws IOException {
    FirefoxDriver driver = new FirefoxDriver(new FirefoxOptions());
    driver.get("https://www.baeldung.com/library/java-web-weekly");
    Pdf pdf = driver.print(new PrintOptions());
    byte[] pdfContent = Base64.getDecoder().decode(pdf.getContent());
    Files.write(Paths.get(
"./Firefox_Weekly.pdf"), pdfContent);
    assertTrue(Files.exists(Paths.get(
"./Firefox_Weekly.pdf")), "PDF file should be created");
    driver.quit();
}

测试执行后,启动 FirefoxDriver,打开并导航到指定的网址。然后print()方法从网页生成 PDF。系统将生成的 PDF 编码为 Base64,解码为二进制格式,并将其存储为Firefox_Weekly.pdf。

测试通过检查 PDF 是否在文件系统中存在来确认 PDF 的创建。此验证确保我们使用 Firefox 浏览器从网页成功生成 PDF 文件。

使用PrintOptions自定义 PDF 输出
使用print()方法时,我们可以决定输出 PDF 文档的外观。在本节中,我们将了解如何通过使用PrintOptions类自定义 PDF 输出来增强 Selenium WebDriver 中print()方法的功能。

PrintOptions类是 Selenium API 的一部分,允许在将网页呈现为 PDF 时对其进行详细调整。让我们了解一下PrintOptions提供的众多选项中的几个:方向、页面大小、比例和边距:

PrintOptions options = new PrintOptions();
        
options.setOrientation(PrintOptions.Orientation.LANDSCAPE);
options.setScale(1.5);
options.setPageSize(new PageSize(100, 100));
options.setPageMargin(new PageMargin(2, 2, 2, 2));
Pdf pdf = driver.print(options);

在代码片段中,PrintOptions类自定义了print()方法生成的 PDF 输出。setOrientation ()设置页面方向,setScale()调整内容大小,setPageSize()指定自定义页面大小,setPageMargin()定义每边的边距。