puppeteer 学习笔记 (-) 初始puppeteer -- 概念以及基本操作

1,319 阅读3分钟

puppeteer是什么

Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。Puppeteer 默认以 headless 模式运行,但是可以通过修改配置文件运行“有头”模式。

puppeteer 能做什么

  • 生成页面 PDF。
  • 抓取 SPA(单页应用)并生成预渲染内容(即“SSR”(服务器端渲染))。
  • 自动提交表单,进行 UI 测试,键盘输入等。
  • 创建一个时时更新的自动化测试环境。 使用最新的 JavaScript 和浏览器功能直接在最新版本的Chrome中执行测试。
  • 捕获网站的 timeline trace,用来帮助分析性能问题。
  • 测试浏览器扩展。

puppeteer 基本使用

  1. 由于puppeteer是node库,所以先确保是否有node环境,然后初始化项目 npm init projectNmae
  2. 安装 puppeteer
npm i puppeteer --save
  1. 下面是puppeteer的基槽(跟日常百度操作一样)
  • 创建一个 Browser 实例
  • 打开页面
  • 输入要到的地址
  • 其他操作(见 -> puppeteer 能做什么)

代码

/*
* 1. ()() 是函数的自调用
     
* 2. 由于大量操作,需要异步进行,所以使用了async await。
    
* 3. 用完记得关闭,不然会一直占用浏览器内存
    
* 4. 基本结构就是下面这个样子
*/
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch(); // 打开一个浏览器
const page = await browser.newPage(); // 打开页面
await page.goto('https://example.com'); // 页面要跳转的地址
/*
* 其他操作,在这里你可以放飞自我
*
*
/
await browser.close();  // 关闭浏览器 
})();

利用puppeteer进行截图操作

// 在其他操作处新增
await page.screenshot({path: 'example.png'});

代码

    const bounding_box = await page.waitForSelector('.a-spacing-double-large');
    const codeImg = await page.waitForSelector('.a-text-center > img');
    const bounding_boxClip = await bounding_box.boundingBox()
    const codeImgclip = await codeImg.boundingBox()
    await page.screenshot({
            path: './public/img/example.png',
            clip: {
                    x: bounding_boxClip.x + 70,
                    y: bounding_boxClip.y + 310,
                    width: codeImgclip.width,
                    height: codeImgclip.height
            }
    });

image.png

image.png

tip

1. path还可以指定文件名,以及文件路径 , ./src/example.png (图片名是自己定的,但是文件夹得自己先建好)

2. 对特定区域进行截图
 2.1 通过waitForSelector,获取元素
 2.2 通过boundingBox获取元素的信息(元素的x轴坐标, 元素的y轴坐标,长,宽)
 2.3 
 利用 screenshot({
    clip
}) 进行截图操作

关于waitForSelector的选择使用

  1. 审查元素,右击,选择copy -> js path / selector

image.png 2. 选择元素之后,可以搜索一下 waitForSelector选择的元素防止class / id 重复,造成选择失误

常用 API

  • page.waitForSelector 要等待的元素选择器 (由于页面的加载是异步的,所以这个api会常用)

  • page.type 获取输入框焦点并输入文字

  • page.keyboard.press 模拟键盘按下某个按键,目前mac上组合键无效为已知bug

  • page.waitFor 页面等待,可以是时间、某个元素、某个函数

  • page.click() 点击一个元素

  • page.frames() 获取当前页面所有的 iframe,然后根据 iframe 的名字精确获取某个想要的 iframe

  • iframe.$('.srchsongst') 获取 iframe 中的某个元素

  • iframe.evaluate() 在浏览器中执行函数,相当于在控制台中执行函数,返回一个 Promise

  • Array.from 将类数组对象转化为对象

  • iframe.$eval() 相当于在 iframe 中运行 document.queryselector 获取指定元素,并将其作为第一个参数传递

  • iframe.$$eval 相当于在 iframe 中运行 document.querySelectorAll 获取指定元素数组,并将其作为第一个参数传递

  • elementHandle.boundingBox() - returns: <Promise<?Object>>

    • x <number> 元素的 x 坐标(以像素为单位)。
    • y <number> 元素的 y 坐标(以像素为单位)。
    • width <number> 元素的像素宽度。
    • height <number> 元素的像素高度。