1. 通过浏览器截图的方式
/**
*@param WebElement 要截取的验证码
*@param driver 当前浏览器
*return 验证码图片
*/
public static File getImgFileByScreenshot(WebElement element, WebDriver driver){
if (element == null) throw new NullPointerException("图片元素失败");
WrapsDriver wrapsDriver = (WrapsDriver) element; //截取整个页面
File scrFile = ((TakesScreenshot)wrapsDriver.getWrappedDriver()).getScreenshotAs(OutputType.FILE);
try {
BufferedImage img = ImageIO.read(scrFile);
int screenshotWidth = img.getWidth();
Dimension dimension = driver.manage().window().getSize();
//获取浏览器尺寸与截图的尺寸
double scale = (double) dimension.getWidth() / screenshotWidth;
int eleWidth = element.getSize().getWidth();
int eleHeight = element.getSize().getHeight();
Point point = element.getLocation();
int subImgX = (int)(point.getX() / scale); //获得元素的坐标
int subImgY = (int)(point.getY() / scale);
int subImgWight = (int)(eleWidth / scale); //获取元素的宽高
int subImgHeight = (int)(eleHeight / scale);
//精准的截取元素图片,
BufferedImage dest = img.getSubimage(subImgX, subImgY, subImgWight, subImgHeight);
ImageIO.write(dest, "png", scrFile);
} catch (Exception e) {
e.printStackTrace();
}
return scrFile;
}
#######这里多出了一个计算浏览器页面尺寸和截图尺寸比例的步骤并不直接使用Point的X和Y属性和元素的宽高来截取验证码。(如果代码只在window上运行可以直接使用)因为我的开发机是mac os 使用File scrFile =((TakesScreenshot)wrapsDriver.getWrappedDriver()).getScreenshotAs(OutputType.FILE); 获取到的图片尺寸要大于浏览器页面的尺寸。如果直接使用浏览器上的Point属性是截取不到指定元素的。
网友评论