selenium2-框架思想介绍
为什么要有框架?
可维护性
提高编写脚本效率
提高脚本的可读性
框架的几大要素:
1. driver管理
2. 脚本
3. 数据
4. 元素对象
5. Log
6. 报告
7. 运行机制
8. 失败用例重复运行
框架搭建的前期步骤
1.新建一个TestAutomation的Java项目
2.在这个项目下面新建一个config的文件夹,在config文件夹里面新建一个叫config.xml的文件
3.新建一个包:com.test.util
4.在项目下面再新建一个lib的文件夹,放入dom4j.jar与jaxen.jar,用来解析config.xml文件
5.再新建一个ParseXml.java的文件。
为什么要有config.xml文件
1.全局配置文件
2.可以在这里面配置运行哪个浏览器
3.可以定义等待元素display的时间
4.文件格式为.xml文件(当然可以用其它的文件格式,依个人喜好而定)
解析config.xml文件
1.使用dom4j.jar, jaxen-1.1.1.jar
2.代码演示解析过程及方法
1>文件载入
2>XML解析
3>XML节点判断
4>XML完整处理
5>XML读取案例
配置文件的值持久化
1.新建一个类:com.test.util.Config.java

Driver管理
1.新建一个com.test.base.SeleniumDriver类
2.代码演示
3.具体代码:

最后我们来启动一下浏览器

