java利用浏览器进行截图实例教程
前言
最近工作中遇到一个需求,需要实现截图功能,断断续续查找资料、验证不同的实现方法终于算基本搞定了页面截图,因为中间过程曲折花费较多时间,分享出来帮助大家快速实现截图
为什么选用浏览器进行截图
截图可以实现的方式有很多,比如:
硒Html单位HTMl 2图像、等但是这些实现的截图效果都不好硒。只能实现截屏,不能截取整个页面,而超文本标记语言单元、html 2图像对射流研究…的支持效果并不好,截下来的图会有很多空白芬托姆js。就是万精油了,既能截取整个页面,对射流研究…支持的效果又好PlantomJs提供了如半铸钢钢性铸铁(铸造半钢)选择器、DOM操作、JSON、HTML5、Canvas、SVG等PhantomJS。的用处很广泛,如网络监控、网页截屏、页面访问自动化、无需浏览器的网测试等,这里只用到网页截屏。
前期准备
安装幻影队。老兄操作系统
啤酒安装浏览器命令行的方式进行截图
安装以后我们就可以小试牛刀了
打开终端,输入以下命令:
/用户/何甜甜/软件s/虚拟js/bin/虚拟js/user/何甜甜/软件s/幻影js/示例/栅格化。js https://金爵。im/post/5bb 24 bafe 51d 450 e 4437 FD 96/Users/何甜甜/Desktop/金爵-command.png查看效果
发现图片没有加载好
来看以下刚刚的命令行:
/用户/何甜甜/软件/幻影/bin/幻影:幻影可执行文件保存地址/用户/何甜甜/软件/幻影/示例/光栅化文件地址
这段命令可以理解为用浏览器去运行栅格化。射流研究…文件,所以要想解决图片空白的问题我们需要去看一下栅格化。射流研究…文件。
使用"严格";var page=require('网页')。create()、system=require('system '),地址、输出、大小、页面宽度、页面高度;if(系统。啊。长度3 | |系统。啊。长度5){控制台。日志('用法:栅格化。js网址文件名[纸张宽度*纸张高度|纸张格式][缩放]);console.log('论文(pdf输出)示例: ' 5英寸* 7.5英寸',' 10厘米* 20厘米',' A4 ',' Letter ' ');console.log(' image (png/jpg输出)示例: '1920px '整页,窗口宽度1920年px’;控制台。日志(' 800像素* 600像素'窗口,剪裁为800 x600’;幻影出口(1);} else { address=system。args[1];输出=系统。args[2];佩奇。视口大小={宽度: 600,高度: 600 };if(系统。啊。长度3系统。参数[2].substr(-4)===' .pdf') { size=system.args[3].split(' * ');page.paperSize=size.length===2?{ width: size[0],height: size[1],边距: ' 0px ' } : { format : system。args[3],方向: '纵向,边距3360 ' 1cm ' };} else if(系统。啊。长度3系统。参数[3].substr(-2)=' px '){ size=system。参数[3].split(' * ');if(大小。length===2){ page width=ParSeint(size[0],10);pageHeight=parseInt(大小[1],10);佩奇。视口大小={宽度:页宽,高度:页高};page.clipRect={ top: 0,left: 0,width: pageWidth,height : page height };} else { console.log('size: ',system。args[3]);页面宽度=ParSeint(系统。args[3],10);页面高度=ParSeint(页面宽度* 3/4,10);//这是和任何控制台.日志一样好的假设(' pageHeight: ',页面高度);佩奇。视口大小={宽度:页宽,高度:页高};} } if(系统。啊。长度4){页面。zoomfactor=system。args[4];} page.open(地址,功能(状态){ if(状态!=="成功”{控制台。日志('无法加载地址!');幻影出口(1);} else { window.setTimeout(函数(){ page.render(输出));幻影。exit();}, 200);} });}尝试一:
对佩奇。视口大小={宽度: 600,高度: 600 };产生了疑问
调整十次高度,你会发现基本上是一个完美的截图。然而,如果页面非常短,你会发现瑕疵,在下面留下一大块空白。原因:页面。viewportsize={宽度: 600,高度: 600 };设置初始打开浏览器的大小。通过增加该值,可以加载js。如果我们能得到实际的页面大小,设置高度大小,但是不行,我不能。
而且事先设置一个大的高度值,比如30000,是不能接受的,因为底部留白是不能接受的
尝试两个:
在窗口前添加以下代码
page . evaluate(function(){ scrollBy(0,18000);});我不得不在求值时使用for循环。前端渣真的不知道怎么改,我就放弃了
在java代码模式下截图
需要依赖关系
依赖关系groupIdorg.seleniumhq.selenium/groupId artifactIdselenium-Java/artifactId版本2 . 45 . 0/版本/依赖关系依赖关系group idcom . codeborne/group id artifactIdphantomjsdriver/artifactId版本1 . 2 . 1/版本!-这将永远在后面-排除排除groupIdorg.seleniumhq.selenium/groupId人工硒-Java/人工硒/排除排除groupIdorg.seleniumhq.selenium/groupId人工硒-远程驱动程序/人工硒/排除/排除/依赖代码实现
公共类phantom jstest 2 { public static void main(string[]args)引发中断的异常,io exception {//设置必要的参数desired captions d caps=new desired captions();//ssl证书支持dcaps . setcapability(' acceptslcerts ',true);//截图支持dcaps.set功能('截图',true);//css搜索支持dcaps . set capability(' CSS selectorsenabled ',true);//js支持dcaps . setjavascriptenabled(true);//驱动程序支持(第二个参数表示您的phantomjs引擎所在的路径)dcaps . set capability(phantom js driver service . phantom js _ executive _ path _ property,'/users/和田/software/phantom js/bin/phantom js ');//创建无接口浏览器对象Phantom JSDriver=New Phantom JSDriver(DCaps);//设置隐式等待(全局)驱动程序. manage()。超时()。隐式等待(1,time unit . seconds);长启动=system . CurrentMemillis();//打开页面驱动程序. get(' https://juejin . im/post/5bb 24 bafe 51d 450 e 4437 FD 96 ');thread . sleep(30 * 1000);JavascriptExecutor js=驱动程序;for(int I=0;i 33I){ js . executescript(' window . scrollby(0,1000)');//休眠10秒,等待js加载。thread . sleep(5 * 1000);}//指定OutputType。FILE作为参数,并将其传递给getScreenshotAs()方法,这意味着截取的屏幕将作为文件返回。文件srcFile=((TakesScreenshot)驱动程序)。getScreenshotAs(输出类型。FILE);thread . sleep(3000);//使用FileUtils工具类的copyFile()方法保存getScreenshotAs()返回的文件对象fileutils.copyfile (srcfile,new file('/users/何甜甜/desktop/金爵-01 . png ');system . out . println(' time:'(system。currenttimemillis ()-start)'毫秒');}}笔记已经够详细了,就不多说了。唯一要说的是,页面是通过执行js代码来滑动的,每一张幻灯片都将确保有时间通过睡眠来加载js。会调用33张幻灯片,因为phantomjs截取的最大高度是32767 px(int 32位的最大整数),所以滑动33次可以保证可以截取的最大页面的js已经加载。
附件:window.scrollBy(0,1000)和window.scrollTo(0,1000)的区别
窗户。scrollby (0,1000)窗口。scrollby (0,1000)此处页面滑动1000 1000px窗口。scrollto (0,1000)窗口。scrollto (0,1000)此处的页面滑动到1000像素
Window.scrollto (0,document.body.scrollheight可以滑动到页面底部。不选择它有两个原因:
1)滑动到底部js将来不及加载
2)有些页面没有底部,可以一直滑动加载
注意:js在这里加载太晚了,这意味着想要拦截页面的js加载太晚了
这种方法的缺点是:耗时。果然,你不能既吃蛋糕又吃它。截取一张图片大约需要四分钟
摘要
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。
版权声明:java利用浏览器进行截图实例教程是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。