Selenium自动化测试——识别验证码

由于在笔者在进行自动化测试的过程中,每次登录时第一步都需要人眼识别验证码,将它作为参数传给后台再写到前端页面上。为了以后扩展可以自动化的功能,并优化自动化脚本,因此开始在脚本中增加了识别验证码的功能。

识别验证码主要分为三步:

1、截取当前显示验证码的屏幕图片

2、剪裁屏幕图片得到验证码图片

3、调用tess4j库识别验证码

接下来笔者将按照上述步骤实现识别验证码的功能。

前置条件:

IDE:Eclipse

Project Manager:Maven

一、在开始之前,首先要在Maven中引入tess4j:

Step 1 : 打开pom.xml,进入标签页Dependencies

Selenium自动化测试——识别验证码_第1张图片


Step 2 : 点击“Add”,在库名称中输入“tess4j”

Selenium自动化测试——识别验证码_第2张图片

Step 3 : 在搜索到的结果中选择tess4j,点击“OK”,并点击保存。等待项目建立完成即可。

二、截取整个屏幕,并保存到相应的文件夹

截图方法:

public void robotSnapshot(String type,String path) {
		try{
			BufferedImage img = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));  
	        ImageIO.write(img, type, new File(path));
		}catch(Exception e){
			e.printStackTrace();
			System.out.println("Snapshot has problem");
		}

type: 表示截图的文件类型,可以填写png,jpg等

path: 表示文件保存路径,需要给路径加上后缀

三、裁剪屏幕图片

裁剪方法:

public void cut(int x1, int y1, int width, int height,
			String sourcePath, String descpath) {
 
		FileInputStream is = null;
		ImageInputStream iis = null;
		try {
			is = new FileInputStream(sourcePath);
			String fileSuffix = sourcePath.substring(sourcePath
					.lastIndexOf(".") + 1);
			Iterator it = ImageIO
					.getImageReadersByFormatName(fileSuffix);
			ImageReader reader = it.next();
			iis = ImageIO.createImageInputStream(is);
			reader.setInput(iis, true);
			ImageReadParam param = reader.getDefaultReadParam();
			Rectangle rect = new Rectangle(x1, y1, width, height);
			param.setSourceRegion(rect);
			BufferedImage bi = reader.read(0, param);
			ImageIO.write(bi, fileSuffix, new File(descpath));
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				is = null;
			}
			if (iis != null) {
				try {
					iis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				iis = null;
			}
		}
 
	}
x1 : 选择区域左上角的x坐标
y1 : 选择区域左上角的y坐标
width : 选择区域的宽度
height : 选择区域的高度
sourcePath : 源图片路径
descpath : 裁切后图片的保存路径

引用:https://blog.csdn.net/5iasp/article/details/8587554

四、调用tess4j

调用方式:

		File imageFile = new File(descpath);
		//调用Tesseract
		ITesseract instance = new Tesseract();
                instance.setDatapath("C:\\maven-project\\auto_shyd\\tessdata");
		String verifycode = null;
		try {
			verifycode = instance.doOCR(imageFile);
		} catch (TesseractException e1) {
		e1.printStackTrace();
		}
		verifycode = verifycode.replaceAll("[^a-z^A-Z^0-9]", "");//替换大小写及数字
		System.out.println("Verify code is :" + verifycode);

1.需要将C:\Users\Administrator\.m2\repository\net\sourceforge\tess4j\tess4j\4.0.2 路径下的jar包中的文件夹tessdata解压出来,解压后的文件位置即

instance.setDatapath()

 设置的路径位置。

2.descpath即为验证码图片的路径

小结

在本次实现识别验证码功能的过程中,本意是想通过直接获取tessdata的路径,作为语言包的路径:

                URL url = ClassLoader.getSystemResource("tessdata");
		String tesspath = url.getPath().substring(6);
		//进行读取,默认是英文,如果要使用中文包,加上instance.setLanguage("chi_sim");
		//尚未解决打不开tessdata的问题,只能将文件移出至项目文件夹,作为默认路径,如有需要请修改
		instance.setDatapath(tesspath);

但是由于编译过程中,一直提示无法打开该路径,只好将tessdata解压出来。


你可能感兴趣的:(Selenium自动化测试)