selenium+java+test4j综合应用自动登录,包括截屏和截取图片操作
环境要求
eclipse+Junit+Firefox+selenium+test4j
selenium直接在Firefox中搜索IDE添加插件,还需要几个jar包
test4j直接下载文件解压使用
通过IDE制作javaJunit
IDE添加后,在Firefox的右上角那个se小图标,在在Firefox中安装IDE插件后,打开IDE插件,可以制作java测试类,全程IDE录屏,可以检测输入,鼠标点击,做好后直接导出即可
录制完成后直接export为javaJunit即可,打开导出的文件即可编写,测试前编写准备代码,启动Firefox, geckodriver.exe是浏览驱动,可以在GitHub搜索下载,后面的文件路径为本机电脑文件位置
public void setUp() {
System.setProperty("webdriver.firefox.bin", "F:\\软件安装\\Firefox\\firefox.exe");// 浏览器路径
System.setProperty("webdriver.gecko.driver",
"D:\\软件测试\\selenium tools\\latest release tools\\geckodriver-v0_64位\\geckodriver.exe");// 浏览器驱动路径
driver = new FirefoxDriver();
js = (JavascriptExecutor) driver;
vars = new HashMap<String, Object>();
}
截屏
接下来写的是截屏代码,添加在输入密码后,最好设置一个缓冲时间,防止没有加载出来,因为后面的test4j需要识别的是JPEG类型的图片,所以这里的截屏保存为JPEG类型
//设置一个缓冲时间,加载完成后再截屏
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//截屏
try {
WebDriver augmentedDriver = new Augmenter().augment(driver);
File screenshot = ((TakesScreenshot) augmentedDriver).getScreenshotAs(OutputType.FILE);
File file = new File("D:\\temp.jpeg"); //这里的位置是截屏的位置
FileUtils.copyFile(screenshot, file);
} catch (IOException e) { // TODO Auto-generated catch block
System.out.println("Can't save screenshot");
e.printStackTrace();
}
截取图片
前面的截屏是截取的全屏,识别验证码是需要截取验证码部分,
//保存截屏
public static void yanzhenma() {
File scrFile = new File("D:\\temp.jpeg"); //这里是前面截屏的位置
File scrFile1 = new File("D:\\temp1.jpeg"); //这是要截取验证码部分的位置
try {
BufferedImage img = ImageIO.read(scrFile);
BufferedImage dest = img.getSubimage(750, 467, 63, 26); //四个参数是验证码所在的位置,(x,y,width,height)
ImageIO.write(dest, "jpeg", scrFile1);
} catch (IOException e) {
e.printStackTrace();
}
}
识别验证码
前面验证码的截屏文件为temp1.jpeg,此时只需要使用这个文件进行识别即可,这里需要用的就是test4j,我写的是一个方法,方法参数就是截屏的位置,即我前面用的"D:\temp1.jpeg"
// 通过照片识别验证码
public static String executeTess4J(String imgUrl) {
String ocrResult = "";
try {
ITesseract instance = new Tesseract();
File imgDir = new File(imgUrl);
long startTime = System.currentTimeMillis();
ocrResult = instance.doOCR(imgDir);
} catch (TesseractException e) {
e.printStackTrace();
}
return ocrResult;
}
用了几次,识别的通过率不是很高,但是还可以,有的验证码太小了识别成功率较低
注意
之前测试登录,点击登录后进入另外一个页面,因为切换了frame,导致截屏不是自己想要的位置截取的是切换frame后的页面同样大小的左上角
driver.switchTo().frame("alertlogin"); // 切换到登录frame
这里在截屏之前需要需要切换到主页面,然后截屏后再切换到当前frame
// 返回到主界面,截屏后返回到当前frame
driver.switchTo().parentFrame();
返回后截屏,截屏后,再返回到当前frame
driver.switchTo().frame("alertlogin");//我的frame是alertlogin
关于test4j和selenium安装,我之前搜索中都看到过,可以去找一下,后期我找到了再发出来