验证码: 如下,在进行自动化测试,遇到验证码的问题,一般有两种方式

1.找开发去掉验证码或者使用万能验证码

2.使用OCR自动识别


使用OCR自动化识别,一般识别率不是太高,处理一般简单验证码还是没问题

这里使用的是Tesseract-OCR,下载地址:https://github.com/A9T9/Free-Ocr-Windows-Desktop/releases

怎么使用呢?

进入安装后的目录:

tesseract.exetest.pngtest-1


准备一份网页,上面使用该验证码

<html><head><title>TabletestbyYoung</title></head><body></br><h2>Test</h2><imgsrc="http://csujwc.its.csu.edu.cn/sys/ValidateCode.aspx?t=1"></br></body></html>

要识别验证码,首先得取得验证码,这两款采取对 页面元素部分截图的方式,首先获取整个页面的截图

然后找到页面元素坐标进行截取

/***Thismethodforscreenshotelement**@paramdriver*@paramelement*@parampath*@throwsInterruptedException*/publicstaticvoidscreenShotForElement(WebDriverdriver,WebElementelement,Stringpath)throwsInterruptedException{FilescrFile=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);try{Pointp=element.getLocation();intwidth=element.getSize().getWidth();intheight=element.getSize().getHeight();Rectanglerect=newRectangle(width,height);BufferedImageimg=ImageIO.read(scrFile);BufferedImagedest=img.getSubp_w_picpath(p.getX(),p.getY(),rect.width,rect.height);ImageIO.write(dest,"png",scrFile);Thread.sleep(1000);FileUtils.copyFile(scrFile,newFile(path));}catch(IOExceptione){e.printStackTrace();}}


截取完元素,就可以调用Tesseract-OCR生成text

//useTesseracttogetstringsRuntimert=Runtime.getRuntime();rt.exec("cmd.exe/Ctesseract.exeD:\\Tesseract-OCR\\test.pngD:\\Tesseract-OCR\\test-1");

接下来通过java读取txt

/***ThismethodforreadTXTfile**@paramfilePath*/publicstaticvoidreadTextFile(StringfilePath){try{Stringencoding="GBK";Filefile=newFile(filePath);if(file.isFile()&&file.exists()){//判断文件是否存在InputStreamReaderread=newInputStreamReader(newFileInputStream(file),encoding);//考虑到编码格式BufferedReaderbufferedReader=newBufferedReader(read);StringlineTxt=null;while((lineTxt=bufferedReader.readLine())!=null){System.out.println(lineTxt);}read.close();}else{System.out.println("找不到指定的文件");}}catch(Exceptione){System.out.println("读取文件内容出错");e.printStackTrace();}}


整体代码如下:

1packagecom.dbyl.tests;23importjava.awt.Rectangle;4importjava.awt.p_w_picpath.BufferedImage;5importjava.io.BufferedReader;6importjava.io.File;7importjava.io.FileInputStream;8importjava.io.IOException;9importjava.io.InputStreamReader;10importjava.io.Reader;11importjava.util.concurrent.TimeUnit;1213importjavax.p_w_picpathio.ImageIO;1415importorg.apache.commons.io.FileUtils;16importorg.openqa.selenium.By;17importorg.openqa.selenium.OutputType;18importorg.openqa.selenium.Point;19importorg.openqa.selenium.TakesScreenshot;20importorg.openqa.selenium.WebDriver;21importorg.openqa.selenium.WebElement;2223importcom.dbyl.libarary.utils.DriverFactory;2425publicclassTesseractTest{2627publicstaticvoidmain(String[]args)throwsIOException,28InterruptedException{2930WebDriverdriver=DriverFactory.getChromeDriver();31driver.get("file:///C:/Users/validation.html");32driver.manage().timeouts().pageLoadTimeout(30,TimeUnit.SECONDS);33WebElementelement=driver.findElement(By.xpath("//img"));3435//takescreenshotforelement36screenShotForElement(driver,element,"D:\\Tesseract-OCR\\test.png");3738driver.quit();3940//useTesseracttogetstrings41Runtimert=Runtime.getRuntime();42rt.exec("cmd.exe/Ctesseract.exeD:\\Tesseract-OCR\\test.pngD:\\Tesseract-OCR\\test-1");4344Thread.sleep(1000);45//Readtext46readTextFile("D:\\Tesseract-OCR\\test.txt");47}4849/**50*ThismethodforreadTXTfile51*
52*@paramfilePath53*/54publicstaticvoidreadTextFile(StringfilePath){55try{56Stringencoding="GBK";57Filefile=newFile(filePath);58if(file.isFile()&&file.exists()){//判断文件是否存在59InputStreamReaderread=newInputStreamReader(60newFileInputStream(file),encoding);//考虑到编码格式61BufferedReaderbufferedReader=newBufferedReader(read);62StringlineTxt=null;63while((lineTxt=bufferedReader.readLine())!=null){64System.out.println(lineTxt);65}66read.close();67}else{68System.out.println("找不到指定的文件");69}70}catch(Exceptione){71System.out.println("读取文件内容出错");72e.printStackTrace();73}74}7576/**77*Thismethodforscreenshotelement78*
79*@paramdriver80*@paramelement81*@parampath82*@throwsInterruptedException83*/84publicstaticvoidscreenShotForElement(WebDriverdriver,85WebElementelement,Stringpath)throwsInterruptedException{86FilescrFile=((TakesScreenshot)driver)87.getScreenshotAs(OutputType.FILE);88try{89Pointp=element.getLocation();90intwidth=element.getSize().getWidth();91intheight=element.getSize().getHeight();92Rectanglerect=newRectangle(width,height);93BufferedImageimg=ImageIO.read(scrFile);94BufferedImagedest=img.getSubp_w_picpath(p.getX(),p.getY(),95rect.width,rect.height);96ImageIO.write(dest,"png",scrFile);97Thread.sleep(1000);98FileUtils.copyFile(scrFile,newFile(path));99}catch(IOExceptione){100e.printStackTrace();101}102}103104}