写点什么

如何成为 Puppeteer 大师

  • 2017-09-24
  • 本文字数:2031 字

    阅读完需:约 7 分钟

对程序进行测试有很多方法。从微型的单元测试开始,到更大型的用户界面测试 Puppeteer 绝对属于后一种。

Puppeteer 宣传自己是

一个 Node 库,它提供了一组高级 API,通过 DevTools 协议控制无界面 Chrome。

简而言之,基于 Chrome Devtools 协议,Puppeteer 可以让用户界面测试变得很轻松。而所有这一切都是免费的。

什么是 Puppeteer?

Puppeteer 是一个用户界面自动化工具。它通过使用 Chrome 无界面模式和 DevTools 协议的组合来实现这一点。正如上面的引用所言,它使用一个更上层的 API 来封装其功能,让用户界面测试自动化变得轻而易举。

人们基于 Chrome DevTools 协议开发了一系列 Google Chrome 工具。你在浏览器中点击更多工具 -> 开发工具,打开的就是 DevTools 。DevTools 协议是 DevTools 的动力基础,我们现在可以使用 Chrome 中的 DevTools 来做更多的事情。

无界面Chrome 是没有Chrome 的Chrome。是的,你没看错。它允许你从浏览器之外的环境(即命令行)与Chromium 进行交互。

将Chromium 和 Blink 渲染引擎带入命令行使得很多事情变得可行,比如自动化测试。

安装

安装很简单,可以通过 yarn npm 来完成。只需运行下面的命令:

复制代码
yarn add pupeeter
# or "npm i puppeteer"

之后可以像其它 nodejs 程序一样用 node 来运行。

创建截图

有时你想测试像 CSS 这样的东西,确保网站观感没有出现回退。

譬如,对我的博客首页进行截图:

复制代码
const puppeteer = require("puppeteer");
(async() => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("http://jackhiston.com/");
await page.screenshot({ path: "jackhiston-blog.png" });
browser.close();
})();

首先我们要引用 puppeteer 作为依赖包。有了这个,你可以启动一个浏览器实例,它实际上也可以在屏幕上加载浏览器,如下所示:

复制代码
const browser = await puppeteer.launch({ headless: false });

注意 headless 选项。

这样你就可以在浏览页面时创建一个全新的页面,然后你可以“转到”一个特定的网址(在这个例子里会转到我的主页)。

然后,我们可以使用内建的屏幕截图功能来保存页面截图。

爬取网页

另外一个应用场景是用 Puppeteer 爬取网站的内容。在下面的例子里,我将浏览骇客新闻并从第一页上取得所有新闻的链接:

复制代码
const puppeteer = require("puppeteer");
(async() => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
page.on("console", (...args) => console.log("PAGE LOG:", ...args));
await page.goto("https://news.ycombinator.com", { waitUntil: "networkidle" });
const links = await page.evaluate(() => {
const anchors = Array.from(document.querySelectorAll(".storylink"));
return anchors.map(anchor => anchor.textContent);
});
console.log(links.join("\n"));
browser.close();
})();

这里需要注意的是 page.evaluate 功能。它允许我们检查当前所在的页面 ,就像我们在 Chrome 的 DevTools 里做的那样。

点击链接并浏览

我想展示的最后一个用例是导航。在下面的例子中,我展示了你如何点击页面链接并等待页面加载,并将结果记录下来:

复制代码
const puppeteer = require("puppeteer");
(async() => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("https://news.ycombinator.com", { waitUntil: "networkidle" });
await page.click("a.storylink");
var response = await page.waitForNavigation({ waitUntil: "networkidle" });
console.log(await page.title());
console.log(page.url());
browser.close();
})();

在这里, page.waitForNavigation 是一个很关键的功能。我们可以等到页面加载完毕,因为 promise 只会在点击事件完成后结束。

这对于浏览导航来说非常有用,并且可以进行全面的 UI 用户体验测试。

总结

Puppeteer 的重点是提供 API 来展现 DevTools 协议的功能。

Selenium 这样的工具更加成熟,并提供跨浏览器测试。Puppeteer 不属于 Selenium 这类应用。

