(转自http://www.ibm.com/developerworks/cn/web/1209_caimin_seleniumweb/index.html)

Selenium 是一个用于 Web 应用程序测试的工具。Selenium 的测试用例直接运行在浏览器中,就像真正的用户在操作一样。与主流的 web 自动化测试框架还有 QTP,基于 Ruby 的 WATIR 等相比,Selenium 支持 IE、Mozilla Firefox 多种浏览器,支持自动录制脚本以及 Java、c#、ruby 等多种运行语言的自动生成,用例制作快捷,运行快速。相比起来 Selenium 要显得更为灵活实用。

 Selenium 及其实现原理

Selenium 的主要功能包括:

1)测试与浏览器的兼容性:测试应用程序能否兼容工作在不同浏览器和操作系统之上。

2)测试系统功能:录制用例自动生成测试脚本,用于回归功能测试或者系统用例说明。

简而言之,Selenium 就是一款可以录制用户操作,帮助 Web 测试人员简化重复劳动的工具。

目前为止 Selenium 有两种版本:

  • Selenium 1(Selenium RC,Remote Control):传统 Selenium 框架,支持多种编程语言脚本生成。但需要启动一个代理 Server 来处理用户与测试 Server 之间的通讯。
  • Selenium 2(Selenium Webdriver):全新自动化接口,突破了 Selenium 1 的一些限制,剔除了中间 Server,但由于写这篇文章为止自动生成脚本工具对 Selenium 2 的支持还不好,适合熟悉 Selenium API 的手写 case 测试人员使用。

阅读本文读者可以学习到以下技能:

  • 了解 Selenium 自动化测试框架的基本概念。
  • 学会搭建应用 Selenium 自动化测试框架的环境。
  • 搭建一个自集成的测试容器以持续测试 Selenium 测试用例。

本文着重介绍传统 Selenium 1 的原理及使用方法。接下来让我们看看 Selenium 是如何调用录制脚本并实现自动测试的。

Selenium 1 实现原理

Selenium 引入了 Remote Control Server 这样一个代理 Server,JavaScript 脚本注入和与 Server 通讯都通过这个代理 Server 来进行。如下图所示:

图 1. Remote Control 模式运行流程

之所以引入这个代理 Remote Control Server 是因为“同源策略”的限制,通过这个代理服务器来“欺骗”远程 Server,达到使其以为是从同一个地方 load 代码以正确返回请求数据的效果。

流程说明:

  1. 客户端建立与 selenium-RC server 的连接。
  2. Selenium RC Server 启动一个浏览器(或是已经使用中),并注入 JS 代码
  3. 将 Selenese 代码传到客户端的 Selenium-Core 中。
  4. Selenium-Core 翻译并解析执行用户录制的操作。
  5. 让代理 Server 进行通讯
  6. Remote Control Server 负责跟远程 Web 应用服务器进行通讯。
  7. 操作完成,显示结果,并执行下一指令。

以上就是 Selenium Remote Control 的执行原理,接下来的章节中将一步步以图例加说明的方式快速说明如何使用 Selenium 来录制脚本,导入 Java 工程,然后定期维护工程。


回页首

使用 Selenium 实现自动化测试

使用 Selenium IDE 录制用户操作

Selenium IDE 是一个基于 Firefox 的插件,用户可以在通过这个插件将客户端操作录制成脚本并导出为 Java、c#、Ruby 等多种运行语言以便统一管理测试用例。

下载 FireFox: 推荐 Firefox 5.0 以上,目前 Selenium IDE 只提供 Firefox 的插件。

下载 Selenium IDE:http://seleniumhq.org/download/

安装插件:

Tools --> Add-ons --> 将下载的 selenium-ide-1.x.xpi 文件拖入对话框即可安装。

安装后可以启动 IDE 插件查看是否安装成功。

图 2. 启动 Selenium IDE 插件

安装后,以 IBM Systems Director 产品为例,说明如何实现“用户登录”这个测试用例。

  1. 点击录制按钮 如下图 3 中的 1
  2. 录制过程中,登录用户界面,输入用户名密码。如下图 4
  3. 然后可以通过是否包含某些字符串来验证是否登录成功。如果下图 5
  4. 回到登录 IDE 界面,查看已录制步骤 如图 3 中的 2
  5. 在 IDE 界面中可以验证录制的脚本,必要时回到第四步,如图 3 中的 3

