`
liujiekasini0312
  • 浏览: 147435 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用selenium实现截图

 
阅读更多
package com.dinfo.hrb.util;


import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;


import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageOutputStream;
import javax.sql.rowset.serial.SerialBlob;


import org.apache.commons.io.FileUtils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.Point;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;


import com.dinfo.plugtool.common.AttributeCommon;
import com.dinfo.plugtool.dao.DBUtil;
import com.dinfo.plugtool.util.PropertyUtil;
import com.dinfo.plugtool.util.ScreenChecked;


/**
* 截图
* @author landmark
*
*/
public class ScreenShot implements Runnable {


private static SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd");
private WebDriver driver;
private String windowHandle;
private int counts;
private String name;
private int flags = 0;
private String file_path;
private int unique_code;


public ScreenShot() {}
public ScreenShot(String name,String file_path,int unique_code) {
this.name = name;
this.file_path = file_path;
this.unique_code = unique_code;
}

public void run(){

while(true){
Map<String, Object> data = this.getData();
try {
start(data);
} catch (Exception e) {
try { driver.close(); } catch (Exception e1) {}
driver = null;
}
}
}

private Map<String,Object> getData(){

Map<String, Object> map = null;
try {
map = DatasHandle.getData();
} catch (Exception e2) {
e2.printStackTrace();
return null;
}
if(map == null){
System.out.println("未获取到数据,线程等待");
flags++;
if(flags == 20){
flags = 0;
try {
driver.close();
} catch (Exception e) {}
driver = null;
}
if(driver == null){
System.out.println("线程沉睡10分钟");
String sql_5 = "UPDATE r_sitemap_new SET DTL_ID='' WHERE ISTAKESCREEN IN(2,3,4,5,9) AND PROCESS_DATE='"+sdf3.format(new Date())+"'";
try {
DBUtil.update(sql_5);
} catch (SQLException e) {
e.printStackTrace();
}
try { Thread.sleep(1000*60*9); } catch (InterruptedException e) {}
}
else{
System.out.println("线程沉睡30秒");
try { Thread.sleep(1000*30); } catch (InterruptedException e) {}
}
return null;
}
return map;
}

@SuppressWarnings("static-access")
public void start(Map<String, Object> map){

//检测是否需要截图
if(!ScreenChecked.checked(map)){
return;
}

if(driver == null){
init();
}
else{
try {
driver.getWindowHandles();
} catch (Exception e) {
try {
driver.close();
} catch (Exception e1) {}
init();
}
}

String id = map.get("ID").toString();
String product_name = map.get("PRODUCT_NAME").toString();
String url = map.get("URL").toString();
String date = map.get("PROCESS_DATE").toString();
String bank_name = map.get("BANK_NAME").toString();

//打开需截图的页面
try {
driver.get(url);
} catch (Exception e2) {
driver.get("http://www.baidu.com/");
return;
}
//再次重新打开截图页面(针对南京银行页面url重定向问题)
if(bank_name.equals("南京银行")){
try {
driver.get(url);
} catch (Exception e2) {
driver.get("http://www.baidu.com/");
return;
}
}
if(bank_name.equals("农业银行") && (product_name.equals("微博"))){
try {
Thread.currentThread().sleep(6000);
} catch (InterruptedException e) {}
}
if(bank_name.equals("农业银行") &&
product_name.equals("泰康人寿保险股份有限公司")){
JavascriptExecutor js = (JavascriptExecutor)driver;
int i = 0;
int j = 100;
for (; i < 3000;) {
js.executeScript("scrollTo(" + i + "," + j + ")");
i += 100;
j += 100;
}
}

//检测页面是否是360主页
boolean c = ScreenChecked.checkUrlISMainPage(driver);
if(c){
System.out.println("页面检测不通过,不满足截图条件-----"+id);
DatasHandle.update_404(id);
driver.get("http://www.baidu.com/");
return;
}

//跳转弹出框,关闭弹出框
try {
Alert alert = driver.switchTo().alert();
alert.dismiss();
} catch (Exception e2) {}

//关闭多余弹出页
Set<String> set = null;
try {
set = driver.getWindowHandles();
} catch (Exception e1) {
flags++;
if(flags == 20){
flags = 0;
try { driver.close(); } catch (Exception e) {}
driver = null;
}
return;
}

try {
if (set != null && set.size() > 1) {

for (String string : set) {
if (string.equals(windowHandle)) {
continue;
} else {
driver.switchTo().window(string);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.close();
}
}
driver.switchTo().window(windowHandle);
}
} catch (Exception e1) {
e1.printStackTrace();
}

//页面检测:是否是404页面,或站内自定义错误页面
try {
PageCheck.checked(driver);
} catch (Exception e4) {
System.out.println("页面检测不通过,不满足截图条件-----"+id);
//检测是否属于站内页面异常
boolean b = PageCheck.checkURL(url,date);
if(b){
DatasHandle.update_itself(id);
}
else{
DatasHandle.update_404(id);
}
driver.get("http://www.baidu.com/");
return;
}

//截图
String path = "";
try {
byte[] b = takeScreenshot();
bytesToImageFile(b);
while (true) {
//获取图片文件大小
File file_ = new File(file_path);
long length = file_.length();
System.out.println(length);
//如果图片大于指定大小
int size = Integer.parseInt(PropertyUtil.getValue("max_size"));
if (length > size * 1024L) {
//进行图片压缩
path = ImageCompressUtil.zipImageFile(file_path, 0,
0, 0.8F, "_" + unique_code);
if(new File(path).length() > length){
break;
}
try {
FileUtils.copyFile(new File(path), new File(file_path));
} catch (Exception e) {
e.printStackTrace();
}
new File(path).delete();
} else {
break;
}
}

byte[] bytes = handle("");
SerialBlob blob = new SerialBlob(bytes);
System.out.println(name+product_name+"截图成功");
counts++;
System.err.println(name + "截取图片共计《" + counts + "》张");
String insert = "REPLACE INTO "+AttributeCommon.image_tablename+"(id,image,PROCESS_DATE) values(?,?,?)";
DatasHandle.insert(insert,id,blob,date,url);
} catch (Exception e) {
e.printStackTrace();
}
driver.get("http://www.baidu.com/");
try {
new File(path).delete();
} catch (Exception e) {
e.printStackTrace();
}
try {
new File(file_path).delete();
} catch (Exception e) {
e.printStackTrace();
}
}


/**
* 将byte数组写入图片文件中
* @param b
*/
private void bytesToImageFile(byte[] b){

try {
FileImageOutputStream imageOutput = new FileImageOutputStream(new File(file_path));
imageOutput.write(b, 0, b.length);
imageOutput.close();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 重新加载压缩后的图片
* @return
* @throws IOException
*/
private byte[] handle(String path) throws IOException{

String real_path = "";
if(path==null || path.equals("")){
real_path = file_path;
}
else{
real_path = path;
}
BufferedInputStream in = null;
ByteArrayOutputStream out = null;
try {
in = new BufferedInputStream(new FileInputStream(new File(real_path)));
out = new ByteArrayOutputStream(1024);

byte[] temp = new byte[1024];
int size = 0;
while ((size = in.read(temp)) != -1) {
out.write(temp, 0, size);
}
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
}
return out.toByteArray();
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

/**
* Read an input stream into a string
* @param in
* @return
* @throws IOException
*/
public String streamToString(InputStream in) throws IOException {
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
for (int n; (n = in.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
return out.toString();
}


public byte[] takeScreenshot() throws IOException {
TakesScreenshot takesScreenshot = (TakesScreenshot) driver;
return takesScreenshot.getScreenshotAs(OutputType.BYTES);
}


public File takeScreenshot1() throws IOException {
TakesScreenshot takesScreenshot = (TakesScreenshot) driver;
return takesScreenshot.getScreenshotAs(OutputType.FILE);
}


public BufferedImage createElementImage(WebElement webElement)
throws IOException {
// 获得webElement的位置和大小。
Point location = webElement.getLocation();
Dimension size = webElement.getSize();
// 创建全屏截图。
BufferedImage originalImage = ImageIO.read(new ByteArrayInputStream(
takeScreenshot()));
// 截取webElement所在位置的子图。
BufferedImage croppedImage = originalImage.getSubimage(location.getX(),
location.getY(), size.getWidth(), size.getHeight());
return croppedImage;
}


public void snapshot(TakesScreenshot drivername, String filepath) {
// this method will take screen shot ,require two parameters ,one is
// driver name, another is file name


File scrFile = drivername.getScreenshotAs(OutputType.FILE);
// Now you can do whatever you need to do with it, for example copy
// somewhere
try {
System.out.println("save snapshot path is:" + filepath);
FileUtils.copyFile(scrFile, new File(filepath));
} catch (IOException e) {
System.out.println("Can't save screenshot");
e.printStackTrace();
} finally {
System.out.println("screen shot finished");
}
}

/**
* 初始化浏览器
*/
private void init() {


while (true) {
try {
System.out.println(name+"初始化浏览器");
System.setProperty("webdriver.firefox.bin",
PropertyUtil.getValue("path"));
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
windowHandle = driver.getWindowHandle();
return;
} catch (Exception e) {
try {
driver.close();
} catch (Exception e2) {
e2.printStackTrace();
}
driver = null;
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
}
分享到:
评论

相关推荐

    [python]利用Selenium实现网页全屏截图+部分截图并web实现

    本教程将深入探讨如何使用Selenium实现网页的全屏截图以及选取特定区域进行截图,并通过Web服务展示这些截图。 首先,我们需要安装Selenium库。在命令行或终端中输入以下命令来安装: ```bash pip install ...

    python爬虫 使用selenium 实现中英互译

    在这个项目中,我们专注于使用Selenium实现中英互译功能,这对于处理网页上的多语言内容非常有用。 首先,该项目提供了两种版本的翻译器:一个可执行的exe文件和一个Python源代码文件(translater.exe和translater....

    python+selenium实现自动化百度搜索关键词

    通过python配合爬虫接口利用selenium实现自动化打开chrome浏览器,进行百度关键词搜索。 1、安装python3,访问官网选择对应的版本安装即可,最新版为3.7。 2、安装selenium库。 使用 pip install selenium 安装即可...

    知网-基于Chrome的selenium实现知网爬虫.zip

    在这个名为“知网-基于Chrome的selenium实现知网爬虫.zip”的压缩包中,提供的正是一个使用Selenium库来操控Chrome浏览器进行网页自动化操作的知网爬虫实例。 Selenium是一个强大的Web自动化测试工具,同时也常被...

    python使用selenium实现批量文件下载

    ### Python使用Selenium实现批量文件下载 #### 背景与需求 在互联网开发与数据抓取领域,网络爬虫技术被广泛应用于自动化收集网络上的数据。这些数据可能包括文本、图片、视频甚至文件等。当面对需要批量下载文件...

    python爬虫利用selenium爬取淘宝和京东商品信息

    python爬虫利用selenium爬取淘宝和京东商品信息。实现了无头浏览器进行爬取,即不需要启动自己的浏览器即可完成爬取信息的功能,而且避免了网站的反爬机制。python爬虫利用selenium爬取淘宝和京东商品信息。实现了...

    selenium实现页面对象实例

    本实例将深入探讨如何使用 Selenium 实现页面对象模式(Page Object Model, POM),这是一种良好的测试代码组织策略,可以提高代码的可维护性和可重用性。 页面对象模型是一种设计模式,它的核心思想是将网页的UI...

    C# 利用Selenium实现浏览器自动化操作的示例代码

    总之,通过C#和Selenium,我们可以实现一系列自动化测试场景,包括但不限于模拟用户登录、填写表单、点击按钮、监控网页变化等。同时,借助log4net记录测试日志,以及使用Queue管理处理流程,能够构建出更加健壮和...

    Selenium模拟浏览器万能爬虫指南.pdf

    Selenium是一个非常强大的自动化测试工具,它广泛应用于Web...在学习和使用Selenium时,开发者需要重点关注其安装配置、页面元素定位和框架搭建等方面的细节,这将有助于更好地利用Selenium实现高质量的数据爬取任务。

    利用Python库Selenium实现从Journal_Citation_Reports网站爬取期刊_

    利用Python库Selenium实现从Journal_Citation_Reports网站爬取期刊_Crawler_Journal_Abbreviation

    用selenium+打码平台实现用户注册.rar

    本教程将深入探讨如何利用Selenium结合打码平台来实现用户注册的自动化过程,从而提高工作效率并解决验证码识别的难题。 首先,我们需要了解Selenium的基本用法。Selenium WebDriver允许我们通过编程方式控制浏览器...

    selenium-selenium-4.5.0.zip源码

    深入研究 Selenium 4.5.0 的源码,不仅有助于理解自动化测试的基本原理,还能帮助开发者更好地利用 Selenium 的功能,解决实际测试中的问题,甚至为框架贡献自己的代码。通过分析源码,我们可以学习到软件设计模式、...

    利用Python和Selenium实现小猿口算应用自动答题

    本文详细介绍了如何利用 Python 编程语言以及 Selenium 工具,对在线平台小猿口算进行自动化处理的具体流程,涵盖自动化的登录认证步骤以及根据题意解答题目等环节的实现技巧。它具体地指导如何设定 Webdriver,怎样...

    selenium的python实现

    **Selenium Python 实现详解** Selenium 是一个广泛使用的开源自动化测试框架,它允许开发者编写脚本来模拟用户在Web浏览器中的交互行为。Selenium 支持多种编程语言,包括Python,使得测试脚本的编写变得简洁易懂...

    利用selenium 3.7和python3添加cookie模拟登陆的实现.pdf

    在Python 3环境中,我们可以利用Selenium库来模拟用户行为,包括登录网站。以下将详细介绍如何通过添加cookie实现模拟登录。 首先,了解Selenium 3.7版本的变化。相较于之前的版本,Selenium RC已被移除,Webdriver...

    使用selenium进行web测试项目框架

    本项目框架主要探讨如何利用Java语言来实现基于Selenium的Web自动化测试。 **一、Selenium简介** Selenium是一个开源的自动化测试框架,支持多种编程语言,如Java、Python、C#等。它提供了一套丰富的API,用于模拟...

    Python应用实战代码-如何用Selenium 实现反反爬方案

    本篇将重点讲解如何利用Python的Selenium库来实施反反爬策略,帮助我们更有效地抓取网页数据。 Selenium是一个强大的自动化测试工具,它可以模拟真实用户的行为,如点击、滚动、填写表单等,因此在应对JavaScript...

    Selenium_v2.5

    在实际应用中,开发人员和测试工程师可以利用Selenium_v2.5提供的API和工具,结合持续集成工具(如Jenkins)来构建自动化测试流水线,实现测试脚本的自动编译、执行和结果分析,从而提高软件开发的质量和效率。...

    Selenium实现登录cms系统进行自动化测试

    【Selenium实现登录CMS系统进行自动化测试】 在IT行业中,自动化测试是提升效率、确保产品质量的重要手段,尤其在持续集成和持续交付(CI/CD)流程中占据着核心地位。Selenium是一个广泛使用的Web应用程序自动化测试...

    java使用Selenium模拟登陆58(验证码登陆&密码登陆)若快平台识别文字点击验证码Demo

    综上所述,这个Java项目利用Selenium结合若快平台的OCR服务,实现了对58同城网站的模拟登录,覆盖了自动化测试、验证码识别以及动态交互等多个方面,对于理解和应用Web自动化测试有很好的参考价值。

Global site tag (gtag.js) - Google Analytics