具体代码如下
config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<browser>firefox</browser>
<waitTime>30</waitTime>
</config>
ParseXml.java:
package com.test.util; import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; /*
* 读取xml配置文件
* 1. 加载
* 2. 解析
*/
public class ParseXml { private static Document document;
private String filePath; // 为了简化代码,否则每次都要px.load
public ParseXml(String filePath) {
this.filePath = filePath;
this.load(filePath);
} public void load(String filePath) {
// xml解析,首先载入xml文件,对这个文件对象进行xml分析处理
File file = new File(filePath);
if (file.exists()) {
SAXReader saxReader = new SAXReader();
try {
document = saxReader.read(file);
} catch (DocumentException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
System.out.println("文件加载异常" + filePath);
}
} else {
System.out.println("文件加载异常" + filePath);
}
// document.selectSingleNode(arg0)
} // 读取xml结点
public Element getElementObject(String elementPath) {
return (Element) document.selectSingleNode(elementPath);
} public String getElementText(String elementPath) {
Element element = this.getElementObject(elementPath);
if (element != null) {
return element.getTextTrim();
} else {
return null;
}
} /*
* 判断结点是否为空
*/
public boolean isExist(String elementPath) {
boolean flag = false;
Element element = this.getElementObject(elementPath);
if (element != null) {
flag = true;
}
return flag;
} /*
* 遍历结点
*/
// 加@是为了无视方法里边出现的警告
@SuppressWarnings("unchecked")
public List<Element> getElementObjects(String elementPath) {
return document.selectNodes(elementPath);
} // 遍历到map中
@SuppressWarnings("unchecked")
public Map<String, String> getChildrenInfoByElement(Element element) {
Map<String, String> map = new HashMap<String, String>();
List<Element> children = element.elements();
for (Element e : children) {
map.put(e.getName(), e.getText());
}
return map;
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// ParseXml px = new ParseXml();
// px.load("config/config.xml");
ParseXml px = new ParseXml("config/config.xml");
String browser = px.getElementText("/*/browser");
System.out.println(browser);
String waitTime = px.getElementText("/*/waitTime");
System.out.println(waitTime); // ParseXml px = new ParseXml("config/config.xml");
// List<Element> elements = px.getElementObjects("/*/testUI");
// Object[][] object = new Object[elements.size()][];
// for (int i = 0; i < elements.size(); i++) {
// Object[] temp = new Object[] { px.getChildrenInfoByElement(elements
// .get(i)) };
// object[i] = temp;
// }
// Object o = object[1][0];
// System.out.println(((Map<String, String>) o).get("description")); }
}
config.java:
package com.test.util;
public class config {
public static String Browser;
public static int waitTime;
// static是个静态写法,无论怎么执行,static只会执行一次
static {
ParseXml px = new ParseXml("config/config.xml");
Browser = px.getElementText("/*/browser");
// 强制转换为整型
waitTime = Integer.valueOf(px.getElementText("/*/waitTime"));
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 把init改写成static之后就不用每次手动调用init方法了,会自动调用staic,其只会执行一遍。
// config my = new config();
// my.init();
System.out.println(Browser);
System.out.println(waitTime);
}
}
SeleniumDriver.java:
package com.test.util; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver; public class SeleniumDriver {
public WebDriver driver; public WebDriver getDriver() {
return driver;
} // 初始化
public SeleniumDriver() {
this.initDriver();
} private void initDriver() {
if ("firefox".equals(config.Browser)) {
driver = new FirefoxDriver();
} else if ("ie".equals(config.Browser)) { } else if ("chrome".equals(config.Browser)) { } else {
System.out.println("浏览器匹配值错误" + config.Browser);
}
driver.manage().window().maximize();
driver.manage().timeouts()
.pageLoadTimeout(config.waitTime, TimeUnit.SECONDS);
// return driver;
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 定义对象的时候同时初始化,因为有构造函数
SeleniumDriver selenium = new SeleniumDriver();
WebDriver driver = selenium.getDriver();
driver.navigate().to("http://www.baidu.com");
driver.close();
} }
最后打个广告,不要介意哦~
最近我在Dataguru学了《软件自动化测试Selenium2》网络课程,挺不错的,你可以来看看!要是想报名,可以用我的优惠码 G863,立减你50%的固定学费!
链接:http://www.dataguru.cn/invite.php?invitecode=G863
selenium2-框架思想介绍的更多相关文章
- Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍
本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: htt ...
- vue对比其他框架详细介绍
vue对比其他框架详细介绍 对比其他框架 — Vue.jshttps://cn.vuejs.org/v2/guide/comparison.html React React 和 Vue 有许多相似之处 ...
- .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍
Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...
- 开源实体映射框架EmitMapper介绍
开源实体映射框架EmitMapper介绍 综述 EmitMapper是一个开源实体映射框架,地址:http://emitmapper.codeplex.com/. Emit ...
- [推荐]dubbo分布式服务框架知识介绍
[推荐]dubbo分布式服务框架知识介绍 CentOS+Jdk+Jboss+dubbo+zookeeper集群配置教程 http://wenku.baidu.com/view/20e8f36bf ...
- Django - Django框架 简单介绍
Django框架 简单介绍 本文地址: http://blog.csdn.net/caroline_wendy/article/details/29172271 1. 介绍 Django是一个开放源码 ...
- Cocos2d-iPhone V3 (1) 其基本程序常用的行动框架和介绍
Cocos2d-iPhone V3 (1) 其基本程序常用的行动框架和介绍 博客:http://blog.csdn.net/prevention 笔者:犀利哥 - 第一部分:一个 Cocos2d-iP ...
- 家庭洗车APP --- Androidclient开展 之 网络框架包介绍(一)
家庭洗车APP --- Android客户端开发 之 网络框架包介绍(一) 上篇文章中给大家简单介绍了一些业务.上门洗车APP --- Android客户端开发 前言及业务简单介绍,本篇文章给大家介绍 ...
- Go语言Web框架gwk介绍4
Go语言Web框架gwk介绍 (四) 事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(m ...
- Go语言Web框架gwk介绍 3
Go语言Web框架gwk介绍 (三) 上一篇忘了ChanResult ChanResult 可以用来模拟BigPipe,定义如下 type ChanResult struct { Wait syn ...
随机推荐
- response返回字符床
response.getWriter().println() 本来一个html,JSP等WEB资源返回的就是一个String,只是有时候这个String是符合html格式的,而刚是浏览器接收的了,所以 ...
- Java的常量接口思考,项目中的常量是放在接口里还是放在类里呢?
最近在看一本书 Java与模式,里面提了一句不建议使用常量接口,甚至举了个java源码的反例, 蛋疼的是没有说为什么? 查了网上一圈发现他们也是知道怎么做而不知道为什么这么做. 然后我只能找谷歌了,翻 ...
- Java语法基础(2)
一.变量与常量 1.标识符与关键字 (1). 标识符 标识符可以简单的理解为一个名字,用来标识类名.变量名.方法名.数组名.文件名的有效字符序列.如图所示. Java语言规定标识符由任意顺序的字母.下 ...
- Spring RestTemplate实现服务间的远程调用完整代码示例
父pom: 服务提供方 pom: provider配置文件: provider启动类: provider实体类: provider Mapper: 内置了增删改查的方法 provider Servic ...
- Java 面向对象,封装,继承
1相关概念的理解 1.1面向过程.面向对象 面向过程与面向对象都是编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.(职员思想) 面向 ...
- css文字与文本相关样式
css文字属性定义文本的字体系列,大小,加粗,风格和变形 font-family 设置字体系列 font-size 设置字体的尺寸 font-style ...
- JS将人民币小写金额转换为大写
/** 数字金额大写转换(可以处理整数,小数,负数) */ function smalltoBIG(n) { var fraction = ['角', '分']; var digit = ['零', ...
- github入门之更改提交操作--6
1.回溯历史版本 1.1.回溯到创建feature-A分支前 1.1.1.要让仓库的HEAD.暂存区.当前工作树回溯到指定状态,需要用到提供目标时间点的哈希值 1.1.2.回溯至未创建feature- ...
- HDU 2639 Bone Collector II (01背包,第k解)
题意: 数据是常规的01背包,但是求的不是最大容量限制下的最佳解,而是第k佳解. 思路: 有两种解法: 1)网上普遍用的O(V*K*N). 2)先用常规01背包的方法求出背包容量限制下能装的最大价值m ...
- 【Python图像特征的音乐序列生成】图像特征在旋律生成中有什么用
jishude 首先援引一个资料网页:http://www.cosmosshadow.com/ml/%E5%BA%94%E7%94%A8/2016/03/01/%E9%9F%B3%E4%B9%90%E ...






