(转自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. Sending Email In .NET Core 2.0

    Consider the following written in .NET Core 2.0. SmtpClient client = ) { UseDefaultCredentials = tru ...

  2. Asp.Net Web Api中使用Swagger

    关于swagger 设计是API开发的基础.Swagger使API设计变得轻而易举,为开发人员.架构师和产品所有者提供了易于使用的工具. 官方网址:https://swagger.io/solutio ...

  3. Ajax 访问 或 获取 IIS 虚拟目录

    使用场景 最近用 .net core mvc 写了一个工具类的项目,作为我们项目的后台管理网站使用.第一次被老大拿去部署的时候被告知不可用,同样的代码在我电脑和我的iis上都可以使用的啊. 后来才知道 ...

  4. js框操作-----Selenium快速入门(八)

    js框,就是JavaScript中的警告框(alert),确认框(confirm),提示框(prompt),他们都是模态窗口.什么是模态窗口,大家可以自行百度一下,简单说就是弹出的窗口是在最顶端的,你 ...

  5. 初识WebAPI

    (一)Web API简介: 目前使用Web服务的三种主流的方式是:远程过程调用(RPC),面向服务架构(SOA)以及表征性状态转移(REST),其中REST模式的Web服务与复杂的SOA和RPC对比来 ...

  6. 网易云社区有奖问答活动第二期——技术领导力、深入分布式、PHP圣经、Linux运维、Unity……三月热点图书等你拿!

    网易云社区第二期有奖问答活动开始了!(第一期活动已结束:人工智能图书大抽奖!) 欢迎积极参与网易云社区,讨论问题,交流心得.我们本期准备了一批技术领域热点图书,送给参与社区的朋友们,将以抽奖的形式送出 ...

  7. linux ab压力测试工具及ab命令详解

    原文链接:https://blog.csdn.net/qq_27517377/article/details/78794409 yum -y install httpd-tools ab -v 查看a ...

  8. 程序媛计划——python正则表达式

    #定义 正则表达式是对字符串操作的一种逻辑公式,通过它我们能筛选过滤出我们需要的内容,如判断一串数字是否是电话号码. #原理 先把正则表达式的字符串转换成 Pattern 对象,接着用这个对象处理文本 ...

  9. sql语句_2

    数据表如下 一个user_id对应多个user_name,现在要求是:如果某个用户对应的user_name中存在一个a,打印user_id,a出来:如果不存在,打印user_id,0.打印时候user ...

  10. `Vue`中为什么访问不了以`$`和`_`开头的属性?

    Vue中为什么访问不了以$和_开头的属性? 背景:航班管家H5使用了Vue进行新版开发,预订流程逻辑copy参考了野鹅国际机票小程序,小程序中使用__开头的属性作为私有属性. 如题,在data中定义的 ...