命令行批量截图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 相关文章推荐
使用onbeforeunload属性后的副作用
Mar 08 Javascript
从JavaScript 到 JQuery (1)学习小结
Feb 12 Javascript
js文件中调用js的实现方法小结
Oct 23 Javascript
jquery 提交值不为空的元素示例代码
May 10 Javascript
浅谈JavaScript 框架分类
Nov 10 Javascript
推荐8款jQuery轻量级树形Tree插件
Nov 12 Javascript
js实现3D图片环展示效果
Mar 09 Javascript
最基础的vue.js双向绑定操作
Aug 23 Javascript
js经验分享 JavaScript反调试技巧
Mar 10 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
Oct 07 Javascript
vue.js指令v-for使用以及下标索引的获取
Jan 31 Javascript
JS实现时间校验的代码
May 25 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
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
Smarty变量用法详解
2016/05/11 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
PHP实现八皇后算法
2019/05/06 PHP
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
详解webpack babel的配置
2018/01/09 Javascript
jQuery代码优化方法总结
2018/01/29 jQuery
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
Python中操作符重载用法分析
2016/04/29 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
python编程实现希尔排序
2017/04/13 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
python整合ffmpeg实现视频文件的批量转换
2019/05/31 Python
Python 可变类型和不可变类型及引用过程解析
2019/09/27 Python
python如何运行js语句
2020/09/09 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
金宝贝童装官网:Gymboree
2016/08/31 全球购物
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
公司清洁工岗位职责
2013/12/14 职场文书
索桥的故事教学反思
2014/02/06 职场文书
金融管理专业求职信
2014/07/10 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS