What should I do if I encounter a verification code problem during automated testing?

1. Find the developer to remove the verification code or use the universal verification code

2. Use OCR to automatically identify

Using OCR automatic recognition, the general recognition rate is not too high, and it is still no problem to deal with general simple verification codes

Tesseract-OCR is used here, download address: https://github.com/A9T9/Free-Ocr-Windows-Desktop/releases

How to use it?

Enter the installed directory:

tesseract.exe test.png test -1
insert image description here

 Prepare a web page that uses this verification code

<html>
<head>
<title>Table test by Young</title>
</head>
<body>
 </br>
<h1> Test </h1>
 <img src="http://csujwc.its.csu.edu.cn/sys/ValidateCode.aspx?t=1">
 </br>
</body>
</html>

To identify the verification code, you must first obtain the verification code. These two models take screenshots of part of the page elements. First, obtain a screenshot of the entire page.

Then find the page element coordinates for interception


/**
     * This method for screen shot element
     * 
     * @param driver
     * @param element
     * @param path
     * @throws InterruptedException
     */
    public static void screenShotForElement(WebDriver driver,
            WebElement element, String path) throws InterruptedException {
        File scrFile = ((TakesScreenshot) driver)
                .getScreenshotAs(OutputType.FILE);
        try {
            Point p = element.getLocation();
            int width = element.getSize().getWidth();
            int height = element.getSize().getHeight();
            Rectangle rect = new Rectangle(width, height);
            BufferedImage img = ImageIO.read(scrFile);
            BufferedImage dest = img.getSubimage(p.getX(), p.getY(),
                    rect.width, rect.height);
            ImageIO.write(dest, "png", scrFile);
            Thread.sleep(1000);
            FileUtils.copyFile(scrFile, new File(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

After intercepting the elements, you can call Tesseract-OCR to generate text

// use Tesseract to get strings

        Runtime rt = Runtime.getRuntime();
        rt.exec("cmd.exe /C  tesseract.exe D:\\Tesseract-OCR\\test.png  D:\\Tesseract-OCR\\test -1 ");

Next read txt through java


/**
     * This method for read TXT file
     * 
     * @param filePath
     */
    public static void readTextFile(String filePath) {
        try {
            String encoding = "GBK";
            File file = new File(filePath);
            if (file.isFile() && file.exists()) { // 判断文件是否存在
                InputStreamReader read = new InputStreamReader(
                        new FileInputStream(file), encoding);// 考虑到编码格式
                BufferedReader bufferedReader = new BufferedReader(read);
                String lineTxt = null;
                while ((lineTxt = bufferedReader.readLine()) != null) {
                    System.out.println(lineTxt);
                }
                read.close();
            } else {
                System.out.println("找不到指定的文件");
            }
        } catch (Exception e) {
            System.out.println("读取文件内容出错");
            e.printStackTrace();
        }
    }

The overall code is as follows:


1 package com.dbyl.tests;
  2 
  3 import java.awt.Rectangle;
  4 import java.awt.image.BufferedImage;
  5 import java.io.BufferedReader;
  6 import java.io.File;
  7 import java.io.FileInputStream;
  8 import java.io.IOException;
  9 import java.io.InputStreamReader;
 10 import java.io.Reader;
 11 import java.util.concurrent.TimeUnit;
 12 
 13 import javax.imageio.ImageIO;
 14 
 15 import org.apache.commons.io.FileUtils;
 16 import org.openqa.selenium.By;
 17 import org.openqa.selenium.OutputType;
 18 import org.openqa.selenium.Point;
 19 import org.openqa.selenium.TakesScreenshot;
 20 import org.openqa.selenium.WebDriver;
 21 import org.openqa.selenium.WebElement;
 22 
 23 import com.dbyl.libarary.utils.DriverFactory;
 24 
 25 public class TesseractTest {
 26 
 27     public static void main(String[] args) throws IOException,
 28             InterruptedException {
 29 
 30         WebDriver driver = DriverFactory.getChromeDriver();
 31         driver.get("file:///C:/Users/validation.html");
 32         driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
 33         WebElement element = driver.findElement(By.xpath("//img"));
 34 
 35         // take screen shot for element
 36         screenShotForElement(driver, element, "D:\\Tesseract-OCR\\test.png");
 37 
 38         driver.quit();
 39         
 40         // use Tesseract to get strings
 41         Runtime rt = Runtime.getRuntime();
 42         rt.exec("cmd.exe /C  tesseract.exe D:\\Tesseract-OCR\\test.png  D:\\Tesseract-OCR\\test -1 ");
 43 
 44         Thread.sleep(1000);
 45         // Read text
 46         readTextFile("D:\\Tesseract-OCR\\test.txt");
 47     }
 48 
 49     /**
 50      * This method for read TXT file
 51      * 
 52      * @param filePath
 53      */
 54     public static void readTextFile(String filePath) {
 55         try {
 56             String encoding = "GBK";
 57             File file = new File(filePath);
 58             if (file.isFile() && file.exists()) { // 判断文件是否存在
 59                 InputStreamReader read = new InputStreamReader(
 60                         new FileInputStream(file), encoding);// 考虑到编码格式
 61                 BufferedReader bufferedReader = new BufferedReader(read);
 62                 String lineTxt = null;
 63                 while ((lineTxt = bufferedReader.readLine()) != null) {
 64                     System.out.println(lineTxt);
 65                 }
 66                 read.close();
 67             } else {
 68                 System.out.println("找不到指定的文件");
 69             }
 70         } catch (Exception e) {
 71             System.out.println("读取文件内容出错");
 72             e.printStackTrace();
 73         }
 74     }
 75 
 76     /**
 77      * This method for screen shot element
 78      * 
 79      * @param driver
 80      * @param element
 81      * @param path
 82      * @throws InterruptedException
 83      */
 84     public static void screenShotForElement(WebDriver driver,
 85             WebElement element, String path) throws InterruptedException {
 86         File scrFile = ((TakesScreenshot) driver)
 87                 .getScreenshotAs(OutputType.FILE);
 88         try {
 89             Point p = element.getLocation();
 90             int width = element.getSize().getWidth();
 91             int height = element.getSize().getHeight();
 92             Rectangle rect = new Rectangle(width, height);
 93             BufferedImage img = ImageIO.read(scrFile);
 94             BufferedImage dest = img.getSubimage(p.getX(), p.getY(),
 95                     rect.width, rect.height);
 96             ImageIO.write(dest, "png", scrFile);
 97             Thread.sleep(1000);
 98             FileUtils.copyFile(scrFile, new File(path));
 99         } catch (IOException e) {
100             e.printStackTrace();
101         }
102     }
103 
104 }

Guess you like

Origin blog.csdn.net/nhb687096/article/details/131722663