Puppeteer初探

是什么

Puppeteer 是一个Node库,支持调用Chrome的API来操纵Web。Chrome团队在维护,会拥有更好的兼容性和前景。

用途

  • 生成页面PDF或截图
  • UI自动化测试
  • 性能分析
  • 爬虫

demo

  • 安装
    npm i puppeteer 除了下载puppeteer包之外,还会下载最新版本的Chromium。
  • 例一 UI测试
    文件名:1.js
    运行:node 1.js
    功能:进入掘金首页,1秒后点击前端tab,1秒后点击搜索框,搜索puppeteer,关闭浏览器。
const puppeteer = require('puppeteer');

async function testJuejinUi() {
  try {
    const browser = await puppeteer.launch({
      headless: false
    });
    const page = await browser.newPage();
    const dimensions = await page.evaluate(() => {
      return {
        width: window.outerWidth,
        height: window.outerHeight,
      };
    });
    await page.setViewport({
      width: dimensions.width,
      height: dimensions.height,
    })
    await page.goto('https://juejin.im/timeline');
    await page.waitFor(1000)
    await page.screenshot({ path: 'juejin-timeline.png' });
    await page.tap('.nav-list>li:nth-child(2)>span')
    await page.waitFor(1000)
    await page.screenshot({ path: 'juejin-timeline-frontend.png' });
    await page.type('.search-form>.search-input', 'puppeteer', { delay: 200 })
    await page.tap('.search-form>.search-icon')
    await page.waitFor(1000)
    await page.screenshot({ path: 'juejin-search.png' });
    await browser.close();
  } catch (error) {
    console.log(error)
  }
}
testJuejinUi()
  • 例二 性能分析
    文件名:2.js
    运行:node 2.js
    功能:生成性能json文件。然后在控制台performance面板上传该json文件即可追踪到当时的性能情况。
const puppeteer = require('puppeteer');

async function testJuejinPerformance() {
  try {
    const browser = await puppeteer.launch({ headless: false });
    const page = await browser.newPage();
    const dimensions = await page.evaluate(() => {
      return {
        width: window.outerWidth,
        height: window.outerHeight,
      };
    });
    await page.setViewport({
      width: dimensions.width,
      height: dimensions.height,
    })
    await page.tracing.start({ path: 'trace.json' });
    await page.goto('https://juejin.im/timeline');
    await page.tracing.stop();
    await browser.close();
  } catch (error) {
    console.log(error)
  }
}
testJuejinPerformance()
  • 例三 爬虫
    文件:3.js
    运行:node 3.js
    功能:爬取掘金首页推荐文章名称与作者,并写入文件。
const puppeteer = require('puppeteer');
const fs = require('fs');
async function testJuejinUi() {
  try {
    const browser = await puppeteer.launch({
      headless: false
    });
    const page = await browser.newPage();
    const dimensions = await page.evaluate(() => {
      return {
        width: window.outerWidth,
        height: window.outerHeight,
      };
    });
    await page.setViewport({
      width: dimensions.width,
      height: dimensions.height,
    })
    await page.goto('https://juejin.im/timeline');
    await page.waitFor(1000)
    let arr = await page.$$('ul.entry-list .entry-box')
    arr = Array.from(arr)
    const result = await Promise.all(arr.map(async (ele) => {
      const title = await ele.$eval('.title-row a.title', (dom) => {
        return dom.innerText
      })
      const author = await ele.$eval('li.username a', (dom) => {
        return dom.innerText
      })
      return title + '--' + author
    }))
    fs.writeFileSync('1.text', '')
    result.forEach((ele) => {
      fs.appendFileSync('1.text', ele + '\n')
    })
    await browser.close();
  } catch (error) {
    console.log(error)
  }
}
testJuejinUi()

常用API

const puppeteer = require('puppeteer');
const browser = puppeteer.launch()    // 创建浏览器实例
const page = await browser.newPage();   // 打开新页面
await page.goto('https://juejin.im/timeline');  // 新页面地址
await page.screenshot({ path: 'juejin-timeline.png' });  // 截图功能
await page.waitFor(1000)  // 等待1秒
await browser.close();  // 关闭浏览器
await page.tap('.search-form>.search-icon')  // 点击指定元素
await page.$(selector)  // 等同在页面内执行 document.querySelector
await page.$$(selector)  // 等同在页面内执行 document. querySelectorAll
await page.evaluate(pageFunction[, ...args])  // 在页面实例上下文中执行js函数

参考资料

Puppeteer中文文档
Puppeteer github

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容