puppeteer前端利器

Puppeteer 是 Chrome 开发团队在 2017 年发布的一个 Node.js 包,同时还有 Headless Chrome。用来模拟 Chrome 浏览器的运行。它提供了高级API来通过 DevTools 协议控制无头 Chrome 或 Chromium ,它也可以配置为使用完整(非无头)Chrome 或 Chromium。

在这里插入图片描述

学习 Puppeteer 之前我们先来了解一下 Chrome DevTool ProtocolHeadless Chrome

Chrome DevTool Protocol 是什么

  • CDP 基于 WebSocket,利用 WebSocket 实现与浏览器内核的快速数据通道。
  • CDP 分为多个域(DOM,Debugger,Network,Profiler,Console…),每个域中都定义了相关的命令和事件(Commands and Events)。
  • 我们可以基于 CDP 封装一些工具对 Chrome 浏览器进行调试及分析,比如我们常用的 “Chrome 开发者工具” 就是基于 CDP 实现的。
  • 很多有用的工具都是基于 CDP 实现的,比如 Chrome 开发者工具chrome-remote-interfacePuppeteer 等。

Headless Chrome 是什么

  • 可以在无界面的环境中运行 Chrome。
  • 通过命令行或者程序语言操作 Chrome。
  • 无需人的干预,运行更稳定。
  • 在启动 Chrome 时添加参数 --headless,便可以 headless 模式启动 Chrome。
  • chrome 启动时可以加一些什么参数,大家可以点击这里查看。

总而言之 Headless Chrome 就是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行你的程序。

Puppeteer 是什么

  • Puppeteer 是 Node.js 工具引擎。
  • Puppeteer 提供了一系列 API,通过 Chrome DevTools Protocol 协议控制 Chromium/Chrome 浏览器的行为。
  • Puppeteer 默认情况下是以 headless 启动 Chrome 的,也可以通过参数控制启动有界面的 Chrome。
  • Puppeteer 默认绑定最新的 Chromium 版本,也可以自己设置不同版本的绑定。
  • Puppeteer 让我们不需要了解太多的底层 CDP 协议实现与浏览器的通信。

Puppeteer 能做什么

官方介绍:您可以在浏览器中手动执行的大多数操作都可以使用 Puppeteer 完成!示例:

  • 生成页面的屏幕截图和PDF。
  • 爬取 SPA 或 SSR 网站。
  • 自动化表单提交,UI测试,键盘输入等。
  • 创建最新的自动化测试环境。使用最新的JavaScript和浏览器功能,直接在最新版本的Chrome中运行测试。
  • 捕获站点的时间线跟踪,以帮助诊断性能问题。
  • 测试Chrome扩展程序。

Puppeteer API 分层结构

Puppeteer 中的 API 分层结构基本和浏览器保持一致,下面对常使用到的几个类介绍一下:

在这里插入图片描述

  • Browser: 对应一个浏览器实例,一个 Browser 可以包含多个 BrowserContext
  • BrowserContext: 对应浏览器一个上下文会话,就像我们打开一个普通的 Chrome 之后又打开一个隐身模式的浏览器一样,BrowserContext 具有独立的 Session(cookie 和 cache 独立不共享),一个 BrowserContext 可以包含多个 Page
  • Page:表示一个 Tab 页面,通过 browserContext.newPage()/browser.newPage() 创建,browser.newPage() 创建页面时会使用默认的 BrowserContext,一个 Page 可以包含多个 Frame
  • Frame: 一个框架,每个页面有一个主框架(page.MainFrame()),也可以多个子框架,主要由 iframe 标签创建产生的
  • ExecutionContext: 是 javascript 的执行环境,每一个 Frame 都一个默认的 javascript 执行环境
  • ElementHandle: 对应 DOM 的一个元素节点,通过该该实例可以实现对元素的点击,填写表单等行为,我们可以通过选择器,xPath 等来获取对应的元素
  • JsHandle:对应 DOM 中的 javascript 对象,ElementHandle 继承于 JsHandle,由于我们无法直接操作 DOM 中对象,所以封装成 JsHandle 来实现相关功能
  • CDPSession:可以直接与原生的 CDP 进行通信,通过 session.send 函数直接发消息,通过 session.on 接收消息,可以实现 Puppeteer API 中没有涉及的功能
  • Coverage:获取 JavaScript 和 CSS 代码覆盖率
  • Tracing:抓取性能数据进行分析
  • Response: 页面收到的响应
  • Request: 页面发出的请求

Puppeteer 安装与环境

注意:在v1.18.1之前,Puppeteer至少需要Node v6.4.0。从v1.18.1到v2.1.0的版本依赖于Node 8.9.0+。从v3.0.0开始,Puppeteer开始依赖于Node 10.18.1+。若要使用 async / await,只有Node v7.6.0或更高版本才支持。

Puppeteer是一个node.js包,所以安装很简单:

npm install puppeteer
// 或者
yarn add puppeteer

npm 在安装 puppeteer 的时候可能会报错!这是由于外网导致,使用科学上网或者使用淘宝镜像 cnpm 安装可解决。

安装Puppeteer时,它将下载 Chromium 的最新版本。从1.7.0版开始,官方发布了该 puppeteer-core 软件包,默认情况下不会下载任何浏览器,用于启动现有的浏览器或连接到远程浏览器。需要注意安装的 puppeteer-core 版本与打算连接的浏览器兼容。

