前言
最近在搞获取网页截图,因为之前都是使用js来实现特别简单,但是因为halo插件的问题必须要用到java开发,所以浅浅的学习记录一下
Playwright简介
Playwright 是由Microsoft开发的跨浏览器自动化测试工具,支持:
Chromium/Chrome
Firefox
WebKit(Safari)
多语言支持(Java/Python/C#/JS)
核心优势:
自动等待元素加载
网络请求拦截
文件下载管理
设备模拟功能
最佳实践
我开发环境为JDK17+Spring Webflux+mysql+redis,如下简单介绍如何获取网站截图
如何获取到数据库和redis缓存暂时不讲,我思路如下,以二进制存到数据库后记录url和二进制文件和时间,存入reids二进制文件和url和时间,redis默认6小时过期,6小时后调用从新生成并且更新到redis和数据库
引入maven依赖:
<dependency>
<groupId>com.microsoft.playwright</groupId>
<artifactId>playwright</artifactId>
<version>1.40.0</version>
</dependency>
浏览器驱动安装
// 自动下载所需浏览器
Playwright playwright = Playwright.create();
Browser browser = playwright.chromium().launch();
基础截图示例
import com.microsoft.playwright.*;
public class ScreenshotDemo {
public static void main(String[] args) {
try (Playwright playwright = Playwright.create()) {
Browser browser = playwright.chromium().launch();
Page page = browser.newPage();
// 访问目标网站
page.navigate("https://www.lik.cc");
// 等待页面加载完成
page.waitForLoadState(LoadState.NETWORKIDLE);
// 截图保存
page.screenshot(new Page.ScreenshotOptions()
.setPath(Paths.get("screenshot.png"))
.setFullPage(true));
browser.close();
}
}
}
使用
Playwright.create()
创建实例进行初始化。通过
chromium().launch()
启动 Chromium 浏览器。调用
newPage()
方法创建新的浏览器标签页。利用
waitForLoadState()
确保页面已完全加载完毕。利用
screenshot()
方法并设置相应的保存路径和截图参数来保存页面截图。
高级参数解释
page.screenshot(new Page.ScreenshotOptions()
.setPath(Paths.get("partial.png"))
.setClip(50, 50, 400, 300) // 截取指定区域
.setQuality(85) // JPEG质量
.setOmitBackground(true) // 透明背景
.setType(PNG)); // 文件格式
多浏览器支持
// Firefox
Browser firefox = playwright.firefox().launch();
// WebKit
Browser webkit = playwright.webkit().launch(
new BrowserType.LaunchOptions().setHeadless(false));
异步API
page.onceLoadFinished(p -> {
p.screenshot(/* options */);
});
page.navigate("https://www.lik.cc");
扩展学习建议
官方文档:
设备模拟:
page.emulateDevice()
网络拦截:
page.route()
视频录制:
browserContext.startRecording()