为什么要有框架?

可维护性

提高编写脚本效率

提高脚本的可读性

框架的几大要素:

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:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <config>
  3. <browser>firefox</browser>
  4. <waitTime>30</waitTime>
  5. </config>

ParseXml.java:

  1. package com.test.util;
  2.  
  3. import java.io.File;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import org.dom4j.Document;
  9. import org.dom4j.DocumentException;
  10. import org.dom4j.Element;
  11. import org.dom4j.io.SAXReader;
  12.  
  13. /*
  14. * 读取xml配置文件
  15. * 1. 加载
  16. * 2. 解析
  17. */
  18. public class ParseXml {
  19.  
  20. private static Document document;
  21. private String filePath;
  22.  
  23. // 为了简化代码,否则每次都要px.load
  24. public ParseXml(String filePath) {
  25. this.filePath = filePath;
  26. this.load(filePath);
  27. }
  28.  
  29. public void load(String filePath) {
  30. // xml解析,首先载入xml文件,对这个文件对象进行xml分析处理
  31. File file = new File(filePath);
  32. if (file.exists()) {
  33. SAXReader saxReader = new SAXReader();
  34. try {
  35. document = saxReader.read(file);
  36. } catch (DocumentException e) {
  37. // TODO Auto-generated catch block
  38. // e.printStackTrace();
  39. System.out.println("文件加载异常" + filePath);
  40. }
  41. } else {
  42. System.out.println("文件加载异常" + filePath);
  43. }
  44. // document.selectSingleNode(arg0)
  45. }
  46.  
  47. // 读取xml结点
  48. public Element getElementObject(String elementPath) {
  49. return (Element) document.selectSingleNode(elementPath);
  50. }
  51.  
  52. public String getElementText(String elementPath) {
  53. Element element = this.getElementObject(elementPath);
  54. if (element != null) {
  55. return element.getTextTrim();
  56. } else {
  57. return null;
  58. }
  59. }
  60.  
  61. /*
  62. * 判断结点是否为空
  63. */
  64. public boolean isExist(String elementPath) {
  65. boolean flag = false;
  66. Element element = this.getElementObject(elementPath);
  67. if (element != null) {
  68. flag = true;
  69. }
  70. return flag;
  71. }
  72.  
  73. /*
  74. * 遍历结点
  75. */
  76. // 加@是为了无视方法里边出现的警告
  77. @SuppressWarnings("unchecked")
  78. public List<Element> getElementObjects(String elementPath) {
  79. return document.selectNodes(elementPath);
  80. }
  81.  
  82. // 遍历到map中
  83. @SuppressWarnings("unchecked")
  84. public Map<String, String> getChildrenInfoByElement(Element element) {
  85. Map<String, String> map = new HashMap<String, String>();
  86. List<Element> children = element.elements();
  87. for (Element e : children) {
  88. map.put(e.getName(), e.getText());
  89. }
  90. return map;
  91. }
  92.  
  93. /**
  94. * @param args
  95. */
  96. public static void main(String[] args) {
  97. // TODO Auto-generated method stub
  98. // ParseXml px = new ParseXml();
  99. // px.load("config/config.xml");
  100. ParseXml px = new ParseXml("config/config.xml");
  101. String browser = px.getElementText("/*/browser");
  102. System.out.println(browser);
  103. String waitTime = px.getElementText("/*/waitTime");
  104. System.out.println(waitTime);
  105.  
  106. // ParseXml px = new ParseXml("config/config.xml");
  107. // List<Element> elements = px.getElementObjects("/*/testUI");
  108. // Object[][] object = new Object[elements.size()][];
  109. // for (int i = 0; i < elements.size(); i++) {
  110. // Object[] temp = new Object[] { px.getChildrenInfoByElement(elements
  111. // .get(i)) };
  112. // object[i] = temp;
  113. // }
  114. // Object o = object[1][0];
  115. // System.out.println(((Map<String, String>) o).get("description"));
  116.  
  117. }
  118. }

config.java:

  1. package com.test.util;
  2.  
  3. public class config {
  4.  
  5. public static String Browser;
  6. public static int waitTime;
  7.  
  8. // static是个静态写法,无论怎么执行,static只会执行一次
  9. static {
  10. ParseXml px = new ParseXml("config/config.xml");
  11. Browser = px.getElementText("/*/browser");
  12. // 强制转换为整型
  13. waitTime = Integer.valueOf(px.getElementText("/*/waitTime"));
  14.  
  15. }
  16.  
  17. /**
  18. * @param args
  19. */
  20. public static void main(String[] args) {
  21. // TODO Auto-generated method stub
  22. // 把init改写成static之后就不用每次手动调用init方法了,会自动调用staic,其只会执行一遍。
  23. // config my = new config();
  24. // my.init();
  25. System.out.println(Browser);
  26. System.out.println(waitTime);
  27. }
  28. }

