Selenium2自动化测试框架



搜索系统WebDriver自动化测试

修订记录

|修订时间 |版本 |内容概要 |作者 |

|2012-8-1 |V1.0 |搜索系统WebDriver自动化测试 |董清清 |

| | | | |

| | | | |

| | | | |

| | | | |

搜索系统WebDriver自动化测试 1

1概述 3

2 WebDriver介绍 3

2.1 Selenium2与WebDriver 3

2.2 WebDriver 5

2.2.1 WebDriver种类 5

2.2.2 WebDriver分析 5

2.2.3 WebDriver原理 9

2.2.4 WebDriver总结 10

2.3 WebDriver依赖 11

2.4 WebDriver使用 12

2.2.3 使用maven搭建工程 12

2.4.2 编写WebDriver测试类 16

3 搜索功能自动化 17

3.1 工程目录 17

3.2 实现原理 18

3.3 脚本规则 19

3.4 脚本编写与执行 19

3.4.1 测试用例选择 19

3.4.2 准备测试数据 20

3.4.3 编写测试脚本 20

3.4.4 本机调试运行 21

3.4.5 上传版本管理 21

3.4.6 纳入持续集成 21

3.4.7 每日持续回归 21

3.5 目前状况 22

4结论 23

4.1 WebDriver在搜索系统的可行性 23

5相关资料 23

1概述

Selenium是一种适合web自动化测试的工具,在selenium2.0版本之后,selenium推出了一个新的测试工具—WebDriver,用来代替即将废弃的selenium Remote Control,selenium webdriver更适合构建强健,基于浏览器上的回归测试,并可在跨平台间运行测试脚本。自搜索进行search2.5项目起,页面dome结构将不会有大的改动,搜索前端将更适合进行功能的自动化测试,考虑到公司主流开发语言为java,为了方便之后扩展和维护此自动化测试框架,搜索系统自动化测试框架也采用基于java开发的selenium框架,本文档是基于此特性进行的编写。

2 WebDriver介绍

2.1 Selenium2与WebDriver

Selenium2.0最大的不同就是包含WebDriver API,测试者可以根据不同的平台,不同浏览器选择不同的WebDriver进行测试。WebDriver它可以驱动本地或远程机器上的浏览器。测试者可以使用或都不使用selenium server,取决于你如何来使用selenium。如果严格按照webdriver api来使用,是不需要selenium server的,因为webdriver使用了与selenium RC完全不同的技术来实现与浏览器的交互,Selenium webdriver直接调用本地的浏览器来支持自动化;而selenium RC则是通过selenium server把javascript脚本注射到浏览器中,然后通过特定的测试脚本命令调用javascript命令,从而实现与浏览器的交互操作。总之,如果你使用selenium webdriver,就不需要再使用selenium server了。

WebDriver也可看成是基于Selenium的一个自动化测试类库,是selenium2.0之后的三个工具之一。WebDriver实现了多种方法(ById,ByName,ByLinkText,ByClassName,ByXPath等)并通过发送命令的方式来操作页面的某元素,模拟测试者在浏览器上与web应用进行交互。

在Selenium2之后的版本,selenium主要包括以下4个部份:

• Selenium IDE:FireFox 的一个插件,支持脚本录制与回放,用selenium远程控制运行测试,只支持Firefox。

• Selenium RC:Selenium Remote Control,梱绑selenium Core,支持多语言编程测试用例。

• Selenium WebDriver:selenium2中的新工具,提供强大的API接口,实现驱动本地或远程计算机上的浏览器。

• Selenium Grid:允许同时并行地、在不同的环境上运行多个测试任务,极大地加快Web 应用的功能测试。

2.2 WebDriver

2.2.1 WebDriver种类

目前WebDriver针对不同平台,不同浏览器,总共有7个实现,包括官网与第三方实现:

|Name of driver |which OS |Pro language |

|HtmlUnit Driver |All |Java,C#,Python,Ruby |

|Firefox Driver |All |Java,C#,Python,Ruby |

|Internet Explorer Driver |Windows |Java,C#,Python,Ruby |