在 IDE 中重运行录制的脚本通过就说明脚本没问题,可以用于测试用例代码导出了。

图 3. Selenium IDE 录制窗口

图 4. 录制过程中,输入用户名密码

图 5. 通过确认是否包含某些文字来验证是否成功登录

使用 Selenium IDE 导出 JUnit 测试用例

在 Selenium IDE 中执行成功后,就可以把测试脚本导出成 JUnit 测试用例了,如图 6 所示:

图 6. 导出 JUnit 代码

导出用例如下:

清单 1. VerifyLogin.java
 import com.thoughtworks.selenium.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; public class VerifyLogin extends SeleneseTestCase {
@Before
public void setUp() throws Exception {
selenium = new DefaultSelenium("localhost", 4444, "*chrome", "localhost:8422/");
selenium.start();
} @Test
public void testVerifyDirectorLogin() throws Exception {
selenium.setTimeout("300000");
selenium.open("/ibm/console/logon.jsp");
selenium.type("id=j_username", "test");
selenium.type("id=j_password", "test");
selenium.click("id=other");
selenium.waitForPageToLoad("300000");
verifyTrue(selenium.isTextPresent("IBM Systems Director"));
} @After
public void tearDown() throws Exception {
selenium.stop();
}
}

说明:首先实例化一个 DefaultSelenium 对象,传入的参数分别是 RC 服务器 IP、端口、浏览器类型和待测试的 Server 的信息。然后在测试方法里调用 Selenium 1 的 API,这里的代码完全由 IDE 生成,就为我们省去了很多重复代码工作。

运行测试用例:

有了基于 JUnit 的运行测试用例就可以把它导入到 Java IDE 中执行测试了。执行中既需要客户端驱动支持(用于 Eclipse 编译),也需要启动 RC Server:

Selenium RC Server 下载:http://seleniumhq.org/download/

Selenium Client Driver:http://seleniumhq.org/download/

执行命令 java –jar selenium-server-standalone-2.5.0.jar 启动 Selenium RC Server:

图 7. 启动 Selenium RC Server

启动后就可以直接在 Eclipse 中运行测试用例,RC Server 就会启动新窗口并自动按照录制脚本进行测试。并可在 Eclipse 中查看运行结果。

下面让我们看看怎样脱离 Eclipse 自己搭建一个可以持续测试的容器。

构建 JUnit 测试容器以持续测试 Selenium 的测试用例

我们搭建的这个容器可以检测某个文件夹里所有的测试用例自动运行 JUnit 代码进行测试。如果需要还可以将这个容器合并到持续集成环境里,以达到不间断持续功能性测试的需求。

在这里我们会用到 Ant 工具。可以在这里下载:

Ant 下载:http://ant.apache.org/

基础架构

图 8. 基于 Selenium 的 JUnit 的测试容器架构图

可以看见测试人员的工作如紫色箭头所示,而自动化工作如蓝色箭头所示。

这套框架的意义在于,它能自动识别测试用例,并读取配置文件以测试套件运行不同的测试用例。它还可以被合并到项目持续集成软件中,定期地持续进行基于 Web 的功能性测试,并将报告以邮件形式通知管理人员。

说明:

  1. 由测试人员录制脚本并导出 JUnit。
  2. 测试人员修改配置文件,将测试用例包含在测试套件中。
  3. 合并在持续集成软件后,框架会定期检测配置的测试套件
  4. 逐个加载测试用例。
  5. 以测试套件为单位其执行所有测试用例。
  6. 执行完成后将测试套件的结果报告以邮件形式通知管理人员

实现这套框架最关键的当属 Ant 执行脚本了,也是程序执行的入口。这里列出 Ant 的运行脚本,以供读者参考:

