java网页截图_java-selenium 实现网页截图
使用firefox浏览器无头模式在内存里渲染页面,然后用selenium操作浏览器并解析截图。需要安装firefox(也支持chrome),然后下载firefox 驱动 详见:https://github.com/mozilla/geckodriver/releases。下载完成后存放任意路径,然后将代码中的geckoDriver 改为驱动的实际路径即可。
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import sun.misc.BASE64Decoder;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
/**
* 网页截图
*/
public class WebPageScreenShot {
/**
* fireFox驱动路径
*/
String geckoDriver = "C:\\Program Files\\Python37\\geckodriver.exe";
String type="png";
public void loadPage(String logonUrl,String actionUrl,String resultPath) throws IOException, InterruptedException {
System.setProperty("webdriver.gecko.driver", geckoDriver);//chromedriver服务地址
FirefoxOptions firefoxOptions = new FirefoxOptions();
firefoxOptions.addArguments("-headless");
//firefoxOptions.addArguments("--start-maximized");
//firefoxOptions.addArguments("--start-fullscreen");
firefoxOptions.setHeadless(true);
FirefoxDriver driver = new FirefoxDriver(firefoxOptions); //新建一个WebDriver 的对象,但是new 的是FirefoxDriver的驱动
driver.get(logonUrl);//打开指定的网站
driver.findElement(By.id("J_username")).sendKeys(new String[]{"***"});
driver.findElement(By.id("J_password")).sendKeys(new String[]{"***"});
driver.findElement(By.id("loginBtn")).click();//登录
(new WebDriverWait(driver, 20)).until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".index-welcome-info")));//检查到登录成功
driver.get(actionUrl);//打开指定的网站
driver.manage().window().setSize(new Dimension(1900, 800));
//driver.manage().window().maximize();
String js1 = "return document.body.clientHeight.toString()";
String js1_result = driver.executeScript(js1) + "";
int height = Integer.parseInt(js1_result);
List files = new ArrayList();
int last_t = 0;
for (int i = 0; i < 20; ) {
int currentHeight = (i * height);
String js = "window.scrollTo(0," + currentHeight + ");";
driver.executeScript(js);
js1 = "return document.body.scrollHeight.toString()+','+document.body.scrollTop.toString()";
js1_result = driver.executeScript(js1) + "";
/**
* real_scroll_h, real_top = js1_result.split(',')[0], js1_result.split(',')[1]
* 22 #real_scroll_h, real_top 是当前滚动条长度和当前滚动条的top,作为是否继续执行的依据,由于存在滚动条向下拉动后会加载新内容的情况,所以需要以下的判断
* 23 #如果这次设置的top成功,则继续滚屏
*/
int real_scroll_h = Integer.parseInt(js1_result.split(",")[0]);
int real_top = Integer.parseInt(js1_result.split(",")[1]);
//#real_scroll_h, real_top 是当前滚动条长度和当前滚动条的top,作为是否继续执行的依据,由于存在滚动条向下拉动后会加载新内容的情况,所以需要以下的判断
if (real_top == currentHeight) {
// #如果这次设置的top成功,则继续滚屏
i++;
files.add(screenshot(driver).getAbsolutePath());
last_t = real_top;
} else {
// #如果本次设置失败,看这次的top和上一次记录的top值是否相等,相等则说明没有新加载内容,且已到页面底,跳出循环
if (real_top != last_t) {
last_t = real_top;
} else {
files.add(screenshot(driver).getAbsolutePath());
break;
}
}
}
driver.quit();//退出浏览器
merge(files.toArray(new String[]{}), type, resultPath);
}
private File screenshot(WebDriver driver) throws InterruptedException, IOException {
try {
/**
* WebDriver自带了一个智能等待的方法。
dr.manage().timeouts().implicitlyWait(arg0, arg1);
Arg0:等待的时间长度,int 类型 ;
Arg1:等待时间的单位 TimeUnit.SECONDS 一般用秒作为单位。
*/
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
}
Thread.sleep(10000);//等等页面加载完成
/**
* dr.quit()和dr.close()都可以退出浏览器,简单的说一下两者的区别:第一个close,
* 如果打开了多个页面是关不干净的,它只关闭当前的一个页面。第二个quit,
* 是退出了所有Webdriver所有的窗口,退的非常干净,所以推荐使用quit最为一个case退出的方法。
*/
byte[] imageBytes = (byte[]) ((FirefoxDriver) driver).getScreenshotAs(new OutputType() {
public Object convertFromBase64Png(String s) {
try {
return (new BASE64Decoder()).decodeBuffer(s);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public Object convertFromPngBytes(byte[] bytes) {
return bytes;
}
});
ByteArrayInputStream bytes = new ByteArrayInputStream(imageBytes);
BufferedImage image = ImageIO.read(bytes);
File file = File.createTempFile((new Random()).nextInt()+"",type);
ImageIO.write(image, "png", file);
return file;
}
/**
* Java拼接多张图片
*
* @param pics
* @param type
* @param dst_pic
* @return
*/
public static boolean merge(String[] pics, String type, String dst_pic) {
int len = pics.length;
if (len < 1) {
System.out.println("pics len < 1");
return false;
}
File[] src = new File[len];
BufferedImage[] images = new BufferedImage[len];
int[][] ImageArrays = new int[len][];
for (int i = 0; i < len; i++) {
try {
src[i] = new File(pics[i]);
images[i] = ImageIO.read(src[i]);
} catch (Exception e) {
e.printStackTrace();
return false;
}
int width = images[i].getWidth();
int height = images[i].getHeight();
ImageArrays[i] = new int[width * height];// 从图片中读取RGB
ImageArrays[i] = images[i].getRGB(0, 0, width, height,
ImageArrays[i], 0, width);
}
int dst_height = 0;
int dst_width = images[0].getWidth();
for (int i = 0; i < images.length; i++) {
dst_width = dst_width > images[i].getWidth() ? dst_width
: images[i].getWidth();
dst_height += images[i].getHeight();
}
if (dst_height < 1) {
System.out.println("dst_height < 1");
return false;
}
// 生成新图片
try {
// dst_width = images[0].getWidth();
BufferedImage ImageNew = new BufferedImage(dst_width, dst_height,
BufferedImage.TYPE_INT_RGB);
int height_i = 0;
for (int i = 0; i < images.length; i++) {
ImageNew.setRGB(0, height_i, dst_width, images[i].getHeight(),
ImageArrays[i], 0, dst_width);
height_i += images[i].getHeight();
}
File outFile = new File(dst_pic);
ImageIO.write(ImageNew, type, outFile);// 写图片
} catch (Exception e) {
e.printStackTrace();
return false;
}finally {
/*
删除临时文件
*/
for(String tempFile:pics){
File t=new File(tempFile);
t.delete();
}
}
return true;
}
public static void main(String[] args) throws IOException, InterruptedException {
WebPageScreenShot screenShot=new WebPageScreenShot();
screenShot.loadPage("******","*******","D:\\TEST.png");
}
}
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.sinitek.aim
java-selenium
1.0-SNAPSHOT
log4j
log4j
1.2.17
org.seleniumhq.selenium
selenium-java
3.141.59
java网页截图_java-selenium 实现网页截图相关推荐
- java 网页编码_JAVA如何判断网页编码
前言 最近做一个搜索项目,需要爬取很多网站获取需要的信息.在爬取网页的时候,需要获得该网页的编码,不然的话会发现爬取下来的网页有很多都是乱码. 分析 一般情况下,网页头信息会指定编码,可以解析head ...
- selenium 解析网页_用Selenium进行网页搜刮
selenium 解析网页 网页抓取系列 (WEB SCRAPING SERIES) 总览 (Overview) Selenium is a portable framework for testin ...
- selenium java截图_JAVA+selenium 截图操作
执行自动化测试的时候,我们常常会碰到测试执行失败的时候.但是失败我们不能只看执行失败代码,如果有截图的话,就能很明显直观的看到是哪个地方执行失败. 这里介绍两种方法,一种是selenium工具自带的截 ...
- java抓取图片_java 抓取网页的图片
//只能抓取一部分图片,像折800有些子路径的一行图片代码有好多个img,而且排列不规律,我的能力根本就没法截取下来 package test; import java.io.BufferedOutp ...
- java 网页 录音_Java+FlashWavRecorder实现网页录音并上传
[注意] [前言] 肯定有需求要网页录音,并且要上传.这奇葩需求. 然后找到了FlashWavRecorder, [原始版本号] 1.下载 在上面的地址下载zip解压之后,目录里面有个index.ht ...
- java 抓取网页乱码_java抓取网页乱码问题的处理
今天同事做了一个我们感觉很牛B的彩票预测程序,采用的是遗传算法实现,于是我"剽"来学习先,但是部署到我电脑上以后,就有问题了: 1.用她的抓取程序得到的网页内容出现乱码,导致数据无 ...
- java取网页数据_Java抓取网页数据(原来的页面+Javascript返回数据)
转载请注明出处. 有时候因为种种原因.我们须要採集某个站点的数据.但因为不同站点对数据的显示方式略有不同! 本文就用Java给大家演示怎样抓取站点的数据:(1)抓取原网页数据.(2)抓取网页Javas ...
- java 网站计数器_Java Bean实现网页来访计数器
1.JSP页: Document : index Created on : 2009-10-10, 14:47:46 Author : lucifer --%> /p> &qu ...
- java操作浏览器_java selenium 操作浏览器实例
导读热词 本篇文章介绍selenium 操作浏览器 阅读目录 浏览器最大化 前进,后退, 刷新 截图操作 模拟鼠标操作 杀掉Windows浏览器进程 浏览器最大化 前进,后退, 刷新 public s ...
- java testng 项目_JAVA+SELENIUM+MAVEN+TESTNG框架(二)新建项目
1.新建maven项目 2.下载selenium的jar包,放入maven依赖库中 3.新增testng依赖库,build path->add libirary->testng 4.查看自 ...
最新文章
- linux下mysql无法访问_Linux系统下无法访问mysql怎么办
- Another MySQL daemon already running with the same unix socket的解决
- python调用linux软键盘_在Linux中使用Python模拟键盘按键
- cad直线和圆弧倒角不相切_曲线操作-直线,圆弧,圆,倒斜角
- 引入外部js如何通知页面其编码格式
- ckeditor拖拽添加html,CKEditorCKFinder结合实现在线HTML编辑器
- 避免无法预知和依赖于实现环境的行为
- HTML基础学习(二)—CSS
- 软件系统设计-13-质量属性
- Python实现SIFT算法,附详细公式推导和代码
- 软件反破解的几个思路
- Internet网络行为学
- 条件语句的if语句的5种替代方法
- 用Google地图获取地图上某点的经纬度坐标
- 零假设(Null Hypothesis)
- 【加密技术】Java加密算法
- 快速了解会话管理三剑客cookie、session和JWT
- 微信app支付和微信网页支付 java
- 三极管集电极电阻的作用
- 简单的说一下pinia吧