命令行批量截图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 相关文章推荐
收集的网上用的ajax之chat.js文件
Apr 08 Javascript
可以支持多中格式的JS键盘
May 02 Javascript
javascript右下角弹层及自动隐藏(自己编写)
Nov 20 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
Jun 15 Javascript
iframe里使用JavaScript控制主页转向的方法
Apr 03 Javascript
实现JavaScript的组成----BOM和DOM详解
May 18 Javascript
jQuery 获取select选中值及清除选中状态
Dec 13 Javascript
WebSocket实现简单客服聊天系统
May 12 Javascript
Vue 拦截器对token过期处理方法
Jan 23 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
May 16 jQuery
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
Apr 04 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
Apr 30 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 ob_flush,flush在ie中缓冲无效的解决方法
2010/05/09 PHP
php画图实例
2014/11/05 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
Thinkphp5 自定义上传文件名的实现方法
2019/07/23 PHP
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
2016/08/25 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
JS 实现 ajax 异步浏览器兼容问题
2017/01/21 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
原生JS发送异步数据请求
2017/06/08 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
原生js实现的移动端可拖动进度条插件功能详解
2019/08/15 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
python获取标准北京时间的方法
2015/03/24 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
三个python爬虫项目实例代码
2019/12/28 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
一套VC试题
2015/01/23 面试题
存储过程的优点有哪些
2012/09/27 面试题
Linux文件操作命令都有哪些
2016/07/23 面试题
华为python面试题
2016/05/03 面试题
安康杯竞赛活动总结
2014/05/05 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
学校教师培训工作总结
2015/10/14 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
MySQL 重写查询语句的三种策略
2021/05/10 MySQL