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 ...
随机推荐
- B. Game of the Rows
B. Game of the Rows time limit per test 1 second memory limit per test 256 megabytes input standard ...
- JavaScript是什么
JavaScript是一种解释型语言而不是编译型语言,它往往被认为是一种脚本语言,而不被看作是一种真正的编程语言.也就是说,脚本语言比较简单,它们是非程序员所使用的编程语言. 如果一个程序员对Java ...
- 【extjs6学习笔记】1.4 初始:ajax请求django应用
使用sencha创建应用,默认如下: personnel数据使用的是本地数据 做以下修改,使用ajax 启动时会报404[此次调用是使用nginx部署] django应用app_jiake中,修改vi ...
- 常用css和js组件
1 . input框中插入图标 <div class="col-sm-12 col-xs-12 setLineHeight"> <div class=" ...
- Layer:如何调用layer.open打开的的iframe窗口中的JS?
layer.open({type: 2,content: 'test/iframe.html',success: function(layero, index){ var body = layer.g ...
- Protocol Buffer学习教程之编译器与类文件(三)
Protocol Buffer学习教程之编译器与类文件(三) 1. 概述 在前面两篇中,介绍了Protobuf的基本概念.应用场景.与protobuf的语法等.在此篇中将介绍如何自己编译protobu ...
- Python+selenium之测试报告(1)
一.下载HTMLTestRunner.py HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展.它生成易于使用的 HTML 测试报告.HTMLTestRunne ...
- Spring.Net 能为我们做点什么
本文内容 概述 背景 模块 使用场景 入门应用 Spring.NET 相关项目 本文正式开始前,我以目前所能想到的.此时此刻能想到的,先简单说下,为什么会有像 Spring.Net 这样的东西.首先, ...
- jsp另外五大内置对象之out输出
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- 【Python图像特征的音乐序列生成】关于数据集的分享和样例数据
数据集还在制作中,样例数据如下: 我将一条数据作为一行,X是ID,O代表了情感向量,S是速度,是一个很关键的参数,K是调式,M是节拍,L是基本拍.后面是ABC格式的序列,通过embedding化这些音 ...