第1章 Selenium自动化测试框架入门
1.1 Selenium自动化测试框架概述
说到目前流行的自动化测试工具,相信只要做过软件测试相关工作,就一定听说过Selenium。
图1-1是某企业招聘自动化测试工程师的信息,大家可以看到在岗位任职条件方面明确指出要求应聘者具有Selenium等主流自动化测试工具的使用经验。
图1-1 某企业自动化测试工程师招聘信息
那么Selenium是谁开发的?它是用来解决什么问题的?它为什么会被自动化测试人员广泛使用呢?
在日常的软件测试工作中,功能测试是软件测试的重要环节,而手动的功能测试有许多缺点,其中主要的缺点是测试过程单调且重复,这种长时间的重复操作容易使人厌倦、出错。2004年,Thoughtworks的工程师Jason Huggins决定使用自动化测试工具来改变这种状况。他开发了一款名为JavaScriptTestRunner的JavaScript程序,这款JavaScript程序可以自动进行Web应用程序的功能测试。同年,JavaScriptTestRunner更名为Selenium。
Selenium是开源的,可以在GitHub上找到,如图1-2所示。Selenium是大型项目,包含用于支持Web浏览器自动化的一系列工具和库。
图1-2 GitHub上的Selenium项目信息
从图1-2可以看出,在Selenium项目的仓库中共有19个子项目,这也验证了Selenium确实是大型项目。这里我们只关注Selenium的核心内容,而不去关注其他辅助性的子项目。
1.2 Selenium的历史版本及核心组件
在写作本书时,Selenium的最新可获取版本是Selenium 4.0 alpha版本,而稳定版本是Selenium 3.0,对应的可下载版本是Selenium 3.141.0。为了使读者能够系统地掌握Selenium,我认为非常有必要了解Selenium的历史版本及核心组件,Selenium的核心组件如图1-3所示。
图1-3 Selenium的核心组件
1.2.1 Selenium 1.0
1.Selenium IDE
2006年,Shinya Kasatani 开发了Selenium IDE的第一个版本,当时它是Firefox浏览器的一个插件。通过该插件,在Firefox浏览器中实现业务功能时,能够自动录制业务功能脚本,如图1-4所示。你还可以根据需要将产生的脚本转换为Python、Java、Ruby、C#等脚本信息,如图1-5所示。录制的脚本或者由脚本产生的脚本信息可以回放,从而验证功能的正确性、可用性等。
图1-4 通过Selenium IDE录制脚本
图1-5 由Selenium IDE转换后的Python脚本信息
Selenium IDE具有以下特点。
q 操作简单,不要求操作人员具有编码能力。
q 测试脚本可复用,从而减轻测试人员的重复性操作压力。
q 可以单个或批量运行测试脚本。
q 脚本支持命令行调用可用于持续集成。
q 可以控制脚本的执行速度。
q 一定程度上支持脚本调试功能,如断点、单步运行等。
q 可以将脚本导出为使用多种不同语言。
这里只是对Selenium IDE做了简单介绍,后续我们将进行更加详细的介绍。
2.Selenium Remote Control(RC)
Paul Hammant开发了Selenium Remote Control,这里我们将Selenium Remote Control简写成Selenium RC。前面已经介绍过Selenium的核心是JavaScriptTestRunner。JavaScriptTestRunner是一组JavaScript函数,可首先通过使用浏览器内置的JavaScript解释器进行解释和执行Selenese命令,然后再将Selenium Core注入浏览器。但是,这里存在同源策略问题,也就是说,假设有一个JavaScript测试脚本,该脚本要访问baidu.com域,从而访问baidu.com/news、baidu.com/map之类的页面元素,这没有问题,但无法访问epubit.com或bing.com等其他域的元素。因为baidu.com/news和baidu.com/map同源,它们有相同的域,都是baidu.com。那么怎么才能够跨域访问呢?Selenium RC就是用来解决这一问题的,它分为Client Library和Selenium Server两部分。Client Library部分提供了丰富的接口,主要用于编写自动化测试脚本来连接、控制Selenium Server。Selenium Server负责充当客户端配置的HTTP代理,并“欺骗”浏览器以使Selenium Core和被测试的Web应用程序共享相同的来源,接收来自客户端程序的命令,并将它们传给浏览器。
3.Selenium Grid
Patrick Lightbody开发了Selenium Grid。Selenium Grid可以实现在不同的浏览器和操作系统中并行地执行测试脚本,从而最大限度地缩短测试时间,提升工作效率。具体的工作模式如下。
由一个Hub节点控制若干Node,Hub节点负责管理和收集Node的注册和工作状态等信息,接收远程调用并将相关请求分发给各Node来执行。
1.2.2 Selenium 2.0
Selenium 2.0在Selenium 1.0的基础上添加了对Selenium WebDriver的支持。
1.Selenium WebDriver
Selenium WebDriver由Simon Stewart在2006年开发,是一个可以在操作系统级别配置和控制浏览器的跨平台测试框架。Selenium WebDriver可直接与浏览器应用程序进行本地交互。Selenium WebDriver支持各种编程语言,如Python、Ruby、PHP和Perl等,还可以与JUnit和Unittest之类的单元测试框架集成以进行测试管理。
Selenium WebDriver架构主要包括4部分—— Selenium Client Library、JSON Wire Protocal Over HTTP Client、Browser Drivers和Browsers,如图1-6所示。
图1-6 Selenium WebDriver架构
q Selenium Client Library:Selenium自动化测试人员可以使用Java、Ruby、Python、C#等语言,利用它们提供的库来编写脚本。
q JSON Wire Protocol Over HTTP Client:JSON Wire Protocol是在HTTP服务器之间传输信息的REST风格的API。每个浏览器驱动程序(如FirefoxDriver、ChromeDriver等)都有它们各自的HTTP服务器。
q Browser Drivers:不同的浏览器都包含一个单独的浏览器驱动程序。浏览器驱动程序与相应的浏览器通信。当浏览器驱动程序接收到任何指令时,将在相应的浏览器中执行,响应信息将以HTTP的形式返回。
q Browsers:Selenium支持多种浏览器,如Firefox、Chrome、IE、Safari等。
Selenium和WebDriver原本属于两个不同的项目。为了弥补Selenium和WebDriver各自的不足,形成更加完善的Selenium测试框架,才对这两个项目进行了合并。
2.Selenium 3.0
目前发布的稳定版本是Selenium 3.0,Selenium 3.0版本做了以下更新。
q 去除了Selenium RC组件。
q Selenium 3.0只支持Java 8及以上版本。
q 在IE支持方面,只支持IE 9.0以上版本。
q Selenium 3.0中的Firefox需要使用独立的浏览器驱动。
3.Selenium 4.0
自从2019年4月发布Selenium 4.0的第一个alpha版本以来,截至目前Selenium 4.0已有4个alpha版本,如图1-7所示。Selenium 给自动化测试从业者带来了更多的期待,那么Selenium 4.0又有什么新特性呢?
图1-7 Selenium 4.0 alpha版本的获取方式(针对Java语言)
单击4.0.0-alpha-4链接,可以查看对应的Maven依赖信息,如图1-8所示。
Selenium 4.0主要包括以下新特性。
q Selenium IDE功能改版:用过Selenium IDE的读者都清楚,之前Selenium IDE以插件的形式运行在Firefox和Chrome浏览器中,改版后将能够用于更多浏览器,同时还提供了全新的基于Node.js的CLI(命令行)运行程序,能够并行执行测试用例,并提供通过和失败的测试用例、执行耗时等相关信息。新的Selenium IDE运行程序完全基于Selenium WebDriver。
图1-8 Selenium 4.0.0-alpha-4的Maven依赖信息
q WebDriver API成为W3C标准:WebDriver API不仅用于Selenium,还用在很多其他的自动化测试工具(如Appium)中。Selenium新版本最突出的变化是WebDriver API完全遵循W3C标准,这意味着WebDriver API现在可以跨不同的软件实现,而不会出现任何兼容性问题。
q Selenium Grid改良:如果你以前用过Selenium Grid,一定会遇到一些节点配置方面的问题并记忆深刻。Selenium Grid有两个基础组件—— Node和Hub。Node用于执行测试用例,而Hub用于控制所有执行用例的Node。我们在连接Hub和Node时,经常会出现很多问题。但在Selenium 4.0中,当启动Selenium Grid时,Selenium Grid将同时充当Hub和Node的角色,使得连接过程变得非常容易,从而很好地支持了Docker部署,并且不存在线程问题。Selenium Grid 服务器还可以输出JSON格式的日志文件。在用户界面上,Selenium 4.0也有了很多改良,可以直观地看到执行测试用例的相关信息等。
q 更直观方便的调试信息:钩子(hook)和请求(request)跟踪的日志记录也得到了改进,因为可调试或可观察性不再仅适用于DevOps。自动化测试人员现在可以更好地使用改进的用户界面来进行调试。
q 更完善的文档:文档对于任何项目的成功都非常重要。自从Selenium 2.0发布以来,这些文件已经很多年没有更新了。也就是说,任何想学习Selenium的人都必须依赖旧的教程,但许多特性在Selenium 3.0中已经发生了变化。SeleniumHQ承诺将提供一份新的文档,这也许是自动化测试工程师最期待的更新。