Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Puppeteer 入门指引

Puppeteer 入门指引

作者头像
MudOnTire
发布于 2022-03-22 06:32:16
发布于 2022-03-22 06:32:16
1.7K00
代码可运行
举报
文章被收录于专栏:MudOnTireMudOnTire
运行总次数:0
代码可运行

Puppeteer 是什么

Puppeteer 是一个 Node library,提供了一套完整的通过 DevTools 协议操纵 Chrome 或 Chromium 的 API。Puppeteer 默认以 无头(headless) 的方式运行, 也可以使用 GUI 的方式运行 Chrome 和 Chromium。

熟悉爬虫或者 UI 自动化的同学可能会联想到 PhantomJSCasperJS 或者 Selenium,而作为 Chrome DevTools 团队亲自出品和维护的 puppeteer 不管是在功能的完整性、稳定性、兼容性、安全性还是性能都将成为碾压其他工具的存在。

Puppeteer 的作用

理论上我们在 Chrome 里能做的事情,通过 puppeteer 都能够做到。比如:

  • 对页面和元素截图
  • 把页面保存为 PDF
  • 爬取 SPA(Single-Page Application)网站的内容并为 SSR(Server-Side Rendering)网站生成 pre-render 的内容
  • UI 自动化测试、自动填充/提交表单、模拟 UI 输入
  • 测试最新的 Javascript 和 Chrome 功能
  • 性能测试,生成 timeline trace 用于定位网站性能问题
  • 测试 Chrome 的插件

当然,puppeteer 也不是全能的,比如在跨浏览器兼容方面就有所欠缺,目前只对 Firefox 做了实验性的支持,所以要对网站做浏览器兼容性测试还是得选择 Selenium/WebDriver 之类的工具,puppeteer 更多的是专注于和 Chromium 的互通,以提供更丰富更可靠的功能。

安装 Puppeteer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i puppeteer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add puppeteer

安装 puppeteer 的过程中会下载最新版本的 Chromiun (~170MB Mac, ~282MB Linux, ~280MB Win),以确保最新版的 puppeteer 和 Chromium 完全兼容. 我们也可以跳过 Chromium 的下载,或者下载其他版本的 Chromium 到特定路径,这些都可以通过环境变量进行配置

puppeteer-core

puppeteer-core 是 puppeteer 的一个轻量版本,不会默认下载 Chromium,而是需要选择使用本地或远程的 Chrome。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i puppeteer-core

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add puppeteer-core

使用 puppeteer-core 需要确保它的版本和连接的 Chrome 版本可以兼容。 puppeteer-core 会忽略所有的 PUPPETEER\_* 环境变量

关于 puppeteer 和 puppeteer-core 的详细对比请参考:puppeteer vs puppeteer-core

用法举例

示例 1 - 访问并对网页截图

创建 screenshot.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto("https://example.com");
  await page.screenshot({ path: "example.png" });

  await browser.close();
})();

执行 screenshot.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
node screenshot.js

生成图片预览:

Puppeteer 初始的窗口尺寸为 800x600px, 这也决定了对页面的截图的尺寸为 800x600px。我们可以使用 Page.setViewport() 对窗口尺寸进行设置,比如设置成 1080P 的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
page.setViewport({
  width: 1920,
  height: 1080,
});

如果想要对真个网页进行滚动截图,可以使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await page.screenshot({ fullPage: true });
示例 2 - 访问 https://github.com/puppeteer/... 并将网页保存为 PDF 文件。

创建 savePDF.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  page.setViewport({
    width: 1920,
    height: 1080,
  });
  await page.goto("https://github.com/puppeteer/puppeteer", {
    waitUntil: "networkidle2",
  });
  await page.pdf({
    path: "puppeteer.pdf",
    format: "a2",
  });

  await browser.close();
})();

执行 savePDF.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
node savePDF.js

生成的 PDF 预览:

生成 PDF 的更多选项请参考:Page.pdf()

示例 3 - 在浏览器的上下文中执行 JS 代码

创建 get-dimensions.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto("https://example.com");

  // Get the "viewport" of the page, as reported by the page.
  const dimensions = await page.evaluate(() => {
    return {
      width: document.documentElement.clientWidth,
      height: document.documentElement.clientHeight,
      deviceScaleFactor: window.devicePixelRatio,
    };
  });

  console.log("Dimensions:", dimensions);

  await browser.close();
})();

执行 get-dimensions.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
node get-dimensions.js

执行结果:

更多 evaluate 的用法请参考 Page.evaluate()

示例 4 - 自动填充表单并提交(在 https://developers.google.com 页面搜索框中输入关键词 Headless Chrome 并搜索)

创建 search.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({
    headless: false, // GUI模式
  });
  const page = await browser.newPage();
  await page.goto("https://developers.google.com/web/");
  // 在搜索框中输入关键词
  await page.type(".devsite-search-field", "Headless Chrome");
  // 按Enter键
  await page.keyboard.press("Enter");
  // 等待结果返回
  const resultsSelector = ".gsc-result .gs-title";
  await page.waitForSelector(resultsSelector);
  // 从页面中爬取结果
  const links = await page.evaluate((resultsSelector) => {
    const anchors = Array.from(document.querySelectorAll(resultsSelector));
    return anchors.map((anchor) => {
      const title = anchor.textContent.split("|")[0].trim();
      return `${title} - ${anchor.href}`;
    });
  }, resultsSelector);
  // 打印结果
  console.log(links.join("\n"));

  await browser.close();
})();

