在UI自动化测试中,相信很多人都喜欢用所谓的PO模式,其中的P,也就是page的意思,于是乎,在脚本里,或者在其它的page里,会要new很多的page对象,这样很麻烦,前面我们也讲到了注解的使用,很方便,那么我们可不可以用注解来代替这个new的过程呢?只有想不到,没有办不到的,因为springMVC就是用了这个方式来IOC,当然我们也可以直接用springMVC,但这无异于用牛刀来切豆腐,还不如我们自已实现一下,顺便增加一下对注解的使用的认识,代码如下:

1.先定义一个LoadPage的注解:

package com.test.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoadPage {
String value();
}

2.再来实现一下这个注解:

package com.test.annotation;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List; import org.openqa.selenium.WebDriver; public class LoadAllPage { public final String basePath = "com.test"; private final String binPath = "bin"; private List<String> allClass = new ArrayList<String>(); private WebDriver driver; public void setDriver(WebDriver driver) {
this.driver = driver;
} public void loadAllPage(){
this.listAllFiles(binPath+File.separator+basePath.replace(".","/"));
this.getPageInstance();
} private void listAllFiles(String path){
path = path.replace("\\", "/");
File file = new File(path);
if(file.isFile() && file.getName().endsWith(".class")){
String filePath = file.getPath().replace("\\", "/");
int startIndex = 4;
int endIndex = filePath.lastIndexOf(".class");
allClass.add(filePath.substring(startIndex, endIndex).replace("/", "."));
}else if(file.isDirectory()){
File[] files = file.listFiles();
for (File f : files) {
this.listAllFiles(f.getPath());
}
}
} private void getPageInstance(){
for (String clazz : allClass) {
try {
Class<?> c = Class.forName(clazz);
if(c.isAnnotationPresent(LoadPage.class)){
LoadPage lp = c.getAnnotation(LoadPage.class);
Constructor<?> cons = c.getConstructor(WebDriver.class);
InitialManger.allInstance.put(lp.value(), cons.newInstance(driver));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
LoadAllPage lap = new LoadAllPage();
lap.loadAllPage();
}
}

3.再定义一个Page注解:

package com.test.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Page {
public String name() default "";
}

4.同样的,需要实现下Page注解

package com.test.annotation;

import java.lang.reflect.Field;
import java.util.Iterator; public class AutoPage { public void setPageAnnotation(){
Iterator<String> it = InitialManger.allInstance.keySet().iterator();
while(it.hasNext()){
String key = it.next();
try {
Class<?> c = InitialManger.allInstance.get(key).getClass();
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if(field.isAnnotationPresent(Page.class)){
field.set(InitialManger.allInstance.get(key), InitialManger.allInstance.get(field.getAnnotation(Page.class).name()));
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
} public void setTestAnnotation(Object o) {
try {
Class<?> c = o.getClass();
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if(field.isAnnotationPresent(Page.class)){
field.set(o, InitialManger.allInstance.get(field.getAnnotation(Page.class).name()));
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
} }

5.增加一个所有page实例化后的对象管理类:

package com.test.annotation;

import java.util.HashMap;
import java.util.Map; public class InitialManger { public static Map<String, Object> allInstance = new HashMap<String, Object>(); }

6.再来初始化一下实现注解类:

package com.test.annotation;

import org.openqa.selenium.WebDriver;

public class InitialAnnotation {

	private WebDriver driver;

	public InitialAnnotation(WebDriver driver) {
this.driver = driver;
} public void initialAnnotation(){
LoadAllPage lap = new LoadAllPage();
lap.setDriver(driver);
lap.loadAllPage();
AutoPage ap = new AutoPage();
ap.setPageAnnotation();
} }

7.接下来就是使用了:在一个Page中加上这个@LoadPage注解:

package com.test.page;

import org.openqa.selenium.WebDriver;

import com.test.annotation.LoadPage;
import com.test.base.Page; @LoadPage("firstPage")
public class FirstPage extends Page{ public FirstPage(WebDriver driver) {
super(driver);
} public void linkToMobileList(){
driver.navigate().to("http://www.baidu.com");
} }

8.为了使@Page注解在case中能用到,所以得在TestBase的@BeforeClass中添加如下代码:

if(InitialManger.allInstance.isEmpty()){
InitialAnnotation init = new InitialAnnotation(driver);
init.initialAnnotation();
}
AutoPage ap = new AutoPage();
ap.setTestAnnotation(this);

9.在CASE中这样用即可:

package com.test.testcases;

import java.util.Map;

import org.testng.annotations.Test;

import com.test.annotation.Page;
import com.test.base.TestBase;
import com.test.page.FirstPage; public class Test2 extends TestBase{ @Page(name="firstPage")
private FirstPage firstPage; @Test(dataProvider="providerMethod")
public void testLogin(Map<String, String> param){
firstPage.linkToMobileList();
} }

整个过程就是这样的,可能有人会说这样也不方便,等等等等,总是有人能接受,有人不能接受的,如果能接受,可以找我共同讨论一下。QQ:408129370

JAVA 自定义注解在自动化测试中的使用的更多相关文章

  1. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  2. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  3. java自定义注解实现前后台参数校验

    2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...

  4. java自定义注解注解方法、类、属性等等【转】

    http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...

  5. Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性) 前言:由于前段时间忙于写接口,在接口中需要做很多的参数校验,本着简洁.高效的原则,便写了这个小工具供自己使用(内容 ...

  6. JAVA自定义注解 ------ Annotation

    日常开发工作中,合理的使用注解,可以简化代码编写以及使代码结构更加简单,下面记录下,JAVA自定义注解的开发过程. 定义注解声明类. 编写注解处理器(主要起作用部分). 使用注解. 相关知识点介绍, ...

  7. Java自定义注解和运行时靠反射获取注解

    转载:http://blog.csdn.net/bao19901210/article/details/17201173/ java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编 ...

  8. Java自定义注解的实现

    Java自定义注解的实现,总共三步(eg.@RandomlyThrowsException): 1.首先编写一个自定义注解@RandomlyThrowsException package com.gi ...

  9. JAVA自定义注解

    在学习使用Spring和MyBatis框架的时候,使用了很多的注解来标注Bean或者数据访问层参数,那么JAVA的注解到底是个东西,作用是什么,又怎样自定义注解呢?这篇文章,即将作出简单易懂的解释. ...

随机推荐

  1. HDU 3746 将字符串的全部字符最少循环2次需要添加的字符数

    Sample Input3aaaabcaabcde Sample Output025 题目大意:给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数.例子:abcabc 已经循环2次,添 ...

  2. 在Ubuntu下解决 adb devices :???????????? no permissions 方法

    http://sdvdxl.blog.51cto.com/3845763/1126539 MODE表示读取模式,0666表示任何人都可以访问. 最后 adb devices查看

  3. python全栈开发day48-jqurey自定义动画,jQuery属性操作,jQuery的文档操作,jQuery中的ajax

    一.昨日内容回顾 1.jQuery初识 1).使用jQuery而非JS的六大理由 2).jQuery对象和js对象转换 3).jQuery的两大特点 4).jQuery的入口函数三大写法 5).jQu ...

  4. python全栈开发day44-js、DOM、BOM

    JS的三大部分 一.ECMAJavaScript基础语法: 1.javascript的引入方式 1) 行内式 <script> alert(1) </script> 2) 引入 ...

  5. BZOJ1218 [HNOI2003]激光炸弹 二维前缀和

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1218 题意概括 给出一个大的矩阵,求边长为r的正方形区域的最大sum. 题解 二维前缀和然后暴力就 ...

  6. Repository HDU2846

    极限过的 最原始的方法一层一层建树就好了 #include<bits/stdc++.h> using namespace std; ][]={}; ]={}; ]; ; int pos; ...

  7. Scrapy爬虫学习笔记 - 爬虫基础知识

    一.正则表达式 二.深度和广度优先                                三.爬虫去重策略

  8. 在macOS下正确配置 VS Code 使用 virtualenv 里的 python 环境参数

    在macos配置好并启动 virtualenv 环境后,如何让 VS Code 使用这个环境下来编译调试 python 脚本呢? 1.首先当然是先配置好python虚拟环境 假定配置python的的虚 ...

  9. POJ 3660 Cow Contest. (传递闭包)【Floyd】

    <题目链接> 题目大意: 有n头牛, 给你m对关系(a, b)表示牛a能打败牛b, 求在给出的这些关系下, 能确定多少牛的排名. 解题分析: 首先,做这道题要明确,什么叫确定牛的排名.假设 ...

  10. 数据恢复工具PhotoRec

    数据恢复工具PhotoRec PhotoRec是一款文件恢复工具.它可以从硬盘.光驱.记忆卡中恢复视频.文档.压缩包等文件.该工具绕开文件系统,采用文件特征码机制,直接进行底层数据扫描,尝试恢复文件. ...