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

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

  1. package com.test.annotation;
  2.  
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7.  
  8. @Target(ElementType.TYPE)
  9. @Retention(RetentionPolicy.RUNTIME)
  10. public @interface LoadPage {
  11. String value();
  12. }

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

  1. package com.test.annotation;
  2.  
  3. import java.io.File;
  4. import java.lang.reflect.Constructor;
  5. import java.lang.reflect.InvocationTargetException;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8.  
  9. import org.openqa.selenium.WebDriver;
  10.  
  11. public class LoadAllPage {
  12.  
  13. public final String basePath = "com.test";
  14.  
  15. private final String binPath = "bin";
  16.  
  17. private List<String> allClass = new ArrayList<String>();
  18.  
  19. private WebDriver driver;
  20.  
  21. public void setDriver(WebDriver driver) {
  22. this.driver = driver;
  23. }
  24.  
  25. public void loadAllPage(){
  26. this.listAllFiles(binPath+File.separator+basePath.replace(".","/"));
  27. this.getPageInstance();
  28. }
  29.  
  30. private void listAllFiles(String path){
  31. path = path.replace("\\", "/");
  32. File file = new File(path);
  33. if(file.isFile() && file.getName().endsWith(".class")){
  34. String filePath = file.getPath().replace("\\", "/");
  35. int startIndex = 4;
  36. int endIndex = filePath.lastIndexOf(".class");
  37. allClass.add(filePath.substring(startIndex, endIndex).replace("/", "."));
  38. }else if(file.isDirectory()){
  39. File[] files = file.listFiles();
  40. for (File f : files) {
  41. this.listAllFiles(f.getPath());
  42. }
  43. }
  44. }
  45.  
  46. private void getPageInstance(){
  47. for (String clazz : allClass) {
  48. try {
  49. Class<?> c = Class.forName(clazz);
  50. if(c.isAnnotationPresent(LoadPage.class)){
  51. LoadPage lp = c.getAnnotation(LoadPage.class);
  52. Constructor<?> cons = c.getConstructor(WebDriver.class);
  53. InitialManger.allInstance.put(lp.value(), cons.newInstance(driver));
  54. }
  55. } catch (ClassNotFoundException e) {
  56. e.printStackTrace();
  57. } catch (InstantiationException e) {
  58. e.printStackTrace();
  59. } catch (IllegalAccessException e) {
  60. e.printStackTrace();
  61. } catch (SecurityException e) {
  62. e.printStackTrace();
  63. } catch (NoSuchMethodException e) {
  64. e.printStackTrace();
  65. } catch (IllegalArgumentException e) {
  66. e.printStackTrace();
  67. } catch (InvocationTargetException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. }
  72.  
  73. public static void main(String[] args) {
  74. LoadAllPage lap = new LoadAllPage();
  75. lap.loadAllPage();
  76. }
  77. }

3.再定义一个Page注解:

  1. package com.test.annotation;
  2.  
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7.  
  8. @Target(ElementType.FIELD)
  9. @Retention(RetentionPolicy.RUNTIME)
  10. public @interface Page {
  11. public String name() default "";
  12. }

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

  1. package com.test.annotation;
  2.  
  3. import java.lang.reflect.Field;
  4. import java.util.Iterator;
  5.  
  6. public class AutoPage {
  7.  
  8. public void setPageAnnotation(){
  9. Iterator<String> it = InitialManger.allInstance.keySet().iterator();
  10. while(it.hasNext()){
  11. String key = it.next();
  12. try {
  13. Class<?> c = InitialManger.allInstance.get(key).getClass();
  14. Field[] fields = c.getDeclaredFields();
  15. for (Field field : fields) {
  16. field.setAccessible(true);
  17. if(field.isAnnotationPresent(Page.class)){
  18. field.set(InitialManger.allInstance.get(key), InitialManger.allInstance.get(field.getAnnotation(Page.class).name()));
  19. }
  20. }
  21. } catch (IllegalAccessException e) {
  22. e.printStackTrace();
  23. } catch (SecurityException e) {
  24. e.printStackTrace();
  25. } catch (IllegalArgumentException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  30.  
  31. public void setTestAnnotation(Object o) {
  32. try {
  33. Class<?> c = o.getClass();
  34. Field[] fields = c.getDeclaredFields();
  35. for (Field field : fields) {
  36. field.setAccessible(true);
  37. if(field.isAnnotationPresent(Page.class)){
  38. field.set(o, InitialManger.allInstance.get(field.getAnnotation(Page.class).name()));
  39. }
  40. }
  41. } catch (IllegalAccessException e) {
  42. e.printStackTrace();
  43. } catch (SecurityException e) {
  44. e.printStackTrace();
  45. } catch (IllegalArgumentException e) {
  46. e.printStackTrace();
  47. }
  48. }
  49.  
  50. }

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

  1. package com.test.annotation;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5.  
  6. public class InitialManger {
  7.  
  8. public static Map<String, Object> allInstance = new HashMap<String, Object>();
  9.  
  10. }

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

  1. package com.test.annotation;
  2.  
  3. import org.openqa.selenium.WebDriver;
  4.  
  5. public class InitialAnnotation {
  6.  
  7. private WebDriver driver;
  8.  
  9. public InitialAnnotation(WebDriver driver) {
  10. this.driver = driver;
  11. }
  12.  
  13. public void initialAnnotation(){
  14. LoadAllPage lap = new LoadAllPage();
  15. lap.setDriver(driver);
  16. lap.loadAllPage();
  17. AutoPage ap = new AutoPage();
  18. ap.setPageAnnotation();
  19. }
  20.  
  21. }

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

  1. package com.test.page;
  2.  
  3. import org.openqa.selenium.WebDriver;
  4.  
  5. import com.test.annotation.LoadPage;
  6. import com.test.base.Page;
  7.  
  8. @LoadPage("firstPage")
  9. public class FirstPage extends Page{
  10.  
  11. public FirstPage(WebDriver driver) {
  12. super(driver);
  13. }
  14.  
  15. public void linkToMobileList(){
  16. driver.navigate().to("http://www.baidu.com");
  17. }
  18.  
  19. }

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

  1. if(InitialManger.allInstance.isEmpty()){
  2. InitialAnnotation init = new InitialAnnotation(driver);
  3. init.initialAnnotation();
  4. }
  5. AutoPage ap = new AutoPage();
  6. ap.setTestAnnotation(this);

9.在CASE中这样用即可:

  1. package com.test.testcases;
  2.  
  3. import java.util.Map;
  4.  
  5. import org.testng.annotations.Test;
  6.  
  7. import com.test.annotation.Page;
  8. import com.test.base.TestBase;
  9. import com.test.page.FirstPage;
  10.  
  11. public class Test2 extends TestBase{
  12.  
  13. @Page(name="firstPage")
  14. private FirstPage firstPage;
  15.  
  16. @Test(dataProvider="providerMethod")
  17. public void testLogin(Map<String, String> param){
  18. firstPage.linkToMobileList();
  19. }
  20.  
  21. }

整个过程就是这样的,可能有人会说这样也不方便,等等等等,总是有人能接受,有人不能接受的,如果能接受,可以找我共同讨论一下。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. 【AtCoder】AGC017

    在此处输入标题 标签(空格分隔): 未分类 A - Biscuits dp[i][0/1]表示当前和是偶数还是奇数,直接转移即可 #include <bits/stdc++.h> #def ...

  2. Codeforces 555D Case of a Top Secret

    Case of a Top Secret 感觉除了两个点在那循环的部分, 其他时候绳子的长度每次变为一半一下, 就变成了Log(l)步.. 然后就暴力找就好啦, 循环的部分取个模. #include& ...

  3. BZOJ1103 [POI2007]大都市meg dfs序 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1103 题意概括 一棵树上,一开始所有的边权值为1,我们要支持两种操作: 1. 修改某一条边的权值为 ...

  4. JavaScript开发区块链只需200行代码

    用JavaScript开发实现一个简单区块链.通过这一开发过程,你将理解区块链技术是什么:区块链就是一个分布式数据库,存储结构是一个不断增长的链表,链表中包含着许多有序的记录. 然而,在通常情况下,当 ...

  5. HDU 1358 Period (kmp求循环节)(经典)

    <题目链接> 题目大意: 意思是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”) 的两次组成,也就是aa有两个a组成: 第三行自然就是aabaab可有两个aab组成: 第 ...

  6. Angular 个人深究(二)【发布与订阅】

    Angular 个人深究(二)[发布与订阅] 1. 再入正题之前,首先说明下[ 发布与订阅模式](也叫观察者模式) 1) 定义:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个 ...

  7. supervisor管理进程工具配置

    Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统 ...

  8. adb monkey测试 命令

    adb shell monkey -p cn.com.linktrust.als.ipad 3500 LOWED_PACKAGE [-p ALLOWED_PACKAGE] ...] [-c MAIN_ ...

  9. PHP函数 ------ ctype_alnum

    //判断是否是字母和数字或字母数字的组合 if(!ctype_alnum($str)){ echo '只能是字母或数字的组合';exit; }整理下ctype functions: 1.ctype_a ...

  10. 潭州课堂25班:Ph201805201 并发 第九课 (课堂笔记)

    TCP/IP 1,建立连接(三次握手) 1,客户端发起请求 2,服务器请求回应 3,请求确认,双方建立连接 2,数据传输 3,断开连接(四次挥手) 1,客户端请求断开 连接 2,服务器回应请求 3,服 ...