使用 Selenium 实现基于 Web 的自动化测试
(转自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 的主要功能包括:
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 代码以正确返回请求数据的效果。
流程说明:
- 客户端建立与 selenium-RC server 的连接。
- Selenium RC Server 启动一个浏览器(或是已经使用中),并注入 JS 代码
- 将 Selenese 代码传到客户端的 Selenium-Core 中。
- Selenium-Core 翻译并解析执行用户录制的操作。
- 让代理 Server 进行通讯
- Remote Control Server 负责跟远程 Web 应用服务器进行通讯。
- 操作完成,显示结果,并执行下一指令。
以上就是 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 产品为例,说明如何实现“用户登录”这个测试用例。
- 点击录制按钮 如下图 3 中的 1
- 录制过程中,登录用户界面,输入用户名密码。如下图 4
- 然后可以通过是否包含某些字符串来验证是否登录成功。如果下图 5
- 回到登录 IDE 界面,查看已录制步骤 如图 3 中的 2
- 在 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 的功能性测试,并将报告以邮件形式通知管理人员。
说明:
- 由测试人员录制脚本并导出 JUnit。
- 测试人员修改配置文件,将测试用例包含在测试套件中。
- 合并在持续集成软件后,框架会定期检测配置的测试套件
- 逐个加载测试用例。
- 以测试套件为单位其执行所有测试用例。
- 执行完成后将测试套件的结果报告以邮件形式通知管理人员
实现这套框架最关键的当属 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 的自动化测试的更多相关文章
- 转载 基于Selenium WebDriver的Web应用自动化测试
转载原地址: https://www.ibm.com/developerworks/cn/web/1306_chenlei_webdriver/ 对于 Web 应用,软件测试人员在日常的测试工作中, ...
- selenium+java+eclipse web项目自动化测试环境搭建
一.java的安装与环境配置 1.下载JDK(Java Development Kit),下载地址 www.oracle.com 2.安装jdk(傻瓜式安装) 3.安装完成后,配置环境变量,步骤: ( ...
- 基于Selenium+Python的web自动化测试框架
一.什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.S ...
- 简单Web UI 自动化测试框架 pyse
WebUI automation testing framework based on Selenium and unittest. 基于 selenium 和 unittest 的 Web UI自动 ...
- web前端自动化测试/爬虫利器puppeteer介绍
web前端自动化测试/爬虫利器puppeteer介绍 Intro Chrome59(linux.macos). Chrome60(windows)之后,Chrome自带headless(无界面)模式很 ...
- [原创]浅谈Web UI自动化测试
[原创]浅谈Web UI自动化测试 Web UI自动化测试相信大家都不陌生,今天来谈谈这个,我最早接触自动化测试时大约是在2004年,2006年当时在腾讯财付通算是开始正式接触自动化测试,之所以是正式 ...
- 基于MBT的自动化测试工具——GraphWalker介绍和实际使用
GraphWalker是一个开源的基于模型的自动化测试工具,它可以用来通过图形测试模型来自动生成测试用例. 本文主要描述了使用yed画出FSM, EFSM模型图(常见的流程图),然后使用GraphWa ...
- Web前端自动化测试Cypress实践总结
本文主要首先主要介绍了什么是自动化测试,接着对常用的自动化测试框架进行了对比分析,最后,介绍了如果将自动化测试框架Cypress运用在项目中. 一.自动化测试概述 为了保障软件质量,并减少重复性的测试 ...
- shellinabox基于web浏览器的终端模拟器
1. Shellinabox介绍 Shellinabox 是一个利用 Ajax 技术构建的基于 Web 浏览器的远程终端模拟器,也就是说安装了该软件之后,服务器端不需要开启 ssh服务,通过 Web ...
随机推荐
- WPF 打印崩溃问题( 异常:Illegal characters in path/路径中有非法字符)
现象: 打印时候程序直接崩溃.调试时出现下列异常. 异常信息: 中文:System.ArgumentException : 路径中有非法字符. 英文: System.ArgumentException ...
- BCP 基本语法
copy from:http://msdn.microsoft.com/zh-cn/library/ms162802.aspx bcp [database_name.] schema.{table_n ...
- wpf(使用定时器)使用定时器操作UI界面
在项目实践中,我们 可能会遇到需要将一些控件上显示的内容只显示一段时间过后清空. 下面我们来实现这种操作: 首先需要注意的是:在wpf中涉及到界面操作的话,一定要使用定时器DispatcherTime ...
- .net core An assembly specified in the application dependencied mainfest<****.json>was not found解决办法
最近在开发项目中,遇到了一个问题.在本机开发中部署到本机iis上或者本机控制台都没有问题,运行正常.当发布部署到服务器(windowsServer)中的时候一直运行不起来,用控制台也运行不起来,直接报 ...
- 哎呀,我艹,使用tfs时候,离职人员锁定了代码.
哎呀,我艹,使用tfs时候,离职人员锁定了代码. 而且离职人员电脑已经回收,被格式化了,怎么破? 不管别人是有意,还是无意,总之就是需要搞定了. 1.第一步 首先,找到被锁住的工作区一般在报错信息中可 ...
- SQL处理数据并发,解决ID自增
1 创建MaxIdProcess表,由于存储ID的最大值 CREATE TABLE [dbo].[MaxIdProcess]( ,) NOT NULL, --自增ID ) NOT NULL, --存储 ...
- JAVA 从头开始<二>
一.JAVA_HOME 1.环境变量如果经常变更,就要经常操作到Path,可能会一不小心把什么东西给删了 2.最好新建一个环境变量 3.如果使用新环境变量 ①原来的写法 ②现在的写法 新建环境变量JA ...
- Day 6 编码的进阶
https://blog.csdn.net/Deft_MKJing/article/details/79460485 a.ascii码:8位表示一个字符,共可以表示2**8个(即256)字符 , ...
- ip addr 相关操作
1.添加ip: ip addr add 1.1.1.100/255.255.255.0 dev eth0 2.删除ip: ip addr del 1.1.1.100/255.255.255.0 dev ...
- SFML从入门到放弃(3) 视角和碰撞检测
SFML从入门到放弃(3) 视角和碰撞检测 视角 window.draw();所画出的对象是在世界坐标的绝对位置. 视角可以选定在窗口中显示世界坐标下的的哪一个区域. sf::View init_vi ...