在自动化测试的时候,通常都会把最常用的功能封装起来,实现通用性。

该篇博客是实现了getDriver方法的封装。

第一次封装的时候,是使用的传参。

@Parameters(value = {"driverType","dirvePath","fireFoxInstallPath","fireFoxVersion"})
public void getDriver(String driverType, String dirvePath, String fireFoxInstallPath, String fireFoxVersion) {
if (driverType.equals("ie")) {
driver = getIEDriver(dirvePath);
} else if (driverType.equals("chrome")) {
driver = getChromeDriver(dirvePath); } else if (driverType.equals("fireFox")) {
driver = getFireFoxDriver(dirvePath, fireFoxInstallPath, fireFoxVersion); }
} private WebDriver getFireFoxDriver(String dirvePath, String fireFoxInstallPath, String fireFoxVersion) {
System.setProperty(SystemProperty.BROWSER_BINARY, fireFoxInstallPath); if ("3.X".equals(fireFoxVersion)) {
System.setProperty(GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY, dirvePath); } return new FirefoxDriver();
} private WebDriver getChromeDriver(String dirvePath) {
System.setProperty(ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY, dirvePath);
return new ChromeDriver();
} private WebDriver getIEDriver(String dirvePath) {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true);
capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
System.setProperty(InternetExplorerDriverService.IE_DRIVER_EXE_PROPERTY, dirvePath);
return new InternetExplorerDriver(capabilities);
}

下面是testNG 的配置文件:

可以看到,这种实现方式,会使我们的配置文件变得比较庞大,不够清晰。每次切换 启动的浏览器类型的时候,要一项项修改配置文件,比较麻烦。

考虑到上述缺点,笔者重新换了实现方式。使用读取配置文件、反射的方法来切换浏览器的启动。

下面是实现方法:

1.准备配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 只需要修改下面的driverIndex 就可以去创建对应index的驱动-->
<driver driverIndex="3"> <!-- 谷歌浏览器配置文件 -->
<name value="org.openqa.selenium.chrome.ChromeDriver" index="0">
<properties>
<property
name="ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY"
value="E:/driver/chromedriver.exe" />
</properties>
</name> <!-- 火狐浏览器 对应的selenium3.x版本 的配置文件 -->
<name value="org.openqa.selenium.firefox.FirefoxDriver"
seleniumVersion="3.x" index="1">
<properties>
<property name="SystemProperty.BROWSER_BINARY"
value="C:\Program
Files (x86)\Mozilla Firefox\firefox.exe" />
<property
name="GeckoDriverService.GECKO_DRIVER_EXE_PROPERTY"
value="E:/driver/geckodriver.exe" />
</properties>
</name> <!-- 火狐浏览器 对应的selenium2.x版本 的配置文件 -->
<name value="org.openqa.selenium.firefox.FirefoxDriver"
seleniumVersion="2.x" index="2">
<properties>
<property name="SystemProperty.BROWSER_BINARY"
value="C:\Program
Files (x86)\Mozilla Firefox\firefox.exe" />
</properties>
</name> <!--IE浏览器配置文件 -->
<name value="org.openqa.selenium.ie.InternetExplorerDriver"
index="3">
<properties>
<property
name="InternetExplorerDriverService.IE_DRIVER_EXE_PROPERTY"
value="E:/driver/IEDriverServer.exe" />
</properties>
<capabilities>
<capability
name="InternetExplorerDriver.IGNORE_ZOOM_SETTING" />
<capability
name="InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS" />
</capabilities>
</name>
</driver>

下面是实现浏览器切换的代码:

package com.claire.jing.utils;

import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities; public class GetDriverUtil {
private static Class clazz;
private static Object obj ; public static void main(String[] args) throws InterruptedException {
WebDriver driver = getDriver();
driver.get("http://www.baidu.com"); Thread.sleep(10000);
driver.quit();
} public static WebDriver getDriver() {
Document document = null;
Element driverNameElement= null;
String driverName =null; SAXReader reader = new SAXReader();
try {
document = reader.read(GetDriverUtil.class.getResourceAsStream("/driverProperties.xml"));
} catch (DocumentException e) { e.printStackTrace();
} /**
* 下面是通过解析XML,获取到驱动的类全名
*/
Element rootElement = document.getRootElement(); //获取到根节点
int index = Integer.parseInt(rootElement.attributeValue("driverIndex"));//获取到根节点上的driverIndex并转成int类型 //获取到所有"name"子节点,遍历,找出与根节点中的driverIndex相同的,将其value属性值获取出来,作为类全名用于反射
List<Element> driverNameElements = rootElement.elements("name");
for (Element driverNameElement1 : driverNameElements) {
int i = Integer.parseInt(driverNameElement1.attributeValue("index"));
if (i == index) {
driverName = driverNameElement1.attributeValue("value");//获取到name子节点的“value”属性值
driverNameElement = driverNameElement1;//将该节点赋值给driverElement,后续根据它来获得子节点
} } /**
* 通过类全名,反射出驱动类来
*/
try {
clazz = Class.forName(driverName);
} catch (ClassNotFoundException e) { e.printStackTrace();
} /**
* 下面是解析XML中的系统参数以及能力参数
*/ Element propertiesElement = driverNameElement.element("properties");
List<Element> propertyElements = propertiesElement.elements("property"); //设置系统参数
for (Element property : propertyElements) { System.setProperty(property.attributeValue("name"), property.attributeValue("value")); } //设置能力(ie的话,需要设置忽略域设置等级 以及忽略页面百分比的能力)
Element capabilitiesElement = driverNameElement.element("capabilities");
if (capabilitiesElement != null) {
//创建能力对象
DesiredCapabilities realCapabilities = new DesiredCapabilities();
//获得能力列表
List<Element> capabilitiesElements = capabilitiesElement.elements("capability");
for (Element capability : capabilitiesElements) {
//遍历能力列表,并给能力赋值
realCapabilities.setCapability(capability.attributeValue("name"), true);
}
} /*
* 通过反射,创建驱动对象
*/ try {
obj = clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} WebDriver driver = (WebDriver) obj;
return driver;
} }

实现了只要修改配置文件中的driverIndex的值,就能去启动对应的浏览器。

自动化测试--封装getDriver的方法的更多相关文章

  1. Python+Appium自动化测试(6)-元素等待方法与重新封装元素定位方法

    在appium自动化测试脚本运行的过程中,因为网络不稳定.测试机或模拟器卡顿等原因,有时候会出现页面元素加载超时元素定位失败的情况,但实际这又不是bug,只是元素加载较慢,这个时候我们就会使用元素等待 ...

  2. 自动化测试--封装JDBCUnit

    在进行测试的时候,经常需要对数据库进行操作.我们知道,通过代码与数据库交互,需要以下几步: 1.加载驱动 之前有盆友问我,为什么Selenium操作浏览器的时候,非要下载浏览器驱动?为啥对数据库进行操 ...

  3. 总结Allegro元件封装(焊盘)制作方法[修整]

    总结Allegro元件封装(焊盘)制作方法 在Allegro系统中,建立一个零件(Symbol)之前,必须先建立零件的管脚(Pin).元件封装大体上分两种,表贴和直插.针对不同的封装,需要制作不同的P ...

  4. JS如何封装一些列方法为一个对象的操作,然后集中管理这些操作,方便修改和调用

    var Api = { ajax:{ // 添加项目 旧! add_project : function(pro_name, html, css, js,callback) { $.post(&quo ...

  5. PHP封装Excel表方法使用流程

    今天总结了一下Excel表的封装和导出使用,原理 经常使用与一些日常报表, 数据报表, 实现方法比较简单, 一次封装, 简单的方法调用,简单~ 废话不多说,直接入正题, 先说下重要的参数要记住的东西 ...

  6. javascript封装自定义滚动条方法,可自定义四个边框滚动条

    还是根据我的个人习惯封装了一个方法 setScroll({ box :父盒子DOM对象, content : 内容盒子DOM对象, scrollall : 滚动条大盒子DOM对象, scroll : ...

  7. 在jsp提交表单的参数封装到一个方法里

    建议去看一下孤傲苍狼写的Servlet+JSP+JavaBean开发模式(http://www.cnblogs.com/xdp-gacl/p/3902537.html), 最好把他JavaWeb学习总 ...

  8. 几种封装javaBean的方法

    开发框架时,经常需要使用java对象(javaBean)的属性来封装程序的数据,封装javaBean的方法有很多,比如反射,内省,以及使用工具类.下面从反射开始介绍. 1.javaBean介绍: 简介 ...

  9. Python类总结-封装(私有属性,方法)

    封装基础 广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装 只让自己的对象能调用自己类中的方法 狭义上的封装-面向对象三大特性之一(私有变量,用公有的方法封装私有属性,方法叫封装) 把 ...

随机推荐

  1. require,import区别?

    遵循的模块化规范不一样 模块化规范:即为 JavaScript 提供一种模块编写.模块依赖和模块运行的方案.谁让最初的 JavaScript 是那么的裸奔呢——全局变量就是它的模块化规范. requi ...

  2. 【洛谷P1272】 重建道路

    重建道路 题目链接 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此, ...

  3. c# 常见验证邮箱、电话号码、日期等格式

    #region 验证邮箱验证邮箱 /**//// <summary> /// 验证邮箱 /// </summary> /// <param name="sour ...

  4. 解决:fontawesome-webfont.woff2?v=4.6.3 404 (Not Found)

    用Bootstrap里面的字体,你项目中会报一个错,一个字体找不到,但我们的项目中却是存在这个字体的. 解决方法: 修改我们的Web.Config文件

  5. JS JavaScript闭包和作用域

    JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外一个函数作用域中变量的函数. 从概念上,闭包有两个特点: 1.函数 2.能访问另外一个函数的作用域中的变量 在ES6之前,JavaS ...

  6. vue进阶语法及生命周期函数

    1.calss和style绑定 操作元素的 class 列表和内联样式style是数据绑定的一个常见需求,它两都是属性,所以可以通过v-bind来绑定 1.1绑定HTML class 可以给v-bin ...

  7. c# 调用服务返回结果模板化

    一般我们返回一个结果,主要有返回值,执行结果信息,所以定义一个类 public  class QuestResult    { /// <summary>        /// 返回值  ...

  8. IDEA中解决Edit Configurations中没有tomcat Server选项的问题(附配置Tomcat)

    1.点击File-->settings(Ctrl+Alt+S) 2.在弹出的窗口中的搜索框中输入appliation,然后选择下方的Plugins,再然后勾选左侧Installed中的如图所示的 ...

  9. vue组件的基本知识点

    1. 组件中 is 的特性: 有些 HTML 元素,诸如 <ul>.<ol>.<table> 和 <select>,对于哪些元素可以出现在其内部是有严格 ...

  10. vue入门——组件基础todolist

    1. 以下是 todolist 的例子,没有用到组件:下面的3 会通过组件拆分todolist <!DOCTYPE html> <html lang="en"&g ...