热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Selenium实现基于Web的自动化测试

Selenium是一个用于Web应用程序测试的工具。Selenium的测试用例直接运行在浏览器中,就像真正的用户在操作一样。与主流的web自动化测试框架还有QTP&#

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 模式运行流程


图 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 插件


图 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 录制窗口


图 3. Selenium IDE 录制窗口




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


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




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


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

使用 Selenium IDE 导出 JUnit 测试用例

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




图 6. 导出 JUnit 代码


图 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


图 7. 启动 Selenium RC Server

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

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

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

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

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

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

基础架构




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


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

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

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

说明:


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

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




清单 2. Build.xml



以下为部分重点内容,会在后面加以说明。完整的 build.xml 请查看附件。

……


……


……



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


  • 读取配置的并且实现 TestCase 的 Java 类;
  • 调用 Ant 的 junit task 执行测试用例;
  • 调用 Ant 的 junitreport task 生成报表;
  • 调用 Ant 的 mail task 发送报表到指定邮箱。



清单 3. TestSuites.xml 配置文件样例


VerifyLogin DiscoverDevice VerifyLogin DeleteDevice



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

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

运行测试组建

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




图 9. 工具运行时


图 9. 工具运行时

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




图 10. 报告式样


图 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 持续集成软件中,为整体项目提供更大集成测试范围。




推荐阅读
  • position属性absolute与relative的区别和用法详解
    本文详细解读了CSS中的position属性absolute和relative的区别和用法。通过解释绝对定位和相对定位的含义,以及配合TOP、RIGHT、BOTTOM、LEFT进行定位的方式,说明了它们的特性和能够实现的效果。同时指出了在网页居中时使用Absolute可能会出错的原因,即以浏览器左上角为原始点进行定位,不会随着分辨率的变化而变化位置。最后总结了一些使用这两个属性的技巧。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
author-avatar
青椒盐水_205
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有