JAVA指定区域内截图_Java+Selenium根据元素创建指定区域截图——Element快照
Java+Selenium根据元素创建指定区域截图——Element快照
执行步骤
获取全屏的截图
File screen = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
BufferedImage image = ImageIO.read(screen);
获取element的宽高以及坐标
创建一个WebElement元素,并且获取元素的高度,宽度,坐标信息
并且使用元素的高度和宽度创建一个矩形
WebElement element = driver.findElement(By.id("su"));
//获取元素的高度、宽度
int width = element.getSize().getWidth();
int height = element.getSize().getHeight();
//创建一个矩形使用上面的高度,和宽度
Rectangle rect = new Rectangle(width, height);
//元素坐标
Point p = element.getLocation();
裁剪全屏截图
最后根据元素位置对整个图片进行裁剪,创建一个element快照
如果元素过大,超过全屏截图的范围,这一步会报错(y + height) is outside or not,x+width同样也会报错
try{
BufferedImage img = image.getSubimage(p.getX(), p.getY(), rect.width, rect.height);
ImageIO.write(img, "png", screen);
}catch (Exception e){
e.printStackTrace();
}
元素过大的解决方案
创建全屏截图时,根据滚动条创建长截图
创建多个截图,拼接成长截图
退而求其次,只截图全屏可见区域
方法1和方法2暂时不作解释
这里对方法3描述一下
首先对元素的宽高,point的坐标简单化
int w = rect.width; //指定矩形区域的宽度
int h = rect.height;//指定矩形区域的高度
int x = p.getX(); //指定矩形区域左上角的X坐标
int y = p.getY(); //指定矩形区域左上角的Y坐标
初始化浏览器的分辨率
//driver的分辨率,这里设置1920*1080
int w_driver = 1920;
int h_driver = 1080;
如果元素的宽加上坐标X或者元素的高加上坐标Y超过浏览器的分辨率,对元素的大小进行调整
if ( y + h > h_driver){ //(y + height) is outside or not
h = h- (y + h - h_driver);
}
if (x + w > w_driver){
w = x - (x + w - w_driver); //(x + width) is outside or not
}
开始裁剪
try{
BufferedImage img = image.getSubimage(x, y, w, h);
ImageIO.write(img, "png", screen);
}catch (IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
完整代码
package common;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.Point;
import org.openqa.selenium.chrome.ChromeDriver;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.awt.image.RasterFormatException;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ElementSnapshot {
public static WebDriver driver;
/**
* main()方法调用
*
*/
public static void main(String[] args) throws Exception {
driver = new ChromeDriver();
driver.get("https://www.baidu.com");
driver.manage().window().maximize();
WebElement element = driver.findElement(By.id("su"));
String fileName = "filename";
//创建元素快照
elementSnapshot(driver,element);
//移动图片到指定位置
FileUtils.copyFile(elementSnapshot(driver,element), new File(fileName, System.currentTimeMillis()+".png"));
}
/**
* 根据Element截图指定区域方法
*
* @param driver
* @param element 截图区域
* @throws Exception
*/
public static File elementSnapshot(WebDriver driver, WebElement element) throws Exception {
//创建全屏截图
File screen = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
BufferedImage image = ImageIO.read(screen);
//获取元素的高度、宽度
int width = element.getSize().getWidth();
int height = element.getSize().getHeight();
//创建一个矩形使用上面的高度,和宽度
Rectangle rect = new Rectangle(width, height);
//元素坐标
Point p = element.getLocation();
//对前面的矩形进行操作
//TODO 使用可以截全图的方法(滚动条),暂未找到方式
int w = rect.width; //指定矩形区域的宽度
int h = rect.height;//指定矩形区域的高度
int x = p.getX(); //指定矩形区域左上角的X坐标
int y = p.getY(); //指定矩形区域左上角的Y坐标
//driver的分辨率,这里设置1920*1080
int w_driver = 1920;
int h_driver = 1080;
System.out.println("width:" + w);
System.out.println("height:"+ h);
System.out.println("x:"+ x);
System.out.println("y:"+ y);
System.out.println("y+height:"+(y + h));
System.out.println("x+width:"+ (x + w));
/**
* 如果Element的Y坐标值加上高度超过driver的高度
* 就会报错(y + height) is outside or not
* 退而求其次,调整图片的宽度和高度, 调整到适合driver的分辨率
* 此时会截图driver可见的元素区域快照
* TODO 如果能找到跨滚动条截图的方式,可以不用裁剪
*/
try{
if ( y + h > h_driver){
h = h- (y + h - h_driver); //
System.out.println("修改后的height:" + h);
System.out.println("修改后的y+height:"+ (y+h));
}
//(x + width) is outside or not
if (x + w > w_driver){
w = x - (x + w - w_driver);
System.out.println("修改后的width:"+ w);
System.out.println("修改后的x+width:"+ (x+w));
}
BufferedImage img = image.getSubimage(x, y, w, h);
ImageIO.write(img, "png", screen);
System.out.println("Screenshot By element success");
}catch (IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
return screen;
}
}
JAVA指定区域内截图_Java+Selenium根据元素创建指定区域截图——Element快照相关推荐
- R语言使用seq函数生成数据序列、seq函数在指定范围内生成固定长度的序列、指定数据序列的第一个数值、最后一个数值以及另外一个数据序列(along.with)
R语言使用seq函数生成数据序列.seq函数在指定范围内生成固定长度的序列.指定数据序列的第一个数值.最后一个数值以及另外一个数据序列(along.with) 目录
- java 对象多属性排序_java list按照元素对象的指定多个字段属性进行排序
package com.enable.common.utils; import java.lang.reflect.Field; import java.text.NumberFormat; impo ...
- java 数据透视表 组件_Java在Excel中创建透视表方法解析
本文内容介绍通过Java程序在Excel表格中根据数据来创建透视表. 环境准备 需要使用Excel类库工具-Free Spire.XLS for Java,这里使用的是免费版,可通过官网下载Jar包并 ...
- JavaScript基础13-day15【DOM增删改、DOM添加删除记录、操作内联样式、获取元素的样式、DOM Element 对象、滚动条练习、事件对象、div跟随鼠标移动、事件冒泡】
学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...
- selenium java截图_JAVA+selenium 截图操作
执行自动化测试的时候,我们常常会碰到测试执行失败的时候.但是失败我们不能只看执行失败代码,如果有截图的话,就能很明显直观的看到是哪个地方执行失败. 这里介绍两种方法,一种是selenium工具自带的截 ...
- java截取固定大小图片_JAVA技巧(长字符串按指定长度截取)
在web开发中,会遇到这样一个问题,想让某个内容全部保持在一定长度范围内,未超出的行全部显示,超长的行只允许显示一定的长度,结尾用省略号代替. 粗想一下,实现这个功能很容易,直接取字符串的长度(用le ...
- java 远程debug 内网_java jdb remote debug - java远程调试
简介 用log来做调试的方法低效茫目 远程调试是jdk自带的一个有利调试工具,可以快速定位问题 在工作机上使用eclipse来自带的remote debug 问题 运维禁止使用remote debug ...
- java 二维数组位置_java 找到二维数组指定元素的位置
这个是代码编译时没有问题运行出错.主要功能是首先将txt格式文本导入二维数组,然后在二维数组中查找指定元素的行号和列号.运行结果出错显示为:importjava.util.*;importjava.i ...
- java等待页面加载_java selenium (十三) 智能等待页面加载完成
我们经常会碰到用selenium操作页面上某个元素的时候, 需要等待页面加载完成后, 才能操作. 否则页面上的元素不存在,会抛出异常. 或者碰到AJAX异步加载,我们需要等待元素加载完成后, 才能操 ...
- java模拟网易邮箱登录_java+selenium 实现网易邮箱登录功能
今天学习selenium ,折腾了一整天,写个笔记记录一下今天的错误. 我用的是java+webdriver,在eclipse中运行,今天的学习是进行网易邮箱的登录功能.一开始代码运行一直报找不到元素 ...
最新文章
- 自动获取mysql建表语句_脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明...
- PostgreSQL_row_number() over()
- java代码_阿里资深工程师教你如何优化 Java 代码!
- Win32程序开发流程--《深入浅出MFC》
- gradle版本_Gradle和Maven的主要区别
- [003]Reference in C++---C++引用基础知识篇
- Qt数据库编程_基本
- java读取csv文件
- 初探System.Threading.Channels
- 浅谈JSP表单中的form传值
- SVN代码回滚命令之---merge的使用
- Swift - 43 - 继承, 多态, 析构函数
- 多个线程交替打印ABC,打印10次
- Everything常见问题及搜索技巧
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌CSS:将CSS封装到程序集中
- 谷歌地图离线地图开发教程
- cad编程c语言,基于C.NET的AutoCAD二次开发简版.pdf
- 网吧防火墙选购(转)
- win10系统迁移到固态硬盘ssd
- 【winRAR去广告弹窗】
热门文章
- IC面试数字电路基础
- Idea打包jar 及jar包反编译为代码的多种方法
- python对比多个excel数据_python-pandas两个相同格式的excel对比输出不同内容
- matlab中pid参数整定,基于MATLAB/Simulink的PID参数整定
- 人口普查数据有疑问???
- 自动化测试工程师简历模板
- oracle erp atp是什么意思,三种ATP(ERP原理与应用教程第2版)
- 基于SSM+MySQL+Bootstrap的停车场管理系统
- 计算机视觉 - python实现求解homography矩阵
- 利用EMCP物联网云平台通过手机APP和微信监控西门子S7-1200PLC云组态