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快照相关推荐

  1. R语言使用seq函数生成数据序列、seq函数在指定范围内生成固定长度的序列、指定数据序列的第一个数值、最后一个数值以及另外一个数据序列(along.with)

    R语言使用seq函数生成数据序列.seq函数在指定范围内生成固定长度的序列.指定数据序列的第一个数值.最后一个数值以及另外一个数据序列(along.with) 目录

  2. java 对象多属性排序_java list按照元素对象的指定多个字段属性进行排序

    package com.enable.common.utils; import java.lang.reflect.Field; import java.text.NumberFormat; impo ...

  3. java 数据透视表 组件_Java在Excel中创建透视表方法解析

    本文内容介绍通过Java程序在Excel表格中根据数据来创建透视表. 环境准备 需要使用Excel类库工具-Free Spire.XLS for Java,这里使用的是免费版,可通过官网下载Jar包并 ...

  4. JavaScript基础13-day15【DOM增删改、DOM添加删除记录、操作内联样式、获取元素的样式、DOM Element 对象、滚动条练习、事件对象、div跟随鼠标移动、事件冒泡】

    学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...

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

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

  6. java截取固定大小图片_JAVA技巧(长字符串按指定长度截取)

    在web开发中,会遇到这样一个问题,想让某个内容全部保持在一定长度范围内,未超出的行全部显示,超长的行只允许显示一定的长度,结尾用省略号代替. 粗想一下,实现这个功能很容易,直接取字符串的长度(用le ...

  7. java 远程debug 内网_java jdb remote debug - java远程调试

    简介 用log来做调试的方法低效茫目 远程调试是jdk自带的一个有利调试工具,可以快速定位问题 在工作机上使用eclipse来自带的remote debug 问题 运维禁止使用remote debug ...

  8. java 二维数组位置_java 找到二维数组指定元素的位置

    这个是代码编译时没有问题运行出错.主要功能是首先将txt格式文本导入二维数组,然后在二维数组中查找指定元素的行号和列号.运行结果出错显示为:importjava.util.*;importjava.i ...

  9. java等待页面加载_java selenium (十三) 智能等待页面加载完成

    我们经常会碰到用selenium操作页面上某个元素的时候, 需要等待页面加载完成后, 才能操作.  否则页面上的元素不存在,会抛出异常. 或者碰到AJAX异步加载,我们需要等待元素加载完成后, 才能操 ...

  10. java模拟网易邮箱登录_java+selenium 实现网易邮箱登录功能

    今天学习selenium ,折腾了一整天,写个笔记记录一下今天的错误. 我用的是java+webdriver,在eclipse中运行,今天的学习是进行网易邮箱的登录功能.一开始代码运行一直报找不到元素 ...

最新文章

  1. 自动获取mysql建表语句_脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明...
  2. PostgreSQL_row_number() over()
  3. java代码_阿里资深工程师教你如何优化 Java 代码!
  4. Win32程序开发流程--《深入浅出MFC》
  5. gradle版本_Gradle和Maven的主要区别
  6. [003]Reference in C++---C++引用基础知识篇
  7. Qt数据库编程_基本
  8. java读取csv文件
  9. 初探System.Threading.Channels
  10. 浅谈JSP表单中的form传值
  11. SVN代码回滚命令之---merge的使用
  12. Swift - 43 - 继承, 多态, 析构函数
  13. 多个线程交替打印ABC,打印10次
  14. Everything常见问题及搜索技巧
  15. 『Asp.Net 组件』Asp.Net 服务器组件 内嵌CSS:将CSS封装到程序集中
  16. 谷歌地图离线地图开发教程
  17. cad编程c语言,基于C.NET的AutoCAD二次开发简版.pdf
  18. 网吧防火墙选购(转)
  19. win10系统迁移到固态硬盘ssd
  20. 【winRAR去广告弹窗】

热门文章

  1. IC面试数字电路基础
  2. Idea打包jar 及jar包反编译为代码的多种方法
  3. python对比多个excel数据_python-pandas两个相同格式的excel对比输出不同内容
  4. matlab中pid参数整定,基于MATLAB/Simulink的PID参数整定
  5. 人口普查数据有疑问???
  6. 自动化测试工程师简历模板
  7. oracle erp atp是什么意思,三种ATP(ERP原理与应用教程第2版)
  8. 基于SSM+MySQL+Bootstrap的停车场管理系统
  9. 计算机视觉 - python实现求解homography矩阵
  10. 利用EMCP物联网云平台通过手机APP和微信监控西门子S7-1200PLC云组态