Java使用playwright实现一个简单的截图功能

playwright的简介

Playwright是一款跨浏览器自动化测试工具,由Microsoft推出。它支持Chrome、Firefox和Safari等主流浏览器。可以轻松地编写自动化测试用例,可以模拟用户在浏览器中的操作,如点击、输入、滚动、截图等功能。

在公司刚好开发一个截图功能,playwright就有了用武之地。
代码如下,实现截长图,并且转换为pdf格式文件。
本地使用没什么问题,但在线上环境使用,要注意这个组件需要一些浏览器依赖,如果是docker等部署,安装可能会遇到问题。

在转换为pdf格式文件用到了itextpdf组件,saveAsPdf方法主要是将长图转为pdf,如果不需要可以去掉相关代码。

package com.xxx.xxx.util;

import cn.hutool.core.io.FileUtil;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfWriter;
import com.microsoft.playwright.Browser;
import com.microsoft.playwright.ElementHandle;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;
import com.microsoft.playwright.options.BoundingBox;

import java.io.File;
import java.io.FileOutputStream;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class ScreenshotUtil {

    /**
     * 通过url截长图
     * @param webUrl
     */
    public static String getScreenshotByUrl(String webUrl,String id,String pdfPath) throws Exception {
        String pdfUrl = "";
        String imagePath = "outputPng" + id + ".png";
        try (Playwright playwright = Playwright.create()) {
            Browser browser = playwright.chromium().launch();
            Page page = browser.newPage();
            page.navigate(webUrl);
            page.waitForLoadState();
            // 获取要截图的元素   前端的class元素自己调整
            ElementHandle element = page.querySelector(".hello");
            // 获取元素的位置和大小
            BoundingBox boundingBox = element.boundingBox();
            int viewportWidth = page.viewportSize().width;
            int viewportHeight = page.viewportSize().height;
            // 计算需要滚动的距离
            int scrollHeight = (int) Math.ceil((double) boundingBox.height / viewportHeight) * viewportHeight;
            int scrollWidth = (int) Math.ceil((double) boundingBox.width / viewportWidth) * viewportWidth;
            // 设置视口大小,确保能够完整显示元素
            page.setViewportSize(scrollWidth, scrollHeight);
            // 滚动页面使元素处于可见区域
            int currentScrollHeight = 0;
            while (currentScrollHeight < scrollHeight) {
                String script = String.format("window.scrollBy(0, %s)", viewportHeight);
                page.evaluate(script, scrollHeight - currentScrollHeight);
                currentScrollHeight += viewportHeight;
                page.waitForTimeout(200); // 等待滚动完成,可以根据具体情况调整等待时间
            }
            // 截图并保存为文件
            byte[] screenshotData =  page.screenshot(new Page.ScreenshotOptions().setPath(Paths.get(imagePath)));
            browser.close();
            //截图转为生成pdf文件
            pdfUrl = saveAsPdf(screenshotData,pdfPath);
            String fullImagePath = System.getProperty("user.dir")+"/"+imagePath;
            if(FileUtil.isFile(fullImagePath)){
                FileUtil.del(fullImagePath);
            }
        }
        return pdfUrl;
    }

    /**
     * 长截图字节数组数据转为pdf文件
     * @param screenshotData
     * @param outputFilePath
     * @throws Exception
     */
    public static String saveAsPdf(byte[] screenshotData, String outputFilePath) throws Exception {
        String pdfUrl = "";
        // 创建Document对象
        Document document = new Document();
        // 创建PdfWriter对象
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outputFilePath));
        // 打开文档
        document.open();
        // 分页处理长图
        int pageWidth = 595; // 页面宽度,单位为磅,A4纸宽度为595磅
        int pageHeight = 842; // 页面高度,单位为磅,A4纸高度为842磅
        // 设置页面边距
        document.setMargins(0, 0, 0, 0);
        // 获取截图的宽高
        Image fullImage = Image.getInstance(screenshotData);
        // 调整图片大小适应页面
        fullImage.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight());
        int imageWidth = (int) fullImage.getWidth();
        int imageHeight = (int) fullImage.getHeight();
        // 计算需要分页的数量
        int pageCount = (int) Math.ceil((double) imageHeight / pageHeight);
        // 分页转换为多页PDF
        for (int pageNumber = 0; pageNumber < pageCount; pageNumber++) {
            // 创建新页
            document.newPage();
            // 计算当前页的高度
            int currentPageHeight = Math.min(imageHeight - pageNumber * pageHeight, pageHeight);
            // 计算裁剪区域
            Rectangle cropRegion = new Rectangle(0, pageNumber * pageHeight, imageWidth, currentPageHeight);
            // 裁剪图片
            Image croppedImage = Image.getInstance(fullImage);
            croppedImage.setAbsolutePosition(-cropRegion.getLeft(), -(cropRegion.getBottom()));
            croppedImage.scaleToFit(cropRegion.getWidth(), cropRegion.getHeight());
            // 添加Image对象到Document
            document.add(croppedImage);
        }
        // 关闭文档
        document.close();
        return pdfUrl;
    }

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 建议使用以下步骤来编写一个使用playwright-java的demo:1. 添加playwright-java的依赖;2. 创建一个playwright实例;3. 选择一个浏览器;4. 创建一个浏览器上下文;5. 在上下文中打开一个新页面;6. 在页面上执行你想要做的任务;7. 关闭页面和浏览器上下文;8. 关闭playwright实例。 ### 回答2: Playwright-Java是一款用于自动化测试Web应用的框架,它提供了丰富的API和方法来模拟用户在浏览器中的操作。下面是一个使用Playwright-Java编写的示例代码: ```java import com.microsoft.playwright.*; public class PlaywrightDemo { public static void main(String[] args) { try (Playwright playwright = Playwright.create()) { Browser browser = playwright.chromium().launch(); BrowserContext context = browser.newContext(); Page page = context.newPage(); page.navigate("https://www.example.com/"); page.waitForLoadState(); page.click("a#link"); page.waitForLoadState(); System.out.println("Current Page Title: " + page.title()); String pageTitle = page.evaluate("document.title"); System.out.println("Page Title using JavaScript: " + pageTitle); browser.close(); } } } ``` 在这个示例中,我们首先使用 `Playwright.create()` 来创建一个Playwright实例,然后使用 `playwright.chromium().launch()` 启动一个Chromium浏览器实例。 接下来,我们使用 `browser.newContext()` 创建一个BrowserContext,它可以看作是一个浏览器的实例,然后使用 `context.newPage()` 创建一个Page对象,表示一个具体的浏览器页面。 我们使用 `page.navigate()` 方法加载一个网页,并使用 `page.waitForLoadState()` 等待页面加载完成。然后,我们使用 `page.click()` 方法点击页面上的一个链接,并再次使用 `page.waitForLoadState()` 等待链接页面加载完成。 接下来,我们打印出当前页面的标题,使用 `page.title()` 方法。然后,我们使用 `page.evaluate()` 方法执行JavaScript代码,获取页面标题,并打印出来。 最后,我们使用 `browser.close()` 关闭浏览器实例。 这只是Playwright-Java一个简单示例,它演示了如何使用Playwright-Java来自动化测试一个Web应用。使用Playwright-Java,你可以执行更多复杂的操作,如表单交互、页面滚动、鼠标操作等。希望这个示例对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值