selenium 关键字驱动部分设计思路
1
说明:
1.以下的代码亲测直接可用,
2.设计思路来自博客园的 张飞_ :http://www.cnblogs.com/zhangfei/p/5330994.html / http://www.cnblogs.com/zhangfei/p/
3.重点在于理解 当中的设计思路 ,如果问题需要讨论可以联系我QQ:316567803 或者给我留言;
7.person 和 MoveDisk类
package keyWordsDriver; /**
*
*/
public class Person {
void getTheCommandFromTeacher(){}
void findTheDeskAtA(){}
void moveDeskToB(){}
void notifyTeacherHadFinished(){}
} package keyWordsDriver; /**
*
*/
public class MoveDesk { private Person zhangsan; public void setZhangsan(Person zhangsan) {
this.zhangsan = zhangsan;
} public void setZhangsan() {
System.out.println("\n");
System.out.println("大家好我是张三,你现在执行的方法为:setZhangsan()");
this.zhangsan = new Person();
System.out.println("\n");
} public void moveDeskFromA2B() {
zhangsan.getTheCommandFromTeacher();
zhangsan.findTheDeskAtA();
zhangsan.moveDeskToB();
zhangsan.notifyTeacherHadFinished();
}
}
8.反射需要用的关键字对象整理:
package keyWordsDriver; import java.util.HashMap;
import java.util.Map; /**
* 1.根据张三 ,得到张三的className,通过className得到张三这个对象,然后再执行张三所要执行的方法(setZhangsan)
*/
public class KeywordReflect { public static Map<String, Map<String, String>> KEYWORD_POOLS = new HashMap<String, Map<String, String>>();
static{
KEYWORD_POOLS.put("张三", KeywordReflect.methodInfo(MoveDesk.class.getName(), "setZhangsan"));
KEYWORD_POOLS.put("把桌子从A地点搬到B地点", KeywordReflect.methodInfo(MoveDesk.class.getName(), "moveDeskFromA2B"));
} public static Map<String, String> methodInfo(String className, String methodName){
Map<String, String> methodInfo = new HashMap<String, String>();
methodInfo.put("class", className);
methodInfo.put("method", methodName);
return methodInfo; } static void print() {
for (Map.Entry<String, Map<String, String>> entrys : KEYWORD_POOLS.entrySet()
) {
System.out.println("entrys.getKey()="+entrys.getKey());
Map<String,String> values = entrys.getValue();
for (Map.Entry<String, String> entyr2 : values.entrySet()
) {
System.out.println(entyr2);
}
}
} public static void main(String[] args) {
KeywordReflect.print();
} }
9.对象库负责初始化所有需要用到的对象;
package keyWordsDriver; import java.util.HashMap;
import java.util.Map; /**
* 这是对象的注册中心 ;
*/
public class RegisterCenter {
public static Map<String, Object> OBJ_POOLS = new HashMap<String, Object>();
static{
OBJ_POOLS.put(MoveDesk.class.getName(), new MoveDesk());
} }
10.解析关键
package keyWordsDriver; import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
*
*/
public class RegExp {
public boolean match(String reg, String str) {
return Pattern.matches(reg, str);
} public List<String> find(String reg, String str) {
Matcher matcher = Pattern.compile(reg).matcher(str);
List<String> list = new ArrayList<String>();
while (matcher.find()) {
list.add(matcher.group());
}
return list;
} } package keyWordsDriver; import java.util.List; /**
* ParseKeyword 用于解析关键字,需要指定的格式 ;
*/
public class ParseKeyword {
public List<String> getKeywords(String p) {
String reg = "(?<=(?<!\\\\)\\$\\{)(.*?)(?=(?<!\\\\)\\})";
RegExp re = new RegExp();
List<String> list = re.find(reg, p);
return list; } public static void main(String[] args) { ParseKeyword p = new ParseKeyword();
System.out.println(p.getKeywords("${张三},去${把桌子从A地点搬到B地点}"));
System.out.println(p.getKeywords("a${a}a"));
System.out.println(p.getKeywords("a\\${a}a"));
System.out.println(p.getKeywords("a${a\\}a"));
System.out.println(p.getKeywords("a${a\\}a}a"));
System.out.println(p.getKeywords("a${a}a${"));
System.out.println(p.getKeywords("a${ab}a${a}")); } }
11,方法执行的过程:
package keyWordsDriver; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; /**
* 利用反射进行方法的执行 ;
*/ public class Executor {
private ParseKeyword pk = new ParseKeyword(); public List<String> readTxtFile(String filePath) {
List<String> list = new ArrayList<String>();
try {
String encoding = "UTF8";
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) {
list.add(lineTxt);
// System.out.println(" : "+lineTxt);
}
read.close();
bufferedReader.close();
} else {
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
return list;
} void print() {
String path = ClassLoader.getSystemClassLoader().getResource("command.txt").getPath();
List<String> lists = this.readTxtFile(path);
System.out.print("lists 总共有:"+lists.size()+"行 内容为: ");
for (String vaule : lists
) {
System.out.print(vaule);
}
} public void executor() {
String path = ClassLoader.getSystemClassLoader().getResource("command.txt").getPath();
List<String> commands = this.readTxtFile(path);
for (String command : commands) {
System.out.println("---------------------------------------------");
System.out.println("%%%%%%%%%%%%%%%%%%"+"command="+command+" %%%%%%%%%%%%%%%%%%%%%%");
List<String> keywords = pk.getKeywords(command); for (String keyword : keywords) {
this.invoke(keyword);
}
System.out.println("---------------------------------------------");
}
} public void invoke(String keyword) {
System.out.println("keyword="+keyword);
Map<String, String> keyMethod = KeywordReflect.KEYWORD_POOLS.get(keyword);
System.out.println("keyMethod="+keyMethod);
String className = keyMethod.get("class");
System.out.println("className="+className);
String methodName = keyMethod.get("method");
System.out.println("methodName="+methodName);
Object obj = RegisterCenter.OBJ_POOLS.get(className);
System.out.println("obj="+obj);
Method method = this.getMethod(methodName, obj);
System.out.println("method="+method);
try {
method.invoke(obj);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace(); } } private Method getMethod(String methodName, Object obj) {
try {
System.out.println("methodName="+methodName+"; obj="+obj.getClass().getName());
Method[] methods = obj.getClass().getMethods();
for (Method m : methods) {
if (m.getName().equals(methodName)) {
return m;
}
}
} catch (SecurityException e) {
return null;
}
return null;
} public static void main(String[] args) {
Executor e = new Executor();
e.print();
e.executor();
} }
12. 代码运行的结果:其实仔细的话从结果红你能看到你想看到的东西 ,上面有部分内容省略了 ;
"C:\Program Files\Java\jdk1.8.0_65\bin\java" -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\CustomSofter\develop\IDEA\IntelliJ IDEA Community Edition 2016.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_65\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\rt.jar;C:\CustomSofter\develop\IDEA\IdeaWorkspace_1\JaraPro\out\production\JaraPro;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\selenium-java-2.47.0.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\apache-mime4j-0.6.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\bsh-1.3.0.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\cglib-nodep-2.1_3.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\commons-codec-1.10.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\commons-collections-3.2.1.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\commons-exec-1.3.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\commons-io-2.4.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\commons-lang3-3.4.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\commons-logging-1.1.3.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\cssparser-0.9.16.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\gson-2.3.1.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\guava-18.0.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\hamcrest-core-1.3.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\hamcrest-library-1.3.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\htmlunit-2.17.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\htmlunit-core-js-2.17.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\httpclient-4.4.1.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\httpcore-4.4.1.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\httpmime-4.4.1.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\jcommander-1.29.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\jetty-io-9.2.11.v20150529.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\jetty-util-9.2.11.v20150529.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\jna-4.1.0.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\jna-platform-4.1.0.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\junit-4.12.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\nekohtml-1.9.22.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\netty-3.5.7.Final.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\phantomjsdriver-1.2.1.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\sac-1.3.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\serializer-2.7.2.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\testng-6.8.5.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\websocket-api-9.2.11.v20150529.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\websocket-client-9.2.11.v20150529.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\websocket-common-9.2.11.v20150529.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\xalan-2.7.2.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\xercesImpl-2.11.0.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\seleniumJar\selenium-2.47.0\libs\xml-apis-1.4.01.jar;C:\CustomSofter\develop\IDEA\softerwareJAR\othersJAR\jyaml\jyaml-1.3.jar;C:\CustomSofter\develop\IDEA\IntelliJ IDEA Community Edition 2016.2.4\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain keyWordsDriver.Executor
lists 总共有:1行 内容为: ${张三},去${把桌子从A地点搬到B地点}”,---------------------------------------------
%%%%%%%%%%%%%%%%%%command=${张三},去${把桌子从A地点搬到B地点}”, %%%%%%%%%%%%%%%%%%%%%%
keyword=张三
keyMethod={method=setZhangsan, class=keyWordsDriver.MoveDesk}
className=keyWordsDriver.MoveDesk
methodName=setZhangsan
obj=keyWordsDriver.MoveDesk@5674cd4d
methodName=setZhangsan; obj=keyWordsDriver.MoveDesk
method=public void keyWordsDriver.MoveDesk.setZhangsan() 大家好我是张三,你现在执行的方法为:setZhangsan() keyword=把桌子从A地点搬到B地点
keyMethod={method=moveDeskFromA2B, class=keyWordsDriver.MoveDesk}
className=keyWordsDriver.MoveDesk
methodName=moveDeskFromA2B
obj=keyWordsDriver.MoveDesk@5674cd4d
methodName=moveDeskFromA2B; obj=keyWordsDriver.MoveDesk
method=public void keyWordsDriver.MoveDesk.moveDeskFromA2B()
--------------------------------------------- Process finished with exit code 0
selenium 关键字驱动部分设计思路的更多相关文章
- Selenium关键字驱动测试框架Demo(Java版)
Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html
- UI自动化测试框架之Selenium关键字驱动 (转)
摘要 自动化测试框架demo,用关键字的形式将测试逻辑封装在数据文件中,测试工具解释这些关键字即可对其应用自动化 一.原理及特点 1. 关键字驱动测试是数据驱动测试的一种改进类型 2. 主要 ...
- 【转】UI自动化测试框架之Selenium关键字驱动
原网址:https://my.oschina.net/hellotest/blog/531932#comment-list 摘要: 自动化测试框架demo,用关键字的形式将测试逻辑封装在数据文件中,测 ...
- UI自动化测试框架之Selenium关键字驱动
一.原理及特点 1. 关键字驱动测试是数据驱动测试的一种改进类型 2. 主要关键字包括三类:被操作对象(Item).操作(Operation)和值(value),用面向对象形式可将其表现为Item.O ...
- Python&Selenium 关键字驱动测试框架之数据文件解析
摘要:在关键字驱动测试框架中,除了PO模式以及一些常规Action的封装外,一个很重要的内容就是读写EXCEL,在团队中如何让不会写代码的人也可以进行自动化测试? 我们可以将自动化测试用例按一定的规格 ...
- 自动化测试架构设计 &&自动化持续集成测试任务实战[线性测试、模块驱动测试、数据驱动测试、关键字驱动测试]
1 为什么设计自动化测试架构 1.1 企业现状分析 压力大:产品需求不明确,上线时间确定,压力山大. 混乱:未立项,开发时间已过半,前期无控制,后期无保障. 疲于应付:开发人员交付的文件质量差,测试跟 ...
- Backbone设计思路和关键源码分析
一. Backbone的江湖地位: backbone作为一个老牌js框架为大规模前端开发提供了新的开发思路:前端MVC模式,这个模式也是前端开发演变过程中的一个重要里程碑,也为MVVM和Redux等开 ...
- 数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索
UI自动化测试用例剖析 让我们先从分析一端自动化测试案例的代码开始我们的旅程.以下是我之前写的一个自动化测试的小Demo.这个Demo基于Selenium与Java.由于现在Selenium在自动化测 ...
- 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路
最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...
随机推荐
- WPF : ListBox的几种Template属性
原文:WPF : ListBox的几种Template属性 属性名 属性的类名 功能 示例 Template ControlTemplate 定义控件自身的外观.其子元素的布局可以自定义,也可以由It ...
- sqlserver 索引优化 CPU占用过高 执行分析 服务器检查
原文:sqlserver 索引优化 CPU占用过高 执行分析 服务器检查 1. 管理公司一台服务器,上面放的东西挺多的.有一天有个哥们告诉我现在程序卡的厉害.我给他说,是时候读点优化的书了.别一天到晚 ...
- Gson转换复杂对象报错【类型强转错误】
一.问题: 项目里遇到一个需求,规则文件下载后,导入本地解析. 采用的方案是:获取复杂对象,使用谷歌Gson转换为字串保存为文件下载,客户端读取文件,解析字串,反解对象 遇到的问题:传输的对象是一个嵌 ...
- 如何看数据库是否处在force_logging模式下
SQL> select log_mode, force_logging from v$database; LOG_MODE FOR------------ ---ARCHIVELOG ...
- 11- IO模型-未完成
1.同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么 ...
- 33 -jQuery 属性操作,文档操作(未完成)
- mysql好用的函数
FIND_IN_SET 用法示意: INSERT INTO `test` VALUES (1, 'name', 'daodao,xiaohu,xiaoqin'); INSERT INTO `test` ...
- Wannafly挑战赛24 B 222333
小水题???但是时间限制异常鬼畜,跑了2min \(P | (2^m)*(3^n)-1\)的意思就是\(2^m 3^n = 1 (\text{mod }P)\) 设f[i]表示3^k=i的最小的k 然 ...
- pdo的用处,用法
PDO主要是用来对数据库进行访问的.PDO扩展为PHP访问数据库定义了一个轻量级的一致接口,不同数据库在访问时,采用相同方法名称,解决了连接数据库不统一问题.PDO扩展自身并不能实现任何数据库功能,必 ...
- SQLMAP学习笔记2 Mysql数据库注入
SQLMAP学习笔记2 Mysql数据库注入 注入流程 (如果网站需要登录,就要用到cookie信息,通过F12开发者工具获取cookie信息) sqlmap -u "URL" - ...