美文网首页
UI自动化中获取动态验证码的内容

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

作者: 仰望星空_4645 | 来源:发表于2019-07-11 13:06 被阅读0次

    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

    相关文章

      网友评论

          本文标题:UI自动化中获取动态验证码的内容

          本文链接:https://www.haomeiwen.com/subject/mwirkctx.html