命令行批量截图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 相关文章推荐
鼠标移动到图片名上,显示图片的简单实例
Jul 14 Javascript
图片Slider 带左右按钮的js示例
Aug 30 Javascript
jquery实现滑动图片自己测试的例子
Nov 05 Javascript
JS使用for循环遍历Table的所有单元格内容
Aug 21 Javascript
javascript单例模式的简单实现方法
Jul 25 Javascript
jquery分隔Url的param方法(推荐)
May 25 Javascript
jquery实现点击页面回到顶部
Nov 23 Javascript
jQuery焦点图左右转换效果
Dec 12 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
Jan 13 Javascript
使用use注册Vue全局组件和全局指令的方法
Mar 08 Javascript
vue awesome swiper异步加载数据出现的bug问题
Jul 03 Javascript
JavaScript模拟实现自由落体效果
Aug 28 Javascript
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
详解EventDispatcher事件分发组件
2016/12/25 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
JS获取时间的方法
2015/01/21 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
python插入排序算法的实现代码
2013/11/21 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
python IDLE添加行号显示教程
2020/04/25 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
用HTML5的canvas实现一个炫酷时钟效果
2016/05/20 HTML / CSS
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
个人实用的自我评价范文
2013/11/23 职场文书
运动会获奖感言
2014/02/11 职场文书
《中华少年》教学反思
2014/02/15 职场文书
财务总监岗位职责
2014/03/07 职场文书
司机职责范本
2014/03/08 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
教师个人考察材料
2014/12/16 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
新入职员工工作总结
2015/10/15 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书