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这种架构,我博客 ...
随机推荐
- PyQt5利用QPainter绘制各种图形
这个例子我做了好几天: 1)官网C++的源码,改写成PyQt5版本的代码,好多细节不会转化 2)网上的PyQt的例子根本运行不了 填了无数个坑,结合二者,终于能完成了一个关于绘图的东西.这个过程也掌握 ...
- 一维码Code 128简介及其解码实现(zxing-cpp)
一维码Code 128:1981年推出,是一种长度可变.连续性的字母数字条码.与其他一维条码比较起来,相对较为复杂,支持的字元也相对较多,又有不同的编码方式可供交互运用,因此其应用弹性也较大. Cod ...
- 7 stark组件介绍、配置、2层url
1.django的admin配置 model.py from django.db import models # Create your models here. class UserInfo(mod ...
- CF 1138 F. Cooperative Game
F. Cooperative Game 链接 题意: 有10个玩家,开始所有玩家在home处,每次可以让一些玩家沿着边前进一步,要求在3(t+c)步以内,到达终点. 分析: 很有意思的一道题.我们构造 ...
- 洛咕 P3321 [SDOI2015]序列统计
显然dp就是设\(f[i][j]\)表示dp了i轮,对m取膜是j的方案数 \(f[i][xy\mod m]=f[i-1][x]\times f[i-1][y]\) 这是\(O(nm^2)\)的 像我这 ...
- PCB设计铜箔厚度、线宽和电流关系
PCB的载流能力取决于一下因素:线宽.线厚.容许温升.在同等条件下,假设10mil的走线能承受1A,那么50mil的走线能承受的电流却不是5A. 如下: 1 盎司 = 0.0014英寸 = 0.035 ...
- Shader Variants 打包遇到的问题
1. 遇到的问题 最常见的是打包到手机后效果与PC上不一致,具体情况比如: 光照贴图失效 雾失效 透明或者cutoff失效 以上首先需要检查的地方是Shader变体的编译设置 2. 超级着色器编译成N ...
- docker 从本地拷贝文件
1.找到docker的ID全称 docker inspect -f '{{.Id}}' docker_name 2.执行拷贝命令 docker cp 本地文件路径 ID全称:docker路径 3.如果 ...
- 安装keystone时创建用户失败
系统:centos7.3 版本:openstack ocata 1.问题描述 安装keystone在创建用户时报错: The request you have made requires authen ...
- 机器学习(一):记一次k一近邻算法的学习与Kaggle实战
本篇博客是基于以Kaggle中手写数字识别实战为目标,以KNN算法学习为驱动导向来进行讲解. 写这篇博客的原因 什么是KNN kaggle实战 优缺点及其优化方法 总结 参考文献 写这篇博客的原因 写 ...