Puppeteer 只是许多无界面 Chrome 的应用中的一种。在撰写本文时,已经有很多项目在使用无界面 Chrome。Ken Soh 的博客很好地介绍了这方面的内容。其他使用DevTools 协议的项目可以在这里找到。

Puppeteer 由 Chrome DevTools 团队维护,他们正在寻求各种人才为社区作贡献。因此,你可以通过加入 Puppeteer 开源项目来推动无界面 Chrome 自动化测试。

谢谢阅读。请与朋友分享。

有用的链接

查看英文原文 Making a Master Puppeteer


感谢薛命灯对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-09-24 19:007649
用户头像

发布了 322 篇内容, 共 143.2 次阅读, 收获喜欢 148 次。

关注

评论

发布
暂无评论
发现更多内容

日志审计是什么?为什么企业需要日志审计?

ServiceDesk_Plus

日志审计 合规性管理 审计日志

关于并发编程与线程安全的思考与实践

京东科技开发者

一次彻底讲清如何处理mysql 的死锁问题

快乐非自愿限量之名

MySQL 数据库

2024算力中国·年度重大成果!天翼云成功入选!

天翼云开发者社区

人工智能 云计算

GreptimeDB vs. InfluxDB 性能测试报告

Greptime 格睿科技

时序数据库 查询 写入

过关斩将!天翼云红盾安全团队荣获双项大奖!

天翼云开发者社区

云计算 互联网大会 天翼云

TapData 知识库 | 一文吃透数据整合(Data Consolidation)

tapdata

数据库 什么是ETL

万界星空科技专门针对数字化改造申报的MES

万界星空科技

可视化 数字化 智能制造 mes 万界星空科技mes

鸿蒙开发案例:推箱子

zhongcx

火盾云APP盾的 防御机制及其应用场景

HUODUNYUN

节点 DDoS 应用安全防护 APP盾 游戏盾

创新数据新要素发展新质生产力!天翼云助力数字经济高质量发展

天翼云开发者社区

云计算 天翼云

ArkWeb高级安全模式 - 提升应用安全性

秃头小帅oi

Java常用类——包装类 小白版个人推荐

不在线第一只蜗牛

Java

区块链开发入门: 原理、技术与实践

区块链软件开发推广运营

交易所开发 区块链开发 链游开发 dapp开发链游开发 链游开发代币开发

Java栈溢出|内存泄漏|内存溢出

EquatorCoco

Java

公链数字钱包开发:加密钱包App原生开发指南

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 NFT开发 公链开发

测试人生 | 双非院校,2年工作经验年薪近20万

测吧(北京)科技有限公司

测试

Higress 重磅更新:AI 能力全面开源,云原生能力再升级

阿里巴巴云原生

阿里云 云原生 Higress

为什么选择租用香港服务器?

Ogcloud

服务器 服务器租用 云服务器租用

淘宝商品详情数据接口抓取商品视频参数

tbapi

淘宝商品详情接口 淘宝商品视频接口

简单三步完成 Telegram 生态的 Web3 冷启动

Footprint Analytics

Telegram Web 3.0

创新突破!天翼云荣膺CCF HPC China 2024高性能计算创新大奖

天翼云开发者社区

云计算 高性能计算

如何理解分布式事务

我爱娃哈哈😍

分布式 分布式事务 微服务

ChatGPT背后的AI背景、技术门道和商业应用(万字长文,建议收藏)

京东科技开发者

京东APP百亿级商品与车关系数据检索实践

京东科技开发者

什么是 Spring Cloud?它解决了哪些问题?

我爱娃哈哈😍

微服务 SpringCloud

五种编程语言运行速度对比

高端章鱼哥

云手机与传统手机的不同之处

Ogcloud

云手机 海外云手机 云手机海外版 云手机群控 手机群控

趣味科普:人的大脑相当于什么水平的CPU和GPU

伤感汤姆布利柏

解析阿里巴巴商品详情API返回的JSON数据结构

技术冰糖葫芦

API 接口 API 文档 API 测试 API 性能测试

第三届OpenHarmony技术大会展区亮点纷呈,全方位洞见智慧互联未来

科技热闻

如何成为Puppeteer大师_软件工程_Jack Histon_InfoQ精选文章