基于puppeteer打造de前端巡检系统 - 用可见数据提升前端页面性能

交代背景

通过不到半年努力,我司前端开发已经完全转向 CI/CD了,在转型的道路上, 对于前端代码的异常监控(听云/senTry部分页面有用),没有一个自己 主动触发的定时巡检系统,为了进一步提升质量,我们进行了 前端巡检系统的开发

系统现状

  1. 系统是从8月初开发,中旬上线的。运行了1个月,通过不同组前端小伙伴之间的努力,线上已经没有标红报错,且在 请求数/大文件请求/白屏时间都有明显提升。
  2. 对接测试/部署系统后,每次代码发布都会执行巡检,为前端代码部署提供了保障

项目主要npm依赖

  1. puppeteer,googleChrome出品的无头浏览器,你可以像 控制木偶一样,控制浏览器帮你打开页面/填写表单/在控制台执行脚本等等,所以他的名字叫puppeteer
  2. node-schedule,nodeJs执行定时任务/脚本的工具,详细介绍
  3. pm2,大名鼎鼎的PM2,不管在win/mac/linux都能帮你守护nodeJs程序
  4. koa,出接口对接 测试系统/对接系统用的,当然还有什么koa-XXX/axios一堆
  5. log4js,解决生产环境无法调试多记录日志的工具
  6. mongodb,持久化数据使用,无论是巡检记录/log信息
  7. mongoose,优雅的使用nodeJs链接mongodb
  8. shelljs,不用考虑兼容性,直接写shell的nodeJs工具
  9. standard,没有规矩不成方圆,代码规范还是需要的
  10. 钉钉群机器人,把定期结果/通知/报错 不同类型的消息即使发送给不同的群

主要实现

puppeteer在centos7上安装有点费劲

报错:
...node_modules/puppeteer/.local-chromium/linux-496140/chrome-linux/chrome: error while loading shared libraries: libpangocairo-1.0.so.0: cannot open shared object file: No such file or directory
解决:

#依赖库
yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 -y

#字体
yum install ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc -y

报错:
(node:30559) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Failed to connect to chrome!
(node:30559) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
解决:

const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
模拟移动端设备 或者 设置UA - emulate - iphone为例
const puppeteer = require('puppeteer');
const devices = require('puppeteer/DeviceDescriptors');
const iPhone = devices['iPhone 6'];

puppeteer.launch().then(async browser => {
  const page = await browser.newPage();
  await page.emulate(iPhone);
  await page.goto('https://www.google.com');
  // other actions...
  await browser.close();
});

设置浏览器分辨率 - setViewport

const puppeteer = require('puppeteer');


puppeteer.launch().then(async browser => {
  const page = await browser.newPage();
  await page.setViewport({
              width: 1920,
              height: 1080
   })
  await page.goto('https://www.google.com');
  // other actions...
  await browser.close();
});
URL列表 需要一次一次打开怎么处理
  1. 循环就好了,虽然耗时时间长,不过能减少 因为CPU/内存/网络带来的不稳定因素
puppeteer核心代码
const puppeteer = require('puppeteer')
const devices = require('puppeteer/DeviceDescriptors')
const iPhone = devices['iPhone 8']
const _platform = process.platform
const _conf = _platform === 'darwin1' ? {
  headless: false
} : {
  args: ['--no-sandbox', '--disable-setuid-sandbox']
}

module.exports = async function run (url, isMobile) {
  return new Promise(async (resolve, reject) => {
    const _arr = []
    for (let i = 0; i < url.length; i++) {
      await puppeteer.launch(_conf).then(async browser => {
        const promises = []

        const _url = url[i]
        promises.push(browser.newPage().then(async page => {
          if (isMobile) {
            await page.emulate(iPhone)
          } else {
            await page.setViewport({
              width: 1920,
              height: 1080
            })
            await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36')
          }

          await page.goto(_url).catch(async error => {
            // await page.close()
            console.log(error)
          })
          await page.close()
        }))

        await Promise.all(promises).catch(e => {
          console.log('---catch start---')
          console.log(e)
          console.log('---catch start---')
        })
        await browser.close()
      })
    }
    resolve(_arr)
  })
}

定时任务

const schedule = require('node-schedule')
const URL = require('../../config/j')
const run = require('./../service/p')
const Rule = new schedule.RecurrenceRule()
Rule.second = [10, 20, 30, 40, 50, 55]

schedule.scheduleJob(Rule, async function () {
  site({
    pageArr: URL(),
    isMobile: 1
  })
})

async function site (...params) {
  await run(params[0].pageArr, params[0].isMobile).catch(e => {
    console.log(e)
  })
  console.log('end')
}

URL列表

const router = [
  'https://www.baidu.com/',
 'https://www.baidu.com/'
]

module.exports = function arr () {
  return router
}

gitHub 简易源码

https://github.com/kyle920326/pupp
可以直接clone下来,参考查看

npm install
npm run dev

备注

koa,log4js,mongodb的部分留到以后再写哈,先把主要实现记录下

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

推荐阅读更多精彩内容

  • Node全栈技术开发介绍 node和js介绍 node服务端开发 node前端vuejs node前端reactj...
    燕京博士阅读 3,627评论 1 19
  • 我来到广州十天了,心里有多想承认自己是匹千里马,但是我没遇到伯乐。不是有句话说的好吗,当你想要做成某件事的时候,你...
    本帅阅读 211评论 0 0
  • 编完书后我们就不怎么正儿八经地上课了,在后面的两天多时间里我们用了大量的时间去排练毕业汇演。用半天时间开小PART...
    _荷包蛋_阅读 155评论 0 0
  • 最近有走火入魔的感觉吗?哈哈。情绪,觉察,这俩词儿快成口头禅了。 夜已经深了,可是还有点兴奋,索性打开手机,记录一...
    绽蕊向阳阅读 132评论 0 0