|Chrome Driver |All |Java,C#,Python,Ruby |

|Opera Driver | |Java,C#,Python,Ruby |

|iPhone Driver | |Java,C#,Python,Ruby |

|Android Driver | |Java,C#,Python,Ruby |

2.2.2 WebDriver分析

1. HtmlUnit Driver

htmlUnit Driver是目前运行速度最快且最轻量级的WebDriver,根据它的名称可以知道,htmlUnit Driver是基于htmlUnit实现的。

优点:

1. 最快的webdriver实现。

2. 纯java实现并且是一个独立的平台。

3. 支持javascript。

缺点:

1)模拟其它浏览器的javascript行为。

常用的类和方法:

|Class name |Method |

|org.openqa.selenium.htmlunit.HtmlUnitDriver |HtmlUnitDriver() |

| |findElement(By by) |

| |findElementById(String id) |

| |findElementByName(String name) |

| |findElementByXPath(String selector) |

例子:

HtmlUnitDriver driver = new HtmlUnitDriver();

driver.setJavascriptEnabled(true);

2. Firefox Driver

通过new一个FirefoxDriver实例来启动firefox浏览器,FirefoxDriver2.5支持firefox 7。

优点:

1. 在真实的浏览器中运行。

2. 运行速度比Internet Explorer Driver快

4. 支持javascript。

缺点:

1)比Htmlunit Driver慢。

常用的类和方法:

|Class name |Method |

|org.openqa.selenium.firefox.FirefoxDriver |FirefoxDriver() |

| |FirefoxDriver(FirefoxProfile profile) |

|org.openqa.selenium.firefox. FirefoxProfile |FirefoxProfile() |

| |installExtensions(File parentDir) //向tmp中加载文件 |

|org.openqa.selenium.firefox .FirefoxBinary |startFirefoxProcess(ProcessBuilder builder) |

| |//调用java中start()方法以-silent方式启动浏览器 |

例子:

System.setProperty("webdriver.firefox.bin","D:/program/Firefox/firefox.exe");

WebDriver driver = new FirefoxDriver();

工作流程:

FirefoxDriver按照RPC机制实现,主要写成一个Firefox插件形式,采用socket实现通信连接,并以JSon的格式发送命令,插件通过利用Firefox本身提供的XPCOM基元实现与浏览器的操作。操作命令可以在javascript中具体看到,前缀以"FirefoxDriver.prototype"开头。主要流程分为三个大的步骤:启动Firefox浏览器,发送命令,执行并返回结果。

◆ 启动Firefox流程:

1. 获取Firefox的端口号,默认是7055,如果7055端口被占用,则采取依次递减的方法,保证端口号唯一。

2. 确保第二个driver的端口号,如果第一个是7055,则第二个是7056。

3. 定位Firefox所用的配置文件,通常是anonymous。

4. 复制步骤3中的配置文件到当前用户的tmp目录下,包括为FirefoxDriver实现的Firefox插件,忽略已经运行过的配置文件。

5. 删除已经存在的缓存文件,确保浏览器在运行时都是取最新的插件。

6. 更新user.js中的参数,使WebDriver按照预期正常工作,把步骤2中的端口号赋值给webdriver_firefox_port参数。

7. 以“-silent”方式启动Firefox,让Firefox使用最新加载的配置文件运行,因为Firefox启动时,需要查找和修改这些配置文件。

8. Firefox实例完成后,结束以“-silent”方式启动的Firefox进程。

9. 再次启动Firefox,测试类开始不停连接Firefox,直到超时为止。

10. 释放端口号

◆ 发送命令,执行并返回结果:

FirefoxDriver本质可以看成是RemoteWebDriver运行在客户端的一个实例。在以java为实现语言中,从客户端发送命令到Firefox的基本原理为:

1. 创建一个新的map或dictionary,把命令put到这个map中,格式为:

• Context:在客户端中写成一个String类型,不透明的key。

• CommandName:浏览器执行的命令,String类型。

• Parameters:参数,类型取决于commandName类型,可以为空。

• elementId:一个不透明的元素标识,String类型。

