命令行批量截图Node脚本示例代码


Posted in Javascript onJanuary 25, 2019

批量截图任务

作为一个软件工程师,不只是做好自己的本职工作(iOS),而是需要解决项目中的技术问题。这次就是解决自动截图的问题

早期公司的数据工程师利用 phantomjs 来截图,后期不断发现截图效率低,加之开发者团队不再维护,因此决定将截图这部分跟你剥离开来,以后方便开发维护。我就承担了这个工作

puppeteer

Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless) Chrome or Chromium.

安装问题

一开始按照往常的套路(npm install --save puppeteer) 好几次都卡住了,后期查找资料发现切换到国内的镜像就可以顺利下载

PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org npm i --save puppeteer
  • To use Puppeteer in your project, run:
PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org npm i --save puppeteer
  • Install some basic packages
npm install

Usage

const puppeteer = require('puppeteer'),
  fs = require('fs'),
  path = require('path'),
  request = require('request')

function mkdirsSync(dirname) {
 if (fs.existsSync(dirname)) {
 return true
 } else {
 if (mkdirsSync(path.dirname(dirname))) {
  fs.mkdirSync(dirname)
  return true
 }
 }
}

var snapShotFolerPath = path.join(__dirname, '../snspshot/')
mkdirsSync(snapShotFolerPath)

 function snapShot (taskInfo) {
 return new Promise(function (resolve, reject) {

 (async function(){
  // 启动Chromium
  const browser = await puppeteer.launch({ignoreHTTPSErrors: true, headless:true, args: ['--no-sandbox']})
  // 打开新页面
  const page = await browser.newPage()
  // 设置页面分辨率
  await page.setViewport({width: 1920, height: 1080})

  // 访问
  await page.goto(taskInfo.websiteUrl, {waitUntil: 'domcontentloaded'}).catch(err => console.log(err))
  await page.waitFor(1000)

  try {
  // 截图
  await page.screenshot({path: snapShotFolerPath + taskInfo.imageName, fullPage:true}).catch(err => {
   console.log('截图失败: ' + err)
  });
  await page.waitFor(6000)
  } catch (e) {
  console.log('failed ' + e)
  } finally {
  await browser.close()

  fs.stat(snapShotFolerPath + taskInfo.imageName, function(err,stats){
   if (err) {
   reject('fail')
   } else {                         
   if (stats.isFile()) {
    resolve('success')
   }
   }
  })
  }

 })()
 })
}

module.exports = snapShot

如何安装 (Linux 、Unix 操作系统)

如果你有翻墙环境

  • 执行 npm install
  • 执行 npm start

如果你没有翻墙环境

  • 打开 package.json 文件,检查 dependencies 项目,如果 key 为 puppeteer 的条目,先删除该条目。
  • 进入工程命令行,输入 PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.co... npm i --save puppeteer
  • 执行 npm install 命令
  • 执行 npm start

流程说明

while 循环去调用接口去获取当前的截图任务

  • 在有截图任务情况下继续截图
  • 没有截任务的情况下,为了避免浪费资源,程序休眠10分钟后继续下一次的获取截图任务
  • 如果遇到调用截图任务接口500错误,则强制停止截图任务,相应的服务端工程师去查询失败原因

如果有截图任务那么就去截图

  • 截图后将截图图片保存到文件夹,命令为当前日期 yyyy-MM-dd-hh-mm-ss-S 格式。然后将结果上传到服务端
  • 截图失败将当前任务结果保存到本地 failedTasks.json 文件夹一份,然后上传到服务端

截图成功不管失败还是成功都去通知服务端。如果失败将当前任务告诉服务端,如果成功将当前任务信息和截图成功的绝对路径告诉服务端

一些说明

Demo 中执行 npm start 真正执行的是 quickStart.js 中的代码。完整的“获取截图任务、截图、截图上传到OSS、失败则将失败任务上传到服务”逻辑在 index.js 文件中

  • 工程是在没有提供真正的接口获取任务,而是采用随机数获取截图任务
  • 截图成功后将结果上传到OSS这一个步骤是没有的,采用 log 出来
  • 失败的上传也是不存在的,log 打印而已

todoList

  • 多线程高效率的去截图
  • 一些写法暂时比较粗糙,不优雅,待改进
  • puppeteer 很强大,大家可以去研究下

代码地址 (本地下载)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery 多级下拉菜单核心代码
May 21 Javascript
js操作二级联动实现代码
Jul 27 Javascript
Javascript动态绑定事件的简单实现代码
Dec 25 Javascript
网页打开自动最大化的js代码
Aug 22 Javascript
js 本地预览的简单实现方法
Feb 18 Javascript
微信小程序 网络请求(GET请求)详解
Nov 16 Javascript
javascript、php关键字搜索函数的使用方法
May 29 Javascript
JS逻辑运算符短路操作实例分析
Jul 09 Javascript
小程序红包雨的实现示例
Feb 19 Javascript
JavaScript实现的联动菜单特效示例
Jul 08 Javascript
js实现超级玛丽小游戏
Mar 18 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
Node.js 进程平滑离场剖析小结
Jan 24 #Javascript
Vue.js样式动态绑定实现小结
Jan 24 #Javascript
实例讲解JavaScript预编译流程
Jan 24 #Javascript
实例讲解vue源码架构
Jan 24 #Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
Jan 24 #Javascript
JavaScript私有变量实例详解
Jan 24 #Javascript
小程序从手动埋点到自动埋点的实现方法
Jan 24 #Javascript
You might like
php中session_unset与session_destroy的区别分析
2011/06/16 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
PHP中创建图像并绘制文字的例子
2014/11/19 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
php实用代码片段整理
2016/11/12 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
JavaScript中的Promise使用详解
2015/06/24 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
基于input动态模糊查询的实现方法
2017/12/12 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
Vue实现手机计算器
2020/08/17 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
尼克松手表官网:Nixon手表
2019/03/17 全球购物
初中政治教学反思
2014/01/17 职场文书
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
司法建议书范文
2014/05/13 职场文书
关于教师节的广播稿
2014/09/10 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
2014年关工委工作总结
2014/11/17 职场文书
同学会邀请函模板
2015/01/30 职场文书
升职自荐信范文
2015/03/27 职场文书
党员转正介绍人意见
2015/06/03 职场文书
OpenCV-Python实现轮廓拟合
2021/06/08 Python
Tomcat配置访问日志和线程数
2022/05/06 Servers