命令行批量截图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 相关文章推荐
Javascript 个人笔记(没有整理,很乱)
Jul 07 Javascript
JavaScript 的继承
Oct 01 Javascript
JS 操作符整理[推荐收藏]
Nov 15 Javascript
html组件不可输入(只读)同时任何组件都有效
Apr 01 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
Aug 13 Javascript
原生js 封装get ,post, delete 请求的实例
Aug 11 Javascript
vue 使用eventBus实现同级组件的通讯
Mar 02 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
Nov 30 Javascript
微信小程序开发问题之wx.previewImage
Dec 25 Javascript
深入了解query和params的使用区别
Jun 24 Javascript
Vue watch响应数据实现方法解析
Jul 10 Javascript
js轮播图之旋转木马效果
Oct 13 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高手需要要掌握的知识点
2014/08/21 PHP
浅谈本地WAMP环境的搭建
2015/05/13 PHP
php引用和拷贝的区别知识点总结
2019/09/23 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
IE本地存储userdata的一个bug说明
2010/07/01 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
同域jQuery(跨)iframe操作DOM(实例讲解)
2013/12/19 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
jquery实现Ctrl+Enter提交表单的方法
2015/07/21 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
js实现股票实时刷新数据案例
2017/05/14 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
Vue初始化中的选项合并之initInternalComponent详解
2020/06/11 Javascript
python实现ip查询示例
2014/03/26 Python
Python卸载模块的方法汇总
2016/06/07 Python
python opencv 直方图反向投影的方法
2018/02/24 Python
django加载本地html的方法
2018/05/27 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
教师实习自我鉴定
2013/12/18 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
讲解Python实例练习逆序输出字符串
2022/05/06 Python