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:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <config> 3 <browser>firefox</browser> 4 <waitTime>30</waitTime> 5 </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