前端工程师的一大神器——Puppeteer

本文主要讲述一下Google出版并一直在不断维护的前端器神器puppeteer,通过学习本文你将了解其基本使用和常用功能。工程
一、大神Puppeteer简介
Puppeteer 是前端器一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome,工程利用Puppeteer可以获取页面DOM节点、大神网络请求和响应、前端器程序化操作页面行为、工程进行页面的大神性能监控和优化、获取页面截图和PDF等,前端器利用该神器就可以操作Chrome浏览器玩出各种花样。工程
二、大神Puppeteer核心组成结构
Puppeteer的前端器结构也反映了浏览器的结构,其核心结构如下所示:

三、基本使用和常用功能
该神器整体使用起来比较简单,下面就开始我们的使用之路。
3.1 启动Browser
核心函数就是异步调用puppeteer.launch()函数,根据相应的配置参数创建一个Browser实例。
const path = require(path); const puppeteer = require(puppeteer); const chromiumPath = path.join(__dirname, ../, chromium/chromium/chrome.exe); async function main() { // 启动chrome浏览器 const browser = await puppeteer.launch({ // 指定该浏览器的路径 executablePath: chromiumPath, // 是否为无头浏览器模式,默认为无头浏览器模式 headless: false }); } main();3.2 访问页面
访问页面首先需要创建一个浏览器上下文,然后基于该上下文创建一个新的page,最后指定要访问的网址。
async function main() { // 启动chrome浏览器 // …… // 在一个默认的浏览器上下文中被创建一个新页面 const page1 = await browser.newPage(); // 空白页访问该指定网址 await page1.goto(https://51yangsheng.com); // 创建一个匿名的浏览器上下文 const browserContext = await browser.createIncognitoBrowserContext(); // 在该上下文中创建一个新页面 const page2 = await browserContext.newPage(); page2.goto(https://www.baidu.com); } main();3.3 设备模拟
经常需要不同类型的机型的浏览结果,此时就可以采用设备模拟实现,下面模拟一个iPhone X的设备的浏览器结果
async function main() { // 启动浏览器 // 设备模拟:模拟一个iPhone X // user agent await page1.setUserAgent(Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1) // 视口(viewport)模拟 await page1.setViewport({ width: 375, height: 812 }); // 访问某页面 } main();3.4 获取DOM节点
获取DOM节点有两种方式,一种方式是直接调用page所带的原生函数,另一种是香港云服务器通过执行js代码获取。
async function main() { // 启动chrome浏览器 const browser = await puppeteer.launch({ // 指定该浏览器的路径 executablePath: chromiumPath, // 是否为无头浏览器模式,默认为无头浏览器模式 headless: false }); // 在一个默认的浏览器上下文中被创建一个新页面 const page1 = await browser.newPage(); // 空白页访问该指定网址 await page1.goto(https://www.baidu.com); // 等待title节点出现 await page1.waitForSelector(title); // 用page自带的方法获取节点 const titleDomText1 = await page1.$eval(title, el => el.innerText); console.log(titleDomText1);// 百度一下 // 用js获取节点 const titleDomText2 = await page1.evaluate(() => { const titleDom = document.querySelector(title); return titleDom.innerText; }); console.log(titleDomText2); } main();3.5 监听请求和响应
下面就来监听一下百度中某一js脚本的请求和响应,request事件是监听请求,response事件是监听响应。
async function main() { // 启动chrome浏览器 const browser = await puppeteer.launch({ // 指定该浏览器的路径 executablePath: chromiumPath, // 是否为无头浏览器模式,默认为无头浏览器模式 headless: false }); // 在一个默认的浏览器上下文中被创建一个新页面 const page1 = await browser.newPage(); page1.on(request, request => { if (request.url() === https://s.bdstatic.com/common/openjs/amd/eslx.js) { console.log(request.resourceType()); console.log(request.method()); console.log(request.headers()); } }); page1.on(response, response => { if (response.url() === https://s.bdstatic.com/common/openjs/amd/eslx.js) { console.log(response.status()); console.log(response.headers()); } }) // 空白页刚问该指定网址 await page1.goto(https://www.baidu.com); } main();3.6 拦截某一请求
默认情况下request事件只有只读属性,不能够拦截请求,若想拦截该请求则需要通过page.setRequestInterception(value)启动请求拦截器,然后利用request.abort, request.continue 和 request.respond 方法决定该请求的下一步操作。
async function main() { // 启动chrome浏览器 const browser = await puppeteer.launch({ // 指定该浏览器的路径 executablePath: chromiumPath, // 是否为无头浏览器模式,默认为无头浏览器模式 headless: false }); // 在一个默认的浏览器上下文中被创建一个新页面 const page1 = await browser.newPage(); // 拦截请求开启 await page1.setRequestInterception(true);// true开启,false关闭 page1.on(request, request => { if (request.url() === https://s.bdstatic.com/common/openjs/amd/eslx.js) { // 终止该请求 request.abort(); console.log(该请求被终止!!!); } else { // 继续该请求 request.continue(); } }); // 空白页访问该指定网址 await page1.goto(https://www.baidu.com); } main();3.7 截图
截图是一个很有用的功能,通过截取就可以保存一份快照,方便后期问题的源码库排查。(注:在无头模式下进行截图,否则截的图可能有问题)
async function main() { // 启动浏览器,访问页面的操作 // 截屏操作,使用Page.screenshot函数 // 截取整个页面:Page.screenshot函数默认截取整个页面,加上fullPage参数就是全屏截取 await page1.screenshot({ path: ../imgs/fullScreen.png, fullPage: true }); // 截取屏幕中一个区域的内容 await page1.screenshot({ path: ../imgs/partScreen.jpg, type: jpeg, quality: 80, clip: { x: 0, y: 0, width: 375, height: 300 } }); browser.close(); } main();3.8 生成pdf
除了利用截图保留快照外,还可以使用pdf保留快照。
async function main() { // 启动浏览器,访问页面的操作 // 根据网页内容生成pdf文件,使用Page.pdf——注意:必须在无头模式下才可以调用 await page1.pdf({ path: ../pdf/baidu.pdf }); browser.close(); } main();本文转载自微信公众号「执鸢者」,可以通过以下二维码关注。转载本文请联系执鸢者公众号。

相关文章
10月23日消息,代号为Wily Werewolf的Ubuntu 15.10终于发布正式版,官方已提供最新镜像下载,同时其他衍生版本也已更新。Ubuntu 15.10官方版本下载地址:点击下载当前,U2025-11-05
微软专利分享WMR系列VR头显支持MR透视效果的图像对齐方法和系统
(映维网 2021年12月27日)为了支持不同的功能,AR/VR系统一般可以搭载不同类型的摄像头。例如可以通过摄像头提供的视频画面来帮助AR/VR头显用户感知现实世界,从而避免迷失方向和/或安全危险。2025-11-05
注册.cyou域名时,用户需要注意一些关键事项,以确保选择到合适且有效的域名。以下是一些建议和注意事项:一、注册.cyou域名的注意事项1. 选择可靠的注册商在选择注册商时,确保其信誉良好,提供安全的2025-11-05
网页注册域名的步骤是怎样的?在数字化时代,拥有一个专属的域名是建立在线品牌和业务的第一步。通过网页注册域名,您可以在全球范围内展示自己的网站或博客,吸引访问者并建立品牌声誉。下面是如何通过网页注册域名2025-11-05- 摘要:自特斯拉创始人埃隆·马斯克推出Model3以来,这款电动汽车在全球范围内引起了巨大轰动。作为一款价格相对亲民的电动车型,特斯拉Model3以其前卫的设计、卓越的性能和出色的续航里程...2025-11-05
在做项目中,只要涉及敏感信息,或者对安全有一定要求的场景,都需要对数据进行加密。在Java中原生API即可实现对称加密与非对称加密,并支持常用的加密算法。对称加密对称加密使用单钥完成加解密,加密和解密2025-11-05

最新评论