清单 2. Build.xml
以下为部分重点内容,会在后面加以说明。完整的 build.xml 请查看附件。
<?xml version="1.0" encoding="UTF-8"?>
<project name="automationtesting" default="run" basedir=".">
……
<!-- 调用 Junit task 运行测试用例-->
<mkdir dir="${xml}/${var}" />
<junit printsummary="yes">
<classpath>
<fileset dir="${lib}">
<include name="**/*.jar" />
</fileset>
<pathelement path="${classpath}" />
</classpath>
<batchtest todir="${xml}/${var}">
<filelist refid="casesToBeRunning"></filelist>
<formatter type="xml" />
</batchtest>
</junit>
……
<!-- 调用 Junitreport task 生成报表-->
<junitreport todir="${reports}">
<fileset dir="${xml}/${var}">
<include name="TEST-*.xml" />
</fileset>
<report id="${var}_Report" format="noframes" todir="${reports}/html">
<param name="TITLE" expression="Automation Testing Results for ${var}" />
</report>
</junitreport>
…… <!-- 调用 mail task 发送邮件-->
<mail mailhost="xx.xx.xx.xx" subject="${reportResult} Result for TestSuite: ${var}">
<from address="AutomationTestTool" />
<to address="xxxx@cn.ibm.com" />
<message mimetype="text/html" src="${reports}\html\Testsuite-report-${var}.html">
</message>
<fileset dir="${reports}\html">
<include name="Testsuite-report-${var}.html" />
<include name="Testcase-reports-${var}.zip" />
</fileset>
</mail>
</project>

说明:程序的入口是 Run task,在 Run task 里先是编译整个工程,然后读取 TestSuites.xml 配置文件,循环执行每一个测试套件。过程中,以此执行以下操作:

  • 读取配置的并且实现 TestCase 的 Java 类;
  • 调用 Ant 的 junit task 执行测试用例;
  • 调用 Ant 的 junitreport task 生成报表;
  • 调用 Ant 的 mail task 发送报表到指定邮箱。
清单 3. TestSuites.xml 配置文件样例
 <TestSuites>
<TestSuite enable="false" id="DiscoverTestSuite">
<Testcase>VerifyLogin</Testcase>
<Testcase>DiscoverDevice</Testcase>
</TestSuite>
<TestSuite enable="true" id="DeleteDeviceTestSuite">
<Testcase>VerifyLogin</Testcase>
<Testcase>DeleteDevice</Testcase>
</TestSuite>
</TestSuites>

说明:配置文件中定义了两个测试套件,第一个包含了 2 个测试用例,先 Login 再发现设备。第二个也包含了 2 个测试用例,先 Login 再删除设备。而第一个测试套件 enable=false 将不被执行。

到此为止,一个简单的可持续测试框架就已经搭建完毕,来运行下看看结果吧

运行测试组建

用 ant 命令执行 Build.xml 即可运行测试框架。

图 9. 工具运行时

执行完成后就会将所有测试用例的结果以报告形式发送邮件到指定邮箱。

图 10. 报告式样


回页首

结束语

本文首先介绍了 Selenium 以及 Selenium 1 的实现原理。紧接着用一个 Login 的简单例子讲述了如何去搭建 Selenium 运行环境,并将其导出为 JUnit 代码。最后构建了一个基于 Ant 的自动化测试 Selenium 框架,持续地对生成的 JUnit 测试用例进行管理以及功能性测试。读者也可以借鉴该脚本搭建自己的轻量级的单元测试框架。

目前主流的 web 自动化测试框架还有 QTP,基于 Ruby 的 WATIR。与这些框架相比,Selenium 支持 IE、Mozilla Firefox 等多种浏览器,同时支持自动录制脚本以及 Java、C#、Ruby 等多种运行语言的自动生成,测试用例制作快捷,运行也比较快速。对于较为轻量级相比起来 Selenium 要显得更为灵活实用。Selenium 不仅用于功能性测试及回归测试,同时也可用于 Web 可视化验收测试。更多的,Selenium 可集成在诸如 Cruise 持续集成软件中,为整体项目提供更大集成测试范围。