SeleniumDriver.java:

  1. package com.test.util;
  2.  
  3. import java.util.concurrent.TimeUnit;
  4.  
  5. import org.openqa.selenium.WebDriver;
  6. import org.openqa.selenium.firefox.FirefoxDriver;
  7.  
  8. public class SeleniumDriver {
  9. public WebDriver driver;
  10.  
  11. public WebDriver getDriver() {
  12. return driver;
  13. }
  14.  
  15. // 初始化
  16. public SeleniumDriver() {
  17. this.initDriver();
  18. }
  19.  
  20. private void initDriver() {
  21. if ("firefox".equals(config.Browser)) {
  22. driver = new FirefoxDriver();
  23. } else if ("ie".equals(config.Browser)) {
  24.  
  25. } else if ("chrome".equals(config.Browser)) {
  26.  
  27. } else {
  28. System.out.println("浏览器匹配值错误" + config.Browser);
  29. }
  30. driver.manage().window().maximize();
  31. driver.manage().timeouts()
  32. .pageLoadTimeout(config.waitTime, TimeUnit.SECONDS);
  33. // return driver;
  34. }
  35.  
  36. /**
  37. * @param args
  38. */
  39. public static void main(String[] args) {
  40. // TODO Auto-generated method stub
  41. // 定义对象的时候同时初始化,因为有构造函数
  42. SeleniumDriver selenium = new SeleniumDriver();
  43. WebDriver driver = selenium.getDriver();
  44. driver.navigate().to("http://www.baidu.com");
  45. driver.close();
  46. }
  47.  
  48. }

最后打个广告,不要介意哦~

最近我在Dataguru学了《软件自动化测试Selenium2》网络课程,挺不错的,你可以来看看!要是想报名,可以用我的优惠码 G863,立减你50%的固定学费!

链接:http://www.dataguru.cn/invite.php?invitecode=G863

selenium2-框架思想介绍的更多相关文章

  1. Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍

    本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: htt ...

  2. vue对比其他框架详细介绍

    vue对比其他框架详细介绍 对比其他框架 — Vue.jshttps://cn.vuejs.org/v2/guide/comparison.html React React 和 Vue 有许多相似之处 ...

  3. .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍

    Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...

  4. 开源实体映射框架EmitMapper介绍

    开源实体映射框架EmitMapper介绍   综述       EmitMapper是一个开源实体映射框架,地址:http://emitmapper.codeplex.com/.       Emit ...

  5. [推荐]dubbo分布式服务框架知识介绍

    [推荐]dubbo分布式服务框架知识介绍 CentOS+Jdk+Jboss+dubbo+zookeeper集群配置教程    http://wenku.baidu.com/view/20e8f36bf ...

  6. Django - Django框架 简单介绍

    Django框架 简单介绍 本文地址: http://blog.csdn.net/caroline_wendy/article/details/29172271 1. 介绍 Django是一个开放源码 ...

  7. Cocos2d-iPhone V3 (1) 其基本程序常用的行动框架和介绍

    Cocos2d-iPhone V3 (1) 其基本程序常用的行动框架和介绍 博客:http://blog.csdn.net/prevention 笔者:犀利哥 - 第一部分:一个 Cocos2d-iP ...

  8. 家庭洗车APP --- Androidclient开展 之 网络框架包介绍(一)

    家庭洗车APP --- Android客户端开发 之 网络框架包介绍(一) 上篇文章中给大家简单介绍了一些业务.上门洗车APP --- Android客户端开发 前言及业务简单介绍,本篇文章给大家介绍 ...

  9. Go语言Web框架gwk介绍4

    Go语言Web框架gwk介绍 (四)   事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(m ...

  10. Go语言Web框架gwk介绍 3

    Go语言Web框架gwk介绍 (三)   上一篇忘了ChanResult ChanResult 可以用来模拟BigPipe,定义如下 type ChanResult struct { Wait syn ...

随机推荐

  1. Storm概念学习系列之并行度与如何提高storm的并行度

    不多说,直接上干货! 对于storm来说,并行度的概念非常重要!大家一定要好好理解和消化. storm的并行度,可以简单的理解为多线程. 如何提高storm的并行度? storm程序主要由spout和 ...

  2. Swagger 2.0 集成配置

    传统的API文档编写存在以下几个痛点: 对API文档进行更新的时候,需要通知前端开发人员,导致文档更新交流不及时: API接口返回信息不明确 大公司中肯定会有专门文档服务器对接口文档进行更新. 缺乏在 ...

  3. 传纸条(scrip)

    传纸条(scrip) 题目背景 Awson是某国际学校信竞组的一只菜鸡.每次竞赛考试都只能垫底.终于有一天,他决定不再苟活,发挥他的人脉优势,准备在一次竞赛考试时传纸条作弊. 题目描述 他预先知道了考 ...

  4. 关于编译错误ambiguous call of overridden pre R14 auto-imported BIF get/1

    今天写代码用到了进程字典,出现了一个编译错误 根据相关提示改成了erlang:put erlang/get以后即编译通过

  5. hadoop完全分布式模式搭建和hive安装

    简介 Hadoop是用来处理大数据集合的分布式存储计算基础架构.可以使用一种简单的编程模式,通过多台计算机构成的集群,分布式处理大数据集.hadoop作为底层,其生态环境很丰富. hadoop基础包括 ...

  6. Oracle创建用户、表(1)

    Oracle创建用户.表(1) 1. 连接 C:\Users\LEI>sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on ...

  7. Swing---WindowConstants

    Java桌面开发过程中,很多人都写过类似下面的代码. import javax.swing.JFrame; public class SimpleFrame { public static void ...

  8. JAVA-WEB总结01

    1 工具常用的快捷键   1) Eclipse和MyEclipse,IBM,2001,Java编写,开源,跨平台跨语言   2)Alt+/快速内容提示(自己习惯定义)   3)Ctrl+1快速修补错误 ...

  9. jsp之数据提交与获取(传统方法)

    package com.java.model; public class Student { private String name; private int age; public String g ...

  10. COGS 2342. [SCOI2007]kshort

    ★★☆   输入文件:bzoj_1073.in   输出文件:bzoj_1073.out   简单对比时间限制:2 s   内存限制:512 MB [题目描述] 有n个城市和m条单向道路,城市编号为1 ...