Puppeteer 使用

Case1: 截图

我们使用 Puppeteer 既可以对某个页面进行截图,也可以对页面中的某个元素进行截图:

const puppeteer = require('puppeteer');

(async () => {
   
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  //设置可视区域大小,默认的页面大小为800x600分辨率
  await page.setViewport({
   width: 1920, height: 800});
  await page.goto('https://www.baidu.com/');
  //对整个页面截图
  await page.screenshot({
   
      path: './files/baidu_home.png',  //图片保存路径
      type: 'png',
      fullPage: true //边滚动边截图
      // clip: {x: 0, y: 0, width: 1920, height: 800}
  });
  //对页面某个元素截图
  let element = await page.$('#s_lg_img');
  await element.screenshot({
   
      path: './files/baidu_logo.png'
  });
  await page.close();
  await browser.close();
})();

我们怎么去获取页面中的某个元素呢?

  • page.$('#uniqueId'):获取某个选择器对应的第一个元素
  • page.$$('div'):获取某个选择器对应的所有元素
  • page.$x('//img'):获取某个 xPath 对应的所有元素
  • page.waitForXPath('//img'):等待某个 xPath 对应的元素出现
  • page.waitForSelector('#uniqueId'):等待某个选择器对应的元素出现
Case2: 模拟用户操作
const puppeteer = require('puppeteer');

(async () => {
   
    const browser = await puppeteer.launch({
   
        slowMo: 100,    //放慢速度
        headless: false, //开启可视化
        defaultViewport: {
   width:
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Puppeteer 中可以使用 `page.click()` 方法来点击元素,在调用该方法后可以使用 `page.waitForNavigation()` 方法来判断点击是否成功。该方法会等待页面完成跳转,并返回一个 promise 对象,可以使用 `.then()` 方法来获取跳转后的页面信息。 代码示例: ``` await page.click('#myButton'); await page.waitForNavigation().then(() => { console.log('点击成功'); }); ``` 如果需要等待页面中某个元素出现或消失时使用 `page.waitForSelector()` and `page.waitForSelector()` ``` await page.click('#myButton'); await page.waitForSelector('#success-message', {visible: true}) console.log('点击成功'); ``` 这里有一些其他等待页面变化的方法,可以根据实际情况选择使用 - `page.waitForNavigation()` - `page.waitForResponse()` - `page.waitForRequest()` - `page.waitForFunction()` ### 回答2: Puppeteer 是一个通过控制和操作浏览器来进行自动化测试和爬取数据的工具,它可以模拟用户操作浏览器并截取网页内容。当使用 Puppeteer 进行点击操作时,我们可以使用下面的方法来判断点击元素是否成功: 1. 使用 page.waitForNavigation() 方法等待页面跳转。在点击元素后,如果页面会发生跳转,我们可以通过该方法等待页面完成跳转,这样就可以判断点击是否成功。例如: ``` await Promise.all([ page.waitForNavigation({ waitUntil: 'networkidle0' }), // 等待页面跳转完成 page.click('selector') // 点击元素 ]); ``` 2. 使用 page.waitForSelector() 方法等待元素出现。通过等待元素在 DOM 中出现,我们可以判断点击事件是否成功。例如: ``` await Promise.all([ page.waitForSelector('selector'), // 等待元素出现 page.click('selector') // 点击元素 ]); ``` 3. 使用 page.evaluate() 方法判断点击后的页面变化。使用该方法可以在当前页面中执行 JavaScript 代码,我们可以通过执行一段代码来判断点击事件是否成功。例如: ``` await page.evaluate(() => { const element = document.querySelector('selector'); // 查找元素 if (element === null) { throw new Error('Element not found'); // 如果元素未找到,抛出错误 } element.click(); // 点击元素 }); ``` 通过以上方法,我们可以在 Puppeteer 中判断点击元素是否成功。根据需要可以使用其中的一种或多种方法来进行验证。 ### 回答3: Puppeteer 是一个用于控制 Chrome 或 Chromium 浏览器的 Node.js 库,提供了对页面的操作和控制能力。 在 Puppeteer 中,要判断点击元素是否成功,可以通过以下步骤: 1. 使用 `page.click()` 方法模拟点击操作。该方法接受一个字符串选择器作为参数,表示要点击的元素。如`await page.click('#myButton')`。 2. 等待点击操作完成。在 Puppeteer 中,可以使用 `page.waitForNavigation()` 方法等待页面导航完成,或者使用 `page.waitForSelector()` 方法等待页面中的某个元素加载完成。例如,`await page.waitForNavigation()` 或者 `await page.waitForSelector('#myElement')`。 3. 判断点击是否成功。在点击操作完成后,可以进一步验证页面是否发生了预期的变化。可以使用 `page.$eval()` 方法或其他相应的页面方法来获取某个元素的属性或内容,并与预期的结果进行比较。如`const elementText = await page.$eval('#myElement', el => el.innerText);` 总结来说,要判断点击元素是否成功,可以模拟点击操作,并等待页面的导航或元素加载完成。然后,通过验证相应的元素属性或内容,来判断点击操作是否生效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值