源文件(包含对应的版本及驱动文件)下载 https://download.csdn.net/download/w13511069150/10366610
一、MAVEN依赖
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.11.0</version>
</dependency>
<!--简单验证码识别-->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.4.7</version>
<exclusions>
<exclusion>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
二、JAVA DEMO
package auto.web.test;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.ie.InternetExplorerOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
* WEB自动测试
*/
public class AutoTest {
public static void main(String[] args) {
try {
//---1.创建
WebDriver webDriver = getWebDriver(Browser.IE);
//---2.设置属性
webDriver.manage().window().maximize();
webDriver.manage().deleteAllCookies();
// 与浏览器同步非常重要,必须等待浏览器加载完毕
webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
//打开目标地址
webDriver.get("http://127.0.0.1/login.asp");
//---3.输入账号 密码并登陆系统
fillLoginInfo(webDriver);
//---4.判断是否登陆成功
int retryNum = 0;
boolean loginSuccess = isLoginSuccess(webDriver);
while (!loginSuccess) {
refreshImgCode(webDriver);
waitTime(1000);
System.out.println("第[" + ++retryNum + "]次重试!");
fillLoginInfo(webDriver);
loginSuccess = isLoginSuccess(webDriver);
}
//---5.利用js构造一个confirm框
waitTime(3000);
String js = "confirm(\"此次共重试[" + retryNum + "]次登陆成功!一会自动关闭!\")";
((JavascriptExecutor) webDriver).executeScript(js);
// 取消confirm框
waitTime(3000);
webDriver.switchTo().alert().dismiss();
//---6.暂停1000毫秒后关闭
waitTime(1000);
webDriver.quit();
} catch (Exception e) {
e.printStackTrace();
}
}
//创建WebDriver
private static WebDriver getWebDriver(Browser browser) {
switch (browser) {
case Chrome://ChromeDriver.exe v2.38 (2018-04-17) Supports Chrome v65-67
//解决 --ignore-certificate-errors(听说只在部分版本中存在)
System.setProperty("webdriver.chrome.driver", "c://chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("--test-type", "--ignore-certificate-errors");
return new ChromeDriver(options);
case Firefox://geckodriver.exe v0.20.1 火狐 59
System.setProperty("webdriver.gecko.driver", "c://geckodriver.exe");
return new FirefoxDriver();
case IE:// IEDriverServer.exe v3.9 IE 8(不能使用webDriver.quit()关闭IE,不知道为什么 )
System.setProperty("webdriver.ie.driver", "C:\\IEDriverServer.exe");
InternetExplorerOptions internetExplorerOptions = new InternetExplorerOptions();
internetExplorerOptions.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
return new InternetExplorerDriver(internetExplorerOptions);
default:
return null;
}
}
//填充登陆信息
private static void fillLoginInfo(WebDriver webDriver) throws IOException {
webDriver.findElement(By.id("E_Id")).sendKeys("aabbcc");
webDriver.findElement(By.id("PassWord")).clear();//清除旧值
webDriver.findElement(By.id("PassWord")).sendKeys("aabbcc");
String code = replaceStr(toIimg(webDriver));
while (code.length() != 4) {
System.out.println("验证码:" + code);
waitTime(1000);
refreshImgCode(webDriver);
code = replaceStr(toIimg(webDriver));
}
webDriver.findElement(By.id("IsCode")).sendKeys(code);
webDriver.findElement(By.id("tijiao")).click();
}
//判断是否登陆成功
private static boolean isLoginSuccess(WebDriver webDriver) {
waitTime(500);
new WebDriverWait(webDriver, 5).until(ExpectedConditions.alertIsPresent());
String alertText = webDriver.switchTo().alert().getText();
System.out.println("登陆结果:" + alertText);
// 关闭Alert框
webDriver.switchTo().alert().accept();
return alertText.startsWith("恭喜您[") && alertText.endsWith("登陆成功!");
}
//刷新图片验证码
private static void refreshImgCode(WebDriver webDriver) {
System.out.println("重新刷新验证码!");
webDriver.findElement(By.xpath("/html/body/table/tbody/tr/td/table/tbody/tr[1]/td/form/table/tbody/tr[6]/td[3]/img")).click();
}
//调用截图方法
private static String toIimg(WebDriver webDriver) throws IOException {
//整个页面
//File src = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
//FileUtils.copyFile(src, new File("d:\\test.png"));
//指定元素
WebElement ele = webDriver.findElement(By.xpath("/html/body/table/tbody/tr/td/table/tbody/tr[1]/td/form/table/tbody/tr[6]/td[3]/img"));
// Get entire page screenshot
File screenshot = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
BufferedImage fullImg = ImageIO.read(screenshot);
// Get the location of element on the page
Point point = ele.getLocation();
// Get width and height of the element
int eleWidth = ele.getSize().getWidth();
int eleHeight = ele.getSize().getHeight() + 1;//IE 浏览器 取到的高度是对的,但是保存的图片小所以要加个值
System.out.println(eleWidth + " - " + eleHeight);
// Crop the entire page screenshot to get only element screenshot
BufferedImage eleScreenshot = fullImg.getSubimage(point.getX(), point.getY(), eleWidth, eleHeight);
ImageIO.write(eleScreenshot, "png", screenshot);
// Copy the element screenshot to disk
File screenshotLocation = new File("D:/test.png");
FileUtils.copyFile(screenshot, screenshotLocation);
return ocrText(screenshotLocation);
}
//OCR识别文字
private static String ocrText(File imageFile) {
Tesseract tessreact = new Tesseract();
tessreact.setDatapath("C:\\Program Files (x86)\\Tesseract-OCR\\tessdata");
tessreact.setTessVariable("tessedit_char_whitelist", "0123456789");
//tessreact.setLanguage("num");//英文库识别数字比较准确
try {
return tessreact.doOCR(imageFile);
} catch (TesseractException e) {
e.printStackTrace();
return e.getMessage();
}
}
//替换字符串中的转义字符
private static String replaceStr(String str) {
if (str == null || str.equals("")) {
return "";
} else {
str = str.trim();
str = str.replaceAll("(\r\n|\r|\n|\n\r)", "");
str = str.replaceAll(" ", "");
return str;
}
}
//延时处理
static private void waitTime(int time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private enum Browser {
Chrome, Firefox, IE
}
}
三、相关驱动下载
Ie : http://selenium-release.storage.googleapis.com/index.html
Chrome : https://chromedriver.storage.googleapis.com/index.html
Firefox : https://github.com/mozilla/geckodriver/releases
tessreact-ocr : http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-4.00.00dev.exe
四、相关资料
验证码
https://blog.csdn.net/qq245671051/article/details/50363678
https://www.cnblogs.com/nn839155963/p/6690295.html
alert https://www.cnblogs.com/moonpool/p/5675832.html
selenium https://www.cnblogs.com/xiaochangwei/p/8405591.html
tessreact-ocr https://blog.csdn.net/dcrmg/article/details/78233459?locationNum=7&fps=1