使用 Selenium 实现基于 Web 的自动化测试的更多相关文章

  1. 转载 基于Selenium WebDriver的Web应用自动化测试

    转载原地址:  https://www.ibm.com/developerworks/cn/web/1306_chenlei_webdriver/ 对于 Web 应用,软件测试人员在日常的测试工作中, ...

  2. selenium+java+eclipse web项目自动化测试环境搭建

    一.java的安装与环境配置 1.下载JDK(Java Development Kit),下载地址 www.oracle.com 2.安装jdk(傻瓜式安装) 3.安装完成后,配置环境变量,步骤: ( ...

  3. 基于Selenium+Python的web自动化测试框架

    一.什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.S ...

  4. 简单Web UI 自动化测试框架 pyse

    WebUI automation testing framework based on Selenium and unittest. 基于 selenium 和 unittest 的 Web UI自动 ...

  5. web前端自动化测试/爬虫利器puppeteer介绍

    web前端自动化测试/爬虫利器puppeteer介绍 Intro Chrome59(linux.macos). Chrome60(windows)之后,Chrome自带headless(无界面)模式很 ...

  6. [原创]浅谈Web UI自动化测试

    [原创]浅谈Web UI自动化测试 Web UI自动化测试相信大家都不陌生,今天来谈谈这个,我最早接触自动化测试时大约是在2004年,2006年当时在腾讯财付通算是开始正式接触自动化测试,之所以是正式 ...

  7. 基于MBT的自动化测试工具——GraphWalker介绍和实际使用

    GraphWalker是一个开源的基于模型的自动化测试工具,它可以用来通过图形测试模型来自动生成测试用例. 本文主要描述了使用yed画出FSM, EFSM模型图(常见的流程图),然后使用GraphWa ...

  8. Web前端自动化测试Cypress实践总结

    本文主要首先主要介绍了什么是自动化测试,接着对常用的自动化测试框架进行了对比分析,最后,介绍了如果将自动化测试框架Cypress运用在项目中. 一.自动化测试概述 为了保障软件质量,并减少重复性的测试 ...

  9. shellinabox基于web浏览器的终端模拟器

    1. Shellinabox介绍 Shellinabox 是一个利用 Ajax 技术构建的基于 Web 浏览器的远程终端模拟器,也就是说安装了该软件之后,服务器端不需要开启 ssh服务,通过 Web  ...

随机推荐

  1. 用NPOI操作EXCEL--巧妙使用Excel Chart

    在NPOI中,本身并不支持Chart等高级对象的创建,但通过l模板的方式可以巧妙地利用Excel强大的透视和图表功能,请看以下例子. 首先建立模板文件,定义两列以及指向此区域的名称“sales”: 创 ...

  2. Git安全配置

      今天收到了阿里云异地登录的短信报警,登录阿里云后台发现,有人从深圳登录了我的服务器(本人在北京),查看详细信息一共登录了5次,前两次是使用的git用户进行登录,后两次已经变成了root用户,怀疑是 ...

  3. SQL server经验分享:SQLSERVER 被标记为“可疑”的数据库处理方法

    --MyDB为修复的数据名USE MASTER GO SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE GO ALTER DATABAS ...

  4. [ASP.NET]uploadify简单使用讲解

    背景:在用户控件中使用html 的file控件或者ASP.NET的FileUpLoad控件都无法获取到文件,于是想到听说过的uploadify uploadify官网:www.uploadify.co ...

  5. 遍历 SortedList<string, string> 中的值(可用于datatable转json)

    SortedList<string, string> STK = new SortedList<string, string>();STK.Add("1", ...

  6. 在Asp.net Core中使用中间件来管理websocket

    介绍 ASP.NET Core SignalR是一个有用的库,可以简化Web应用程序中实时通信的管理.但是,我宁愿使用WebSockets,因为我想要更灵活,并且与任何WebSocket客户端兼容. ...

  7. Java开发 小工具累计

    array to list Integer[] spam = new Integer[] { 1, 2, 3 }; List<Integer> rlt = Arrays.asList(sp ...

  8. Docker容器的原理与实践 (下)

    欢迎访问网易云社区,了解更多网易技术产品运营经验. Docker原理分析 Docker架构 镜像原理 镜像是一个只读的容器模板,含有启动docker容器所需的文件系统结构及内容Docker以镜像和在镜 ...

  9. CodeChef TWOROADS(计算几何+拉格朗日乘数法)

    题面 传送门 简要题意:给出\(n\)个点,请求出两条直线,并最小化每个点到离它最近的那条直线的距离的平方和,\(n\leq 100\) orz Shinbokuow 前置芝士 给出\(n\)个点,请 ...

  10. Python面向对象(成员修饰符)

    day25 成员修饰符 class Foo: def __init__(self, name, age): self.name = name self.__age = age#私有,外部无法直接访问 ...