2. 使用Json实例步骤1中的map。

3. 通过socket协议连接FirefoxDriver插件。

4. 通过wire的形式把Json发送到Firefox浏览器

5. 通过另一个map,以Json的格式返回响应

• methodName:响应方法的名称,String类型。

• context:响应内容。

• isError:声明异常

• responseText:异常内容,如果有异常则会有这个字段。

当命令到达Firefox插件中后,JSON格式的命令则会被反序列化成一个javascript对象。第一件事就是解释命令的名称,但有些命令是不会被注意到,可以看成是windows或frame使用的。为了能执行这些命令,通常这些命令都命名为:FirefoxDriver.prototype.xxx,如get命令:

FirefoxDriver.prototype.get = function(respond, url)

3. Android Driver

AndroidWebDriver通过在手机或模拟器上安装android-server.apk,android-server是一个解释执行服务器,用jetty实现。

1)首先安装并启动android-server

2)测试程序通过采用socket进行通信,建立连接。

3)以JSON格式发送命令到android-server中

4)android-server获取到命令后解释并执行。

5)返回结果

在AndroidWebDriver中,页面直接运行在WebDriver中,采用官网上提供的WebDriver不支持本地浏览器,所以不能调UC浏览器进行测试,而且必须在手机或模拟器上启动jetty服务器才能运行测试类。连接不稳定,有时JSON发送不出去,容易使测试程序运行失败。

2.2.3 WebDriver原理

WebDriver主要有两种工作模式:

➢ 一种是客户端模式,如FirefoxDriver,OperaDriver和RemoteWebDriver;

具体流程如下:

1,建立socket协议实现对浏览器端口进行监听;

2,把需要用到的配置文件加载到本地(如FirefoxDriver加载到本地用户临时文件夹中);

3,通过调用实现语言中的方法启动浏览器(如java中调用java.lang. ProcessBuilder.start()方法)

1. 浏览器启动后,再把测试程序中对浏览器页面模拟的操作以JSON的格式,通过HTTP协议发送到浏览器端。根据不同浏览器的特性解析这些命令(如FirefoxDriver采用插件的方式),并执行相关操作。

2. 结束后关闭driver。

➢ 一种是服务端模式,这种需要启动服务器,WebDriver在浏览器中运行,如ChromeDriver。

2.2.4 WebDriver总结

优点:

1. 用户可以针对不同的浏览器,不同的平台,选择或是自行开发WebDriver

2. Selenium 2提供了全面的接口和实现

3. 源代码开源

缺点:

1. 主要来自浏览器,因为浏览器众多,需要根据浏览器自身的特性选择或定制WebDriver

2. 一个WebDriver只能实现对一种浏览器进行操作,如果要进行多浏览器的测试,需要在编写测试程序时进行封装。

2.3 WebDriver依赖

WebDriver目的用于代替selenium RC,在WebDriver实现中,除了webdriver外,webdriver还与selenium-server,selenium-java,selenium-remote-driver,selenium-support和selenium-api下图:

[pic]

• Selenium-api:selenium2类库中最高层的类库,主要功能是向下提供丰富的接口类。常用的类有:WebDriver,WebElement,By等等。Selenium-api依赖于google的guava库。

• Selenium-remote-driver:上向实现selenium-api中接口的功能,并依赖json,httpclient,selenium-api,为下层的WebDriver提供方法调用支持。常用的类有:RemoteWebDriver,RemoteWebElement等。

• Selenium-Firefox-Driver:用于实例一个不同浏览器的对象,依赖于selenium-api和selenium-remot-driver,调用selenium-remote-driver中实现的selenium-api的get()方法打开本地浏览器。常用类:FirefoxDriver,是RemoteWebDriver的子类。

• Selenium-support:为下层依赖库(selenium-java,selenium-server)提供支持。常用类:WebDriverBackedSeleinum

• Selenium-java:负责WebDriver与Selenium-server之间的连接,与selenium 1.0版本中的selenium-java-client的作用相同,为selenium server是一个java客户端。

