文章目录
第一次更新:2025-2-12
第二次更新:2025-2-14
传统的 selenium 依赖 chromeDriver,driver 的版本要和 chrome 浏览器适配,这个过程中会有很多的版本问题,不太靠谱。
Puppeteer 是一个 JavaScript 库,它提供了一个高级 API 来通过 开发工具协议 或 WebDriver 双向 控制 Chrome 或 Firefox。Puppeteer 默认在无头(无可见 UI)模式下运行
这个本身是 js 的库,基于 Node 环境的,jvppeteer 是基于 Java 封装 了 puppeteer,可以在 Java 环境中驱动网页浏览器实现提交表单、自动化测试等。
导入 maven 坐标
导入 maven 坐标 刚开始在 gitee 上面找到的这个版本较低,很多 bug,建议使用人家最新的坐标。在 github 上面有。
<dependency>
<groupId>io.github.fanyong920</groupId>
<artifactId>jvppeteer</artifactId>
<version>3.1.7</version>
</dependency>
浏览器启动进行配置
浏览器启动配置,主要有几个参数,chrome 浏览器的 exe 路径、是否有头、超时时间。创建浏览器使用的是建造者模式
String chrome = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
// 创建 LaunchOptions 对象
LaunchOptions launchOptions = LaunchOptions.builder()
.headless(false) // 启动有头浏览器
.timeout(3000) // 设置超时时间
.executablePath(chrome) // 设置 Chrome 的路径
.build(); //这个LaunchOptions创建使用了建造者模式
timeout设置超时时间 executablePath 指定chrome浏览器的路径地址 headless 配置浏览器是否可见
启动 browser
启动 browser,开始一个新的页面,这个页面是空白的。
Browser browser = Puppeteer.launch(launchOptions); //启动浏览器
Page page = browser.newPage();
跳转自己需要的页面
跳转自己需要的页面,
page.goTo("https://casb.njit.edu.cn/http/webvpn0ce64a2014465dfe87dac723232b20edd0da6675d44948234864a5c4ff77b278/new/index.html");
等待元素加载
等待页面元素加载进来,如果要截图网页中的某些元素, 这个元素是 JS 脚本加载的,需要等待这个元素加载完成。
//等待登录按钮加载完成
page.waitForSelector("#ampHasNoLogin");
//等待页面所有元素的加载进来
page.waitForNavigation();
获取页面元素
页面的操控事件
通过$ 和 css 样式拿到页面的元素,叫做** elementHandle**,比如按钮,就可以进行 click 点击操作。
ElementHandle entryHome = page.$("#ampHasNoLogin");
entryHome.click(); // 点击登录按钮
select 在 f12 控制台中 点击到元素之后,右击复制 selector.
网页截图
通过$拿到的叫做 elementHandle
ElementHandle captcha = page.$("#captchaImg");
// 确保验证码图片已加载并可见
if (captcha != null) {
// 截取验证码图片并保存
captcha.screenshot("captcha22.png"); //设置保存的路径
System.out.println("验证码图片已保存为 captcha22.png");
} else {
System.out.println("验证码图片元素未找到");
browser.close();
return;
}
继承了 JSHandle
可以去执行 JS 脚本
elementHandle.evaluate("() => {document.body.style.backgroundColor = 'white';}")
表单输入
输入表单内容,如果需要进行登录和验证,可以通过 page.type(‘选择器’,‘内容’)完成表单的输入
page.type("#username", ""); // 输入用户名
page.type("#password", ".."); // 输入密码
page.type("#captchaResponse", ); // 输入验证码
获取网页的 cookie 信息
获取网页的 cookie 信息,有时候需要拿到网页的 cookie 信息
List<Cookie> cookies = page.cookies();
for (Cookie cookie : cookies) {
logger.info(cookie.getName() + " : " + cookie.getValue());
}
更新页面对象
当页面跳转到新的页面的时候,需要更新 page,因为当前的 page 还是原来页面的 page 对象,需要更新一下,如果还是在一个浏览器页面那么不用更新。
List<Page> pages = browser.pages(); //这个是拿到浏览器所有的page对象,获取最新的page对象即可
page=pages.get(pages.size()-1);
设置 cookie 和请求头
有的请求需要请求头和一些 cookie信息。
先设置拦截器,拦截请求。
page.setRequestInterception(true);
page.on(PageEvents.Request, (Consumer<Request>) request -> {
List<HeaderEntry> headers = request.headers();
System.out.println("请求头信息"+TokenUtil.getToken());
headers.add(new HeaderEntry("Authorization","Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE3MzkzNTQ2MDksImF1dGhvcml0aWVzIjpbIlBHLUEwMTAxIiwiUEctQTAxMDMiLCJQRy1BMDEwMiIsIlBHLUkwNjAxIiwiUEctSTAxMDEiLCJQRy1JMDIwMSIsIlBHLUEwMSIsIlBHLUgwMSIsIlBHLUowMSIsIlBHLUkwMSIsIlBHLUswMSIsIlBHLUgwMTAxIiwiUEctQTAxMDQiXSwianRpIjoiYzVjOWIzZWMtMWJhYi00M2M0LWJhMTQtNzU5NDU2Nzk0NzQyIiwiYWNjb3VudCI6ImFkbWluIiwiY2xpZW50X2lkIjoicWljZS1nYXRld2F5In0.Bwt6HZPzrYsOT0mtnp8cC_x3vsLvex0z7u_RHzmPBXC3RImqrUj7DWH2srJ_tyO-dr1RuqJGmtE0eOcmFVYMRcSqBdElBjSFOXRMPVUhsKrLOu0_MkGq8Gdb9wB8YGYl8OOR0V0xjwTjc7Mfp7oupyrIZp7L-wAhBJ-Bg0ppjAB_bmd6NwjVwXxEHF9pjByviXMbAvcyrsOXPkZ_cHz3Ll1kR0UZC8NSh2MDkJ3T5D0RnfaW0YQee_Twg4bhrU62NZ3KDnIvzHzNkOitbhNTRsr0kmoqKd4GNFbZ7aC9eytYh5cQVvoQVjMt68ghwbn7xXJkYVwdxoxbxN0QMAssYQ"));
headers.add(new HeaderEntry("foo", "bar"));
ContinueRequestOverrides overrides = new ContinueRequestOverrides();
overrides.setHeaders(headers);
request.continueRequest(overrides);
});
page.on 属于事件监听器的一部分,绑定了一个请求时间处理器。每次发送一个 http 请求的时候回调函数都会触发。拿到请求头之后,让里面再添加请求。
. ContinueRequestOverrides overrides = new ContinueRequestOverrides();
创建一个 ContinueRequestOverrides
对象,这个对象用于修改请求的某些属性。
ContinueRequestOverrides
是用来对请求进行更改的,比如修改请求头、请求方法等。
overrides.setHeaders(headers);
设置 ContinueRequestOverrides
的请求头为修改后的 headers
。
这样,后续的请求会使用新的请求头(包括添加的 Authorization
和自定义的 foo
)。
request.continueRequest(overrides);
调用 request.continueRequest(overrides)
,表示继续处理该请求并应用之前的修改。
通过这个方法,原本的请求会继续发送,但会带上修改过的请求头等信息。
CookieParam cookieParam = new CookieParam();
cookieParam.setUrl("http://10.33.10.185:5173/graphicalOperator/draw");
cookieParam.setName("ACCESS_TOKEN");
logger.info("请求截图的token信息"+TokenUtil.getToken());
cookieParam.setValue(TokenUtil.getToken());
page.setCookie(cookieParam);
设置网页的 cookie 信息,设置 name 和 value,注意 url 问题,设置 cookie 的时候需要指定 url,在哪个页面去设置 url。