UI自动化中获取动态验证码的内容

2019-07-11  本文已影响0人  仰望星空_4645

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下

image.png
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是自己多次操作测试出的一个大概范围。

最后保存到本地的图片实际效果: 1.png

控制台打印:


image.png

本项目写的比较仓促,代码没有封装,望见谅,后续优化
可能会存在部分字母识别错误的情况,如s和8,7和2和z

上一篇下一篇

猜你喜欢

热点阅读