执行 search.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
node search.js

结果展示:

Debugging 技巧

Puppeteer 在 debugging 层面非常强大,下面罗列了一些常用的技巧。

1. 关闭“无头”模式 - 看到浏览器的显示内容对调试很有帮助

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const browser = await puppeteer.launch({ headless: false });

2. 打开“慢动作”模式 - 进一步看清浏览器的运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const browser = await puppeteer.launch({
  headless: false,
  slowMo: 250, // 将puppeteer的操作减慢250ms
});

3. 监听浏览器控制台中的输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
page.on("console", (msg) => console.log("PAGE LOG:", msg.text()));

await page.evaluate(() => console.log(`url is ${kk}`));

4. 在浏览器执行代码中使用 debugger

目前有两种执行上下文:运行测试代码的 node.js 上下文和运行被测试代码的浏览器上下文,我们可以使用 page.evaluate() 在浏览器上下文中插入 debugger 进行调试:

首先在启动 puppeteer 的时候设置 {devtools: true}

然后在 evaluate() 的执行代码中插入 debugger,这样 Chromium 在执行到这一步的时候会停止:

5. 启用详细日志记录(verbose loggin) - 内部 DevTools 协议流量将通过 puppeteer 命名空间下的debug 模块记录

基本用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DEBUG=puppeteer:* node screenshot.js

Windows 下面可以使用cross-env

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npx cross-env DEBUG=puppeteer:* node screenshot.js

协议流量可能相当复杂,我们可以过滤掉所有网络域消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
env DEBUG=puppeteer:\* env DEBUG_COLORS=true node ./examples/screenshot.js 2>&1 | grep -v '"Network'

6. 使用 ndb 工具进行调试,具体用法请参考 ndb

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android开发笔记(一百四十五)仿应用宝的垃圾清理动画
除了动画监听器,动画组合也是各类动画常见的用法,比如把几个补间动画组合起来,就形成了集合动画AnimationSet;把几个属性动画组合起来,就形成了属性动画组合AnimatorSet。那么能否把几个矢量动画在时间上并行组合起来,也形成一种矢量动画组合呢? 比如应用宝的垃圾清理动画,它的初始画面由三个深红色的月牙环绕组成,效果如下图所示:
aqi00
2019/01/18
8610
Android高级动画(2)
前面一篇文章已经讲了Android中大部分的动画框架,回顾一下有:Tween动画,属性动画,帧动画,CircularReveal,Activity转场动画,5.0新转场动画,Interpolator插值器,5.0转场动画分为Explode、Slide、Fade、Share四种模式。合理且充分利用这些动画,我们已经可以做出很多优美的效果了。
大公爵
2018/09/05
1.7K0
Android高级动画(2)
[译] 了解 Android 的矢量图片格式:`VectorDrawable`
因为 Android 设备通常具有不同的尺寸、形状和屏幕像素密度,所以我更喜欢用与分辨率无关的矢量资源(vector assets)。但它们究竟是什么?有什么益处?需要什么成本?什么时候应该使用它们?怎么创建和使用它们?在这一系列文章中,我将会探讨这些问题并解释为什么在你的应用中应该大量地使用矢量资源(vector assets)以及怎样最大限度地使用它们。
Android 开发者
2019/04/19
2.6K0
[译] 了解 Android 的矢量图片格式:`VectorDrawable`
Android Vector曲折的兼容之路
Android Vector曲折的兼容之路 两年前写书的时候,就在研究Android L提出的Vector,可研究下来发现,完全不具备兼容性,相信这也是它没有被广泛使用的一个原因,经过Google的不
用户1907613
2018/07/20
1.8K0
[译] 绘制路径:Android 中矢量图渲染
在上一篇文章中,我们研究了 Android 的 VectorDrawable 格式,了解了它的优点和功能。
Android 开发者
2019/05/05
3.1K0
[译] 绘制路径:Android 中矢量图渲染
你都知道么?Android中21种drawable标签大全
我们在drawable目录下可以创建很多自定义的资源,其中用的最多的应该就是selector和shape。目前在Android中有21种drawable标签,了解和利用这些标签对我们的开发有很大的帮助。这个文章我们对这21种标签做一个介绍,让大家有一个印象。
BennuCTech
2021/12/24
2.6K0
Android自定义View-SVG动画
SVG是可缩放矢量图形,全称Scalable Vector Graphics。经过数学计算利用直线和曲线绘制而成,无论怎么放大,都不会出现马赛克现象。可以使用Illustrator矢量图绘图软件来进行绘图。
音视频开发进阶
2020/08/27
2.9K0
Android自定义View-SVG动画
Android--SVG在安卓系统中的应用
通过使用它的Path标签,几乎可以实现SVG中的其它所有标签,虽然可能会复杂一点,但这些东西都是可以通过工具来完成的,所以,不用担心写起来会很复杂。
aruba
2020/07/03
3K0
Android高级动画(3)
上一篇文章我们讲了Android中的矢量动画,虽然文中展示的Demo并不多,但是相信大家还是体会到了矢量动画的强大。这里再做一个温故总结:
大公爵
2018/09/05
9060
Android高级动画(3)
Android动画Animator家族使用指南
零、前言:本文知识点 ValueAnimator的认识与使用 估值器TypeEvaluator的自定义与使用 插值器TimeInterpolator的自定义与使用 Path于Animator的结合使用 ObjectAnimator的自定义与使用 TimeAnimator的使用 AnimatorSet动画集合的使用 Animator家族的监听器介绍与使用 Animator家族在xml中的使用 ---- 一直用动画,貌似还没有好好地总结一下,趁有空,总结一波 所谓动画,就是不停变化,在视觉上达到连续的效果
张风捷特烈
2019/01/02
1.3K0
Android开发(10) 动画(Animation)
1.准备一个animation对象,改对象可以看作是个动画对象,它描述(封装)了什么样式的动画。 我们可以在代码里手动创建这些对象,对应的4个animaiton对象类:
张云飞Vir
2020/03/16
6030
Android中的动画
在Android程序设计过程中,除了使用简单的按钮、文本框等简单控件来构建基本界面,我们还可以通过为界面添加动画效果,使得界面更加变得更加绚丽,更加吸引人。Android平台也提供了一套完整的动画框架,使得开发者可以用它开发出各种动画效果。
张哥编程
2024/12/17
1810
Android中的动画
Android样式的开发:View Animation篇
drawable汇总篇讲过两个动画,animation-list定义帧动画,animated-rotate定义旋转动画,这两个属于drawable动画。除了drawable动画,Android框架还提供了另外两种动画体系:视图动画(View Animation)和属性动画(Property Animation)。视图动画比较简单,只能应用于各种View,可以做一些位置、大小、旋转和透明度的简单转变。属性动画则是在android 3.0引入的动画体系,提供了更多特性和灵活性,也可以应用于任何对象,而不只是View。本篇先讲视图动画。
Keegan小钢
2018/08/10
1.1K0
Android中的Vector
随着 Android 的碎片化越来越严重,适配成为一个开发中一个痛点。如果 UI 只切一套图,但是在一些特定机型上难免会出现模糊或者变形的情况,如果切多套不同分辨率的图,虽然能解决适配问题,但是造成安装包过大的问题,很多开发者都会为这个问题感到头疼。终于,Android 的 Vector 的出现,可以解决这个问题了。
蜻蜓队长
2018/08/03
1.7K0
Android中的Vector
svg矢量图绘制以及转换为Android可用的VectorDrawable资源
项目需要 要在快速设置面板里显示一个VoWiFi图标(为了能够区分出来图形,我把透明的背景填充为黑色了) 由于普通图片放大后容易失真,这里我们最好用矢量图(SVG(Scalable Vector Gr
庞小明
2018/03/12
2.7K0
svg矢量图绘制以及转换为Android可用的VectorDrawable资源
Android开发之漫漫长途 XVII——动画
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!
LoveWFan
2018/08/21
4330
Android开发之漫漫长途 XVII——动画
Android中的动画全解!
View动画的平移、缩放、旋转、透明度 分别对应 Animation的的4个子类:TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation。View可以用xml定义、也可以用代码创建。推荐使用xml,可读性好。
胡飞洋
2020/07/23
2.4K0
Android中的动画全解!
Android开发笔记(一百三十一)水波图形与水波动画
RippleDrawable是Android在5.0之后新增的图形类,它的作用是在点击时展示水波动画,从而提示用户在这里按压了屏幕。这个提示效果类似于状态图形StateListDrawable,区别在于,StateListDrawable使用一张静止图片表示按下状态,而RippleDrawable使用荡起涟漪的水波动画表示按压动作。 水波图形的用法很简单,先在xml文件中定义水波图形的规格,然后把视图的android:background属性设置为该图形,然后点击视图就会产生动画效果了。具体的水波样式主要有三种,说明如下: 1、没有边界限制的水波,这意味着允许水波动画充满整个视图,xml定义如下:
aqi00
2019/01/18
1.1K0
安卓开发_浅谈Android动画(三)
一、LayoutAnimation布局动画 用于为一个layout里面的控件,或者是一个ViewGroup里面的控件设置动画效果 在res-anim文件下新建一个动画xml文件 1 <?xml ve
听着music睡
2018/06/08
6140
Android:帧动画和补间动画看这篇就足够了!
为了使用户的交互更加流畅自然,动画也就成为了一个应用中必不可少的元素之一。在 Android 中常用的动画分类无外乎三种,最早的 帧动画 、补间动画,以及 3.0 之后加入的 属性动画,是它们组成了 Android 中各种炫酷亮眼的动画效果。
Android技术干货分享
2019/08/07
2K0
Android:帧动画和补间动画看这篇就足够了!
推荐阅读
相关推荐
Android开发笔记(一百四十五)仿应用宝的垃圾清理动画
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验