1、界面如下,验证码是图片,里面字母都是英文的
1.png
2、解决方案
2-1、pom.xml中放入依赖:
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.2.1</version>
</dependency>
2-2、下载字体库
https://github.com/tesseract-ocr/tessdata/blob/master/eng.traineddata
如果你的项目中验证码是中文或者中英文组合,需从下面地址中查找对应的字体库
https://github.com/tesseract-ocr/tessdata
如中文+数字:chi_sim.traineddata
放入项目resources下
2-3、核心代码:找到对应的验证码图片位置截图保存生成本地图片,然后通过上面库解析
System.setProperty("webdriver.chrome.driver","E:\\a\\res\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("http://aaa.com/login");
driver.manage().window().maximize();
String a=getVerificationCode("E:\\test\\1.png",driver);
if(a!=null){
System.out.println(a);
}else{
System.out.println("获取失败");
}
注:E:\test\1.png是要保存的图片路径,没有自己手动添加一个
public byte[] takeScreenshot(WebDriver driver) throws IOException {
byte[] screenshot = null;
screenshot = ((TakesScreenshot) driver) .getScreenshotAs(OutputType.BYTES);//得到截图
return screenshot;
}
public BufferedImage createElementImage(WebDriver driver, WebElement webElement, int x, int y, int width, int heigth)//开始裁剪的位置和截图的宽和高
throws IOException {
Dimension size = webElement.getSize();
BufferedImage originalImage = ImageIO.read(new ByteArrayInputStream(takeScreenshot(driver)));
BufferedImage croppedImage = originalImage.getSubimage(x, y, size.getWidth() + width, size.getHeight() + heigth);//进行裁剪
return croppedImage;
}
private String getVerificationCode(String path,WebDriver driver) {
File imageFile = new File(path);
try {
imageFile.createNewFile();
} catch (IOException e1) {
e1.printStackTrace();
}
// WebElement element = driver.findElement(By.xpath("//img[contains(@src,'/live-web-admin/jcaptcha.jpg')]"));
WebElement element = driver.findElement(By.xpath("//img[contains(@src,'/jcaptcha.jpg')]"));
try {
BufferedImage image = createElementImage(driver, element, 990, 300,100, 100);//得到裁剪的图片
ImageIO.write(image, "png", imageFile);//进行保存
} catch (IOException e) {
e.printStackTrace();
}
ITesseract instance = new Tesseract();//调用Tesseract
URL url = ClassLoader.getSystemResource("tessdata");//获得Tesseract的文字库
String tesspath = url.getPath().substring(1);
instance.setDatapath(tesspath);//进行读取,默认是英文,如果要使用中文包,加上instance.setLanguage("chi_sim");
String result = null;
try {
result = instance.doOCR(imageFile);
} catch (TesseractException e1) {
e1.printStackTrace();
}
result = result.replaceAll("[^a-z^A-Z^0-9]", "");//替换大小写及数字
return result;
}
注://img[contains(@src,'/jcaptcha.jpg')] 是webui自动化中验证码图片的xpath定位
(driver, element, 990, 300,100, 100) 990是验证码的左上角x轴坐标,300是左上角y轴坐标,100和100代表要截图的宽高,防止获取的图片真实宽高是0
990和300是自己多次操作测试出的一个大概范围。
控制台打印:
image.png
本项目写的比较仓促,代码没有封装,望见谅,后续优化
可能会存在部分字母识别错误的情况,如s和8,7和2和z
网友评论