Puppeteer最常用于截图(每日批量自动截图)。我的目标是Xbao的一些商店主页。我这次遇到的问题是在一些无线终端上,商户的页面很长,甚至达到6万到10万像素。经常出现白屏或残缺现象。第一个坑:加载问题?遇到了类似的问题。首先我想到的是页面的资源加载问题。puppeteer截图的时候不是加载了吗?于是我根据页面的滚动查看,确实有类似的情况。首先,如果无线端的页面是无状态登录(没有设置userdata、cookie等),会弹出登录。简单看了一下dom,其实就是一个浮层,清理一下就好了。第二步,截图了半天,发现有时候页面在loading,所以对于这种类型,我让promise直接reject(还能怎么办,放到error队列里,稍后再试!)第三步,当然,作为一个强迫症患者,看不惯乱七八糟的字体,所以就统一了,全部设置为微软雅黑,这样就有了风格。第四步,在做滚动的时候,发现PC端其实很简单,body.scrollBy就可以直接滚动,但是到了无线端,就坑了!这个XXX怎么也动不了,我打开调试器一看,Xbao无线端的DOM全是DIVDIVDIVDIVDIV(写一个selector很麻烦,后面会讲到如何快速找到我想要的元素,掌握棍子,但瞄准院子)。还好后来看到了曙光。其实滚动的关键就在.rax-scrollviewdiv中,所以解决了滚动问题。好了,说了这么多,何不来个更全面的代码:asyncfunctionscrollToBottom(page){returnawaitpage.evaluate(()=>{returnnewPromise((res,rej)=>{if(document.querySelector('body>div>span')){if(document.querySelector('body>div>span').innerText==='加载中...'){rej('页面截图太快了,天猫加载不出来')}}varstyle=document.createElement('style');style.innerHTML='*{font-family:"MicrosoftYahei"!important;}';document.body.appendChild(style);vartotalH=0;vardistance=250;varclientWidth=document.body.clientWidth;varselectorEle='.rax-scrollview';//淘宝独家滑动domvarscrollEle=document.querySelector(selectorEle)!=null?document.querySelector(selectorEle):document.body;varscrollEleS=document.querySelector(selectorEle)!=null?document.querySelector(selectorEle):窗户;vartimer=setInterval(()=>{varscrollHeight=scrollEle.scrollHeight;scrollEleS.scrollBy(0,distance);totalH+=distance;if(document.querySelector('body>div.J_MIDDLEWARE_FRAME_WIDGET>div>a')){document.querySelector('body>div.J_MIDDLEWARE_FRAME_WIDGET>div>a').click();}if(totalH>=scrollHeight){clearInterval(timer);scrollEleS.scrollTo(0,0);//返回top再截图防止从底部截图,如果一些活跃的页面不回头就会出问题。res({w:clientWidth,h:scrollHeight})}},250)})})}第二个坑:截图问题?再次运行服务器后,发现又出现了空白,而且这次的空白明显比上次多了……考虑了各方面的问题(我不喜欢绕太多),终于把问题锁定在page.screenshot这个链接里,因为headless是关掉的,所以我只是看着页面完全加载!还有一个空白,如果不是你的API,还能是谁?在一次操作中(搜索引擎+github+官网),发现一个有趣的代码块:https://github.com/ChromeDevT...其实可能是截图的高度受限了。过高也会出现类似的问题。当然,搞代码的我们也要讲究严谨。为了证明这一点,我用一些高度在1000-2000像素的网站进行了测试。大约100个网站,截图完美。这几乎也被证明是这里的问题。既然问题找到了,那就来解决吧。先祭出代码,让我们按照代码“事后诸葛亮”:letImageHeight=5000;//pc限制截图的高度if(!!!pageInfo.type){ImageHeight=1000;//mob限制截图的高度}lettempLength=Math.ceil(data.h/ImageHeight)//计算截了多少张letimagesArr=[]//存储我们截图的顺序for(leti=0,j=1;i
