为什么要有框架?

可维护性

提高编写脚本效率

提高脚本的可读性

框架的几大要素:

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

最新文章

  1. 文本深度表示模型Word2Vec
  2. verilog阻塞与非阻塞的初步理解(一)
  3. jsp中frameset frame不显示页面
  4. Python 特殊语法:filter、map、reduce、lambda
  5. HDAO one error
  6. 在linux服务器上装svn版本管理,自动部署代码到项目
  7. mobileconfig文件的签名和认证(signed、verified)
  8. APP界面设计之页面布局的22条基本原则
  9. WPF学习随笔
  10. Oracle 使用命令导入dmp文件
  11. Kafka快速上手(2017.9官方翻译)
  12. ng-select 下拉的两种方式
  13. JqGrid 显示表格
  14. 和逛微博、刷朋友圈一样玩转 GitHub
  15. c# 使用Renci.SshNet.dll操作SFTP总结
  16. 对 JSON 数据进行序列化和反序列化
  17. poj 1177 --- Picture(线段树+扫描线 求矩形并的周长)
  18. 日志模块logging
  19. 学习笔记: ES7(ES2016)新功能
  20. 如何验证 Email 地址:SMTP 协议入门教程

热门文章

  1. CDH5.7.2离线部署笔记
  2. 对于es线程池使用的思考
  3. SyntaxError: Use of const in strict mode.
  4. 部署WebService服务碰到的一个小问题
  5. SpringBoot 2.x (13):整合ActiveMQ
  6. Kendo UI 单页面应用(二) Router 类
  7. GIT新手入门学习教程
  8. 51nod 1101 换零钱
  9. 使用JS的画布制作一个瞄准镜
  10. 使用Process组件访问本地进程