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

该篇博客是实现了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. Ubuntu 16.04 源码方式安装 JDK

    1.去官网下载JDK http://www.oracle.com/technetwork/articles/javase/index-jsp-138363.html 2.下载完成后,创建一个我们将要安 ...

  2. 六、修改 IntelliJ IDEA 模板注释中的 user 内容

    咱们进一步了解了 IntelliJ IDEA 的个性化设置功能,包括主题和字体的常用设置等,修改后,具体的效果,如下图所示: 观察上图,不知道大家有没有注意到:IntelliJ IDEA 自带模板注释 ...

  3. Intellij idea创建(包、文件)javaWeb以及Servlet简单实现(Tomcat)

    准备:1. 安装jdk2. 安装tomcat 一.创建并设置javaweb工程 创建项目成功 创建包 创建Servlet 创建包成功,但是报错,原因是没有引入包 我们先表明 现在要引入servlet- ...

  4. mysql 统一字符编码

    配置文件中的注释可以有中文,但是配置项中不能出现中文 #在mysql的解压目录下,新建my.ini,然后配置 #1. 在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效 [mysql ...

  5. Mybatis自动生成的BO对象继承公共父类(BO中过滤掉公共属性)

    使用mybatis的代码生成工具:mybatis-generator,如果自动生成的BO都有公共的属性,则可以指定这些BO继承父类(父类中定义公共属性) 1.定义父类 注意:属性public,不要使用 ...

  6. deep learning学习记录三

    deep learning,这几年有多火!! imagenet比赛,大家今年都是基于去年的基础上改进和应用的,效果比去年提升当然. 在deep learning方向,hinton, benjio, l ...

  7. Python常用模块之time和datetime

    1.时间的格式化 结构化时间 ##把字符串时间转换成结构化时间 time.strptime("2017-06-21","%Y-%m-%d") ##把结构化时间转 ...

  8. C++ vector用法积累

    1. vector的初始化 2. vector基本操作 2.1 vector属性 size resize 2.2 vector操作 插入 在最后插入一个元素 push_back() 删除 在最后删除一 ...

  9. CentOS7——网络配置

    ip addr #查看当前IP地址信息.(contos7以下的为ifconfig) /etc/sysconfig/network-scripts/ifcfg-*** #***代表不一定的,需要进入该设 ...

  10. oracle调度中使用schedule管理调度

    开始前,先说一句:作为dba应该禁止所有应用使用dbms_job. dbms_scheduler非常复杂,oracle在两本书中专门花费不少章节描述,这两本书分别是: Oracle® Database ...