批量截图任务作为一名软件工程师,不仅要做本职工作(iOS),还需要解决项目中的技术问题。这次是为了解决自动截图的问题。早期公司的数据工程师使用phantomjs进行截图。后来他们发现截图效率低,开发团队不再维护了。所以,他们决定把截图和你分开,方便以后的开发和维护。我接受了这份工作puppeteerPuppeteer是一个Node库,它提供了一个高级API来通过DevTools协议控制Chrome或Chromium。Puppeteer默认无头运行,但可以配置为运行完整(非无头)Chrome或Chromium。安装问题一开始按照平时的套路(npminstall--savepuppeteer)卡了好几次。查找资料后发现切换到国内镜像可以顺利下载PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs。orgnpmi--savepuppeteer要在你的项目中使用Puppeteer,运行:PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.orgnpmi--savepuppeteer安装一些基本包,fs=require('fs'),path=require('path'),request=require('request')functionmkdirsSync(dirname){if(fs.existsSync(dirname)){returntrue}else{if(mkdirsSync(path.dirname(dirname))){fs.mkdirSync(dirname)returntrue}}}varsnapShotFolerPath=path.join(__dirname,'../snspshot/')mkdirsSync(snapShotFolerPath)functionsnapShot(taskInfo){returnnewPromise(function(resolve,reject){(asyncfunction(){//启动Chromiumconstbrowser=awaitpuppeteer.launch({ignoreHTTPSErrors:true,headless:true,args:['--no-sandbox']})//打开一个新页面constpage=awaitbrowser.newPage()//设置页面分辨率awaitpage.setViewport({width:1920,height:1080})//访问等待页面。goto(taskInfo.websiteUrl,{waitUntil:'domcontentloaded'}).catch(err=>console.log(err))awaitpage.waitFor(1000)try{//截图awaitpage.screenshot({path:snapShotFolerPath+taskInfo.imageName,fullPage:true}).catch(err=>{console.log('屏幕截图失败:'+err)});awaitpage.waitFor(6000)}catch(e){console.log('failed'+e)}最后{awaitbrowser.close()fs.stat(snapShotFolerPath+taskInfo.imageName,function(err,stats){if(err){reject('fail')}else{if(stats.isFile()){resolve('success')}}})}})()})}module.exports=snapShot如何安装(Linux、Unix操作系统)如果有规避environment执行npminstall执行npmstart如果没有防火墙环境打开package.json文件,查看dependencies项目,如果key是puppeteer的入口,先删除入口进入项目命令行,输入PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.co...npmi--savepuppeteer执行npminstall命令执行npmstart流程描述while循环调用接口获取当前截图任务。有截图任务时继续截图。在没有截取任务的情况下,为了避免资源浪费,程序休眠10分钟后,继续下一个截屏采集任务。如果调用截图任务接口遇到500错误,截图任务会被强制停止,相应的服务器工程师会检查失败原因。如果有截屏任务,截屏并将截屏图片保存到文件夹中,命令是yyyy-MM-dd-hh-mm-ss-S格式的当前日期。然后将结果上传到服务器,如果截图失败,将当前任务结果保存到本地failedTasks.json文件夹,再将截图上传到服务器,通知服务器是失败还是成功。如果失败,告诉服务器当前任务,如果成功,告诉服务器当前任务信息和截图的绝对路径。Demo中一些执行npmstart的指令,实际执行的是quickStart.js中的代码。“获取截图任务、截图、上传截图到OSS、失败任务上传到服务”的完整逻辑在index.js文件中。项目没有提供获取任务的真实接口,而是使用随机数获取截屏任务的截图,没有成功后将结果上传到OSS的步骤,也没有上传失败的使用log来上传。仅打印日志。TodoList是多线程的,截屏效率高。有的写法暂时粗犷不雅致。Puppeteer非常强大,有待提高,可以研究下代码地址
