命令行批量截图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 相关文章推荐
用js统计用户下载网页所需时间的脚本
Oct 15 Javascript
javascript 动态修改样式和层叠样式表代码
Apr 27 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
Aug 27 Javascript
JavaScript中字符串(string)转json的2种方法
Jun 25 Javascript
JQuery validate插件验证用户注册信息
May 11 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
Jun 01 Javascript
node.js中fs文件系统目录操作与文件信息操作
Feb 24 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
Aug 18 Javascript
使用elementUI实现将图片上传到本地的示例
Sep 04 Javascript
ES6 proxy和reflect的使用方法与应用实例分析
Feb 15 Javascript
JS常用排序方法实例代码解析
Mar 03 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
Apr 24 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版 汉字转码的实现详解
2013/06/09 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
2018/09/14 Javascript
vue项目中使用fetch的实现方法
2019/04/25 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
python实现矩阵乘法的方法
2015/06/28 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
django的settings中设置中文支持的实现
2019/04/28 Python
python计算n的阶乘的方法代码
2019/10/25 Python
NumPy排序的实现
2020/01/21 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
Python reversed函数及使用方法解析
2020/03/17 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
岗位职责的构建方法
2014/02/01 职场文书
微笑服务演讲稿
2014/05/13 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
新品发布会策划方案
2014/06/08 职场文书
高中毕业典礼演讲稿
2014/09/09 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
医院病假条怎么写
2015/08/17 职场文书
python文件目录操作之os模块
2021/05/08 Python
LeetCode189轮转数组python示例
2022/08/05 Python