使用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 实现网页截图相关推荐

  1. java 网页编码_JAVA如何判断网页编码

    前言 最近做一个搜索项目,需要爬取很多网站获取需要的信息.在爬取网页的时候,需要获得该网页的编码,不然的话会发现爬取下来的网页有很多都是乱码. 分析 一般情况下,网页头信息会指定编码,可以解析head ...

  2. selenium 解析网页_用Selenium进行网页搜刮

    selenium 解析网页 网页抓取系列 (WEB SCRAPING SERIES) 总览 (Overview) Selenium is a portable framework for testin ...

  3. selenium java截图_JAVA+selenium 截图操作

    执行自动化测试的时候,我们常常会碰到测试执行失败的时候.但是失败我们不能只看执行失败代码,如果有截图的话,就能很明显直观的看到是哪个地方执行失败. 这里介绍两种方法,一种是selenium工具自带的截 ...

  4. java抓取图片_java 抓取网页的图片

    //只能抓取一部分图片,像折800有些子路径的一行图片代码有好多个img,而且排列不规律,我的能力根本就没法截取下来 package test; import java.io.BufferedOutp ...

  5. java 网页 录音_Java+FlashWavRecorder实现网页录音并上传

    [注意] [前言] 肯定有需求要网页录音,并且要上传.这奇葩需求. 然后找到了FlashWavRecorder, [原始版本号] 1.下载 在上面的地址下载zip解压之后,目录里面有个index.ht ...

  6. java 抓取网页乱码_java抓取网页乱码问题的处理

    今天同事做了一个我们感觉很牛B的彩票预测程序,采用的是遗传算法实现,于是我"剽"来学习先,但是部署到我电脑上以后,就有问题了: 1.用她的抓取程序得到的网页内容出现乱码,导致数据无 ...

  7. java取网页数据_Java抓取网页数据(原来的页面+Javascript返回数据)

    转载请注明出处. 有时候因为种种原因.我们须要採集某个站点的数据.但因为不同站点对数据的显示方式略有不同! 本文就用Java给大家演示怎样抓取站点的数据:(1)抓取原网页数据.(2)抓取网页Javas ...

  8. java 网站计数器_Java Bean实现网页来访计数器

    1.JSP页: Document   : index Created on : 2009-10-10, 14:47:46 Author     : lucifer --%> /p> &qu ...

  9. java操作浏览器_java selenium 操作浏览器实例

    导读热词 本篇文章介绍selenium 操作浏览器 阅读目录 浏览器最大化 前进,后退, 刷新 截图操作 模拟鼠标操作 杀掉Windows浏览器进程 浏览器最大化 前进,后退, 刷新 public s ...

  10. java testng 项目_JAVA+SELENIUM+MAVEN+TESTNG框架(二)新建项目

    1.新建maven项目 2.下载selenium的jar包,放入maven依赖库中 3.新增testng依赖库,build path->add libirary->testng 4.查看自 ...

最新文章

  1. linux下mysql无法访问_Linux系统下无法访问mysql怎么办
  2. Another MySQL daemon already running with the same unix socket的解决
  3. python调用linux软键盘_在Linux中使用Python模拟键盘按键
  4. cad直线和圆弧倒角不相切_曲线操作-直线,圆弧,圆,倒斜角
  5. 引入外部js如何通知页面其编码格式
  6. ckeditor拖拽添加html,CKEditorCKFinder结合实现在线HTML编辑器
  7. 避免无法预知和依赖于实现环境的行为
  8. HTML基础学习(二)—CSS
  9. 软件系统设计-13-质量属性
  10. Python实现SIFT算法,附详细公式推导和代码
  11. 软件反破解的几个思路
  12. Internet网络行为学
  13. 条件语句的if语句的5种替代方法
  14. 用Google地图获取地图上某点的经纬度坐标
  15. 零假设(Null Hypothesis)
  16. 【加密技术】Java加密算法
  17. 快速了解会话管理三剑客cookie、session和JWT
  18. 微信app支付和微信网页支付 java
  19. 三极管集电极电阻的作用
  20. 简单的说一下pinia吧

热门文章

  1. C#使用Access2003
  2. 高斯-克吕格(Gauss-Kruger)投影与UTM投影的在ArcGIS中的区别
  3. 家具建材行业B2B电商平台解决方案
  4. R语言实战-读书笔记(第1 章 R语言介绍)
  5. 腾讯人力资源体系全曝光 附下载
  6. Appium并发测试
  7. 如何把安卓系统刷成linux,废旧Android手机如何改造成Linux服务器?
  8. 基于STM32F767通过STM32CubeMX实现ModbusTCP
  9. 华为大数据平台FusionInsight HD部署中遇到的问题汇总
  10. 开源项目-his医院信息系统