• Selenium-server:为兼容selenium1工作模式和从selenium1迁移到selenium2提供的依赖。

2.4 WebDriver使用

2.2.3 使用maven搭建工程

1,搭建maven环境(前提已经成功安装java环境)

1. 下载maven:

2. 解压到本地磁盘,如:D:\ProgramIDE\maven

[pic]

3. 设置系统环境变量(M2_HOME和PATH):

M2_HOME:D:\ProgramIDE\maven

[pic]

PATH:%M2_HOME%\bin

[pic]

4. 验证安装

开始->运行->CMD,在DOC中输入 mvn –v,如下图,则成功安装maven:

[pic]

5. 配置setting.xml文件,修改设置

[pic]

2,搭建eclipse-maven环境

1. 安装eclipse-maven插件

打开eclipse->Help->install new software->add

插件url:

[pic]

2. 按提示重启,配置eclipse指向本地maven配置文件

[pic]

3,用maven创建一个WebDriver工程

1. 用maven命令创建一个名为searchui的工程

mvn archetype:create -DgroupId=com.xiu.searchui -DartifactId=searchUI -DpackageName= com.xiu.searchui

2. 编辑生成的pom.xml文件,添加FirefoxDriver包

org.seleniumhq.selenium

selenium-firefox-driver

2.24.1

3. 编译并生成eclipse工程

mvn eclipse:eclipse

4. 把工程引入eclipse中

[pic]

Src/test/java 目录为放置基础类和测试类

Src/test/resources 目录为放置测试数据,即测试用例。

5. 完成

2.4.2 编写WebDriver测试类

WebDriver工程可以很好地与JUnit,TestNG结合使用,并通过Hudson实现持续集成,如下是一个最原始的使用JUnit与Firefox WebDriver编写测试搜索列表页面商品价格与详情页面价格是否一致的自动化测试例子:

package com.xiu.searchui.search;

import junit.framework.Assert;

import org.junit.AfterClass;

import org.junit.BeforeClass;

import org.junit.Test;

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.firefox.FirefoxDriver;

import com.xiu.search.util.ReadDataDaoImpl;

public class SearchPagePrice {

static WebDriver driver;

ReadDataDaoImpl readData = new ReadDataDaoImpl();

@BeforeClass

public static void setUpDriver() {

System.setProperty("webdriver.firefox.bin","D:/program/Firefox/firefox.exe");

driver = new FirefoxDriver();

}

@AfterClass

public static void closeDriver() {

driver.quit();

}

@Test

public void 验证商品列表页面价格() {

driver.get("");

WebElement pricelistElement = driver.findElement(By.xpath("//*[@id='p52001915']"));

String listPrice = pricelistElement.getText();

System.out.println(listPrice);

driver.get("");

WebElement listtodailElement = driver.findElement(By.xpath("//*[@id='prd_price_div']/p[1]/span[1]"));

String dailtolist = listtodailElement.getText();

System.out.println(dailtolist);

Assert.assertEquals("列表页展示价格",listPrice,dailtolist);

}

}

3 搜索功能自动化

3.1 工程目录

搜索功能自动化工程将使用maven搭建,分基础工具类,测试基础类,测试脚本,数据对象资源文件,其它测试脚本分:search页测试脚本,list页测试脚本,brand页测试脚本。详情如下:

[pic][pic]

com.xiu.searchui.util:主要放置数据收集,测试结果转化成报告,并以邮件形式发出等相关功能扩展处理类。

com.xiu.searchui.base:主要放置webDriver api二次封装,基础类库等。

com.xiu.searchui.brand/list/search:主要放置测试脚本。

src/test/resoures:主要为测试用例,对象库等测试数据。

3.2 实现原理

搜索功能自动化测试基于selenium webdriver框架进行使用或二次封装,并结合JUnit进行执行测试脚本,目前测试结果的输出主要依靠JUnit。整个工程与webdriver相同,参见2.2.3

后继将结合hudson或其它持续集成框架,将此工程打包成可执行jar-version(版本号)包,放于持续集成框架中自动运行。

3.3 脚本规则

1)脚本类名,方法名,变量名,对象库命令易看易懂,其中方法名称使用中文,方便维护,其它使用英文命名。

2)统一独立的测试数据帐号。

3)工程版本命名规则化,如搜索系统命令为:auto-search-2.5.1.jar或其它。

4)公共类库,即可抽取并在多处重复使用的类,如登录操作。

3.4 脚本编写与执行

3.4.1 测试用例选择

在testlink中选择可以进行自动化测试的测试用例,方法如下:

1. 用例输入输出值可直接到页面获取,便于校验

2. 用例具有唯一原子功能性,不涉及多系统关联操作

3. 用例不涉及UI校验

4. 用例不涉及非本系统数据库或缓存系统数据读取(暂时)

5. ……

3.4.2 准备测试数据

1)页面对象库数据

2)url链接

3)测试帐号(专门独立自动化测试帐号)

4)测试数据(商品,价格等)

目前测试数据格式如下:

[pic]

3.4.3 编写测试脚本

脚本编写使用webdriver和junit结合,通过调用junit的运行机制,使用webdriver提供的api进行。

Webdriver提供多种获取页面元素的方法,也支持在此基础上扩展,原方法如下:

static class By.ByClassName(java.lang.String className)

static class By.ByCssSelector(java.lang.String selector)

static class By.ById(java.lang.String id)

static class By.ByLinkText(java.lang.String linkText)

static class By.ByName(java.lang.String name)

static class By.ByPartialLinkText(java.lang.String partialLinkText)

static class By.ByTagName(java.lang.String tagName)

static class By.ByXPath(java.lang.String xpathExpression)

应用实例:

@Test

public void 验证相关搜索功能() {

driver.get("");

WebElement pricelistElement = driver.findElement(By.xpath("//*[@id='index']/div[2]/div[2]/div[2]/div[2]/label"));

String relatedName = pricelistElement.getText();

Assert.assertEquals("验证相关搜索功能",relatedName,"相关搜索:");

更多请查看官方API:

3.4.4 本机调试运行

测试人员在本机编写测试脚本后,并在本机调试通过。通过多client机方式并行编写测试脚本,节省成本。

[pic]

3.4.5 上传版本管理

调试成功后,上传到SVN服务器,纳入版本管理,并安时间或程度转测版本进行打包。

3.4.6 纳入持续集成

将最新的打包版本纳入持续集成平台,设置适合时间自动运行。

3.4.7 每日持续回归

纳入持续平台后,每日持续回归脚本,验证系统功能的正确性。

3.5 目前状况

目前搜索自动化已经可以覆盖search,list,brand大部分主流程的自动化测试,如:

➢ search,list,brand三页面共有的功能:搜索,相关搜索,搜索纠错,顶部翻页,底部翻页,筛选排序等功能;

➢ 商品展示页面:价格,立即购买,到货通知;

➢ list页:品牌筛选,价格筛选功能;

➢ brand页:品牌功能。

如下图:

[pic]

4结论

4.1 WebDriver在搜索系统的可行性

1,按照WebDriver的目标,可以根据不同浏览器特性使用不同的WebDriver,不论是PC平台还是手持设备,如android,OS。并可真实模拟用户进行浏览器操作,而非采用js注入形式。同时可以做到浏览器兼容性的测试。

2,按照目前测试业界经验与相关实践,特别是淘宝,UC等一些企业,采用数据驱动进行自动化框架的设计,对象库,数据库,脚本三者分离,将能大大提高功能自动化测试的效率,并能在测试流程中起到更好的效果。

3,搜索系统无需进行登录,省去了登录校验机制,也为搜索系统的功能自动化提供了很好的基础。

5相关资料

官方文档:

Google code wiki:

Wiki阅读顺序:

#第一步GettingStarted



#第二步NextSteps



#第三步



#第四步(各种WebDriver资料)











By 董清清

欢迎继续完善此文档

-----------------------

22

手机上网用UC

就是比你快

北京·广州·武汉

................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download

To fulfill the demand for quickly locating and searching documents.

It is intelligent file search solution for home and business.

Literature Lottery

Related searches