共计 5315 个字符,预计需要花费 14 分钟才能阅读完成。
摘要
Selenium 是一系列基于 web 的界面自动化测试工具汇合,提供了全面的测试函数,用于反对 B / S 类利用的界面自动化测试。 Selenium 能够间接管制浏览器实现各种操作,反对多个平台、多种浏览器、多种编程语言的测试脚本。
本文次要论述了 selenium 1 和 Webdriver 执行自动化测试脚本的原理,并通过一个简略的自动化测试脚本实例进行原理分析。
关键字:自动化测试、selenium 1、webdriver
一、selenium 整体框架
Selenium 的外围 selenium core 基于 JsUnit,齐全由 JavaScript 编写,因而可运行于任何反对 JavaScript 的浏览器上,反对的浏览器包含 IE、Firefox、chrome 等。
Selenium 测试间接运行在浏览器中,就像真正的用户在操作一样。这个工具的次要性能包含:测试与浏览器的兼容性(测试应用程序是否可能在不同浏览器和操作系统上运行)、测试零碎性能(测试性能和用户需要)。
selenium 反对主动录制和生成测试脚本,可生成 JAVA、python、C# 等不同语言的测试脚本。selenium 蕴含 selenium IDE、selenium webdriver、selenium remote control(RC)和 selenium Grid 等组件,如图 1 所示。
图 1 selenium 框架
Selenium IDE 是一个集成测试工具,被嵌套在 firefox 浏览器中,作为 firefox 浏览器的一个插件来应用。测试人员能够通过 selenium IDE 来录制网页界面上的操作,能够对录制的动作进行编辑、调试以及疾速回放。将用户在浏览器中执行的操作记录下来,生成各种模式的脚本,并可将这些脚本保留供当前应用和保护。
Selenium 1 (selenium-RC)是 selenium 最次要的测试工具之一,它所具备的某些性能即便是新版的 selenium 2 也无奈反对。它可能通过多种语言(JAVA、JavaScript、Ruby、PHP、Python、Perl 和 C#)编写测试代码,同时可能反对简直所有浏览器的测试。
Selenium 2,通常称为 webdriver,次要性能集成了 selenium 1 以及 webdriver(webdriver 已经是 selenium 的竞争对手)。也就是说,Selenium 2 是 selenium 和 webdriver 两个我的项目的合并,即 Selenium 2 兼容 Selenium,它既反对 selenium API(应用程序编程接口)也反对 Webdriver API。比照 selenium 1 时代的 selenium RC,webdriver 劣势显著。
Selenium RC 通过 selenium server 把 javascript 脚本注射到浏览器中,而后通过特定的测试脚本调用 javascript 命令,实现与浏览器的交互操作。webdriver 通过原生浏览器反对或者浏览器扩大间接管制浏览器,比 Selenium 1 更简略易学,并且速度大幅提高,调用的稳定性取决于浏览器自身,更加迷信。相应产生的问题就是,不同的浏览器厂商,对 web 元素的操作和出现多少会有一些差别,这就间接导致了 selenium webdriver 要辨别浏览器厂商,提供不同的实现。
Selenium Grid 使得 selenium 能同时并行地、在不同的环境上运行多个测试工作,极大地放慢了 web 利用的功能测试。
二、Selenium 1 工作原理
Selenium 1 是 selenium 中最次要的第一代测试工具,相比于 selenium 2,它更加成熟、稳固,能反对简直所有浏览器的测试。
Selenium 1 的毛病是:
- 编码方式是面向过程而非面向对象,易用性较差;
- 通过 Selenium Core 间接驱动浏览器,运行速度不如 webdriver。上面简略介绍一下 selenium 1 的工作原理。
Selenium 1 蕴含的次要组件有:
- Selenium 服务器:负责启动或敞开浏览器;解释和运行从测试程序中传来的 selenese 命令(selenese 是 seleniumIDE 中应用的命令集),并能够表演 HTTP 代理的角色;捕捉和验证在浏览器和被测试的应用程序之间传递的 HTTP 音讯。
- 客户端库文件提供了各种编程语言和 selenium RC 服务器之间的接口。
图 2 selenium1 架构
2.1 Selenium 服务器
Selenium 服务器用于接管测试程序传来的 selenium 命令,解释并执行他们,而后向测试程序反馈测试的后果。Selenium 服务器捆绑了 Selenium-core 并主动将其注入浏览器,该步骤在测试程序关上浏览器(调用客户端文件的 API 函数)时执行。Selenium-core 是 JavaScript 程序,也就是说,它是一系列 JavaScript 函数,用于调用浏览器内置的 JavaScript 解释器,以解释和执行 selenese 命令
该服务器同样能够接管来自测试程序的 HTTP GET/POST 申请的 selenese 命令,这意味着能够应用任何反对 HTTP 申请的编程语言来编写测试代码。
2.2 Selenium 客户端库文件
客户端库文件提供了对编程的反对,这样就能够本人设计程序来运行 selenium 命令。对于每一种反对的编程语言,都有不同的客户端库文件。Selenium 客户端库文件提供了编程接口,用于在程序中运行 selenium 命令。
客户端库文件能够生成 selenese 命令,而后将其传递到 selenium 服务器,对被测试的应用程序执行指定的动作或者测试。客户端文件也能够接管命令执行的后果,并将其传递给应用程序,应用程序能够依据返回后果判断以后测试是通过还是失败。
因而要创立测试程序,只须要通过客户端库文件 API 编写程序,用它来执行一系列 Selenium 命令。也能够在 Selenium IDE 中创立 Selenese 测试脚本,导出成客户端驱动的 API 函数调用,如图 3 所示。
图 3 导出 selenium1 执行脚本
三、webdriver 工作原理
这部分具体形容一下 webdriver 工作原理。援用一个形象的类比,能够把 webdriver 驱动浏览器类比成出租车司机开出租车,这个场景中有三个次要角色:
- 乘客:通知出租车司机目的地,以及大略路线
- 出租车司机:依照乘客的要求操控出租车
- 出租车:依照司机的操控实现理论的行驶,把乘客送到目的地
在 webdriver 中也有三个相似的角色,自动化测试脚本代码相当于乘客,浏览器的驱动相当于出租车司机,浏览器相当于出租车:
- 自动化测试脚本代码:自动化测试代码发送申请给浏览器的驱动(例如火狐、chrome 驱动)
- 浏览器的驱动:解析自动化测试代码,解析后把后果发送给浏览器
- 浏览器:执行浏览器驱动收回的指令,实现理论的操作
具体的脚本执行过程是:
- 对于每一条 Selenium 脚本,会创立一个 http 申请并发送给浏览器的驱动
- 浏览器驱动中蕴含了一个 HTTP Server,用来接管 http 申请
- HTTP Server 接管到申请后依据申请来具体操控对应的浏览器
- 浏览器执行具体的测试步骤
- 浏览器将步骤执行后果返回给 HTTP Server
- HTTP Server 又将后果返回给 Selenium 脚本,如果是谬误的 http 代码,就能够在控制台看到对应的报错信息。
同一个浏览器驱动既能够解决 C# 语言的脚本,也能够解决 Python 语言的脚本,这是因为:HTTP 协定是一个浏览器和 Web 服务器之间通信的标准协议,简直每一种编程语言都提供了丰盛的 http 库,能够不便的解决客户端和服务器端之间的申请与响应,http 申请及响应包含:http 申请办法、http 申请及响应内容 body、http 响应状态码等。
常见的 http 申请办法有:
- GET:用来从服务器获取信息,比方获取网页的题目信息等。
- POST: 向服务器发送操作申请,比方 click,findElement 等。
http 响应状态码用来判断申请的后果。
Body 局部次要传送具体的数据,在 webdriver 中以 JSON 报文的模式存在并传送,例如:
Webdriver 应用的协定是 JSON Wire protocol,该协定是在 http 协定根底上,对 http 申请及响应的 body 数据进行标准。当用户新建 webdriver 时,selenium 首先确认浏览器的 native component 是否存在、可用而且版本匹配。若通过确认,则在浏览器启动 web service 服务。JSON Wire protocol 协定功能强大,简直能够操作浏览器做任何事件,包含关上、敞开、最大化、最小化、元素定位、元素点击、上传文件等。
JSON Wire protocol 是通用的,不论 firefoxDriver 还是 ChromeDriver,启动之后会在某一端口基于该协定启动 web service。例如 firefoxDriver 初始化胜利后,默认会从 http://localhost:7055 开始。在调用 webdriver API 时,须要借助 CommandExecutor 发送命令,理论是向 web service 发送一个 http request,在该 request 的 body 中,以 JSON 格局调用 selenium 执行其余操作。
四、具体实例介绍(基于 webdriver 的测试脚本)
本局部介绍一个最简略的自动化测试脚本,该脚本实现科技治理工作台(ITA)的登录性能:输出账号和明码并点击登录。该脚本能够通过 Selenium IDE 录制,导出成 JAVA 语言脚本,也能够间接编写 JAVA 代码生成。次要脚本如下:
4.1 关上网页
上面的代码实现关上 firefox 浏览器并跳转到 ITA 登陆页面:
Webdriver driver = new FirefoxDriver();// 实例化一个 driver
driver.get(“http://ita.abc/ita/login.action”);
在执行 driver.get(“http://ita.abc/ita/login.action”); 代码时,测试代码向 server 发送了如下的申请:
POST
session/sessionId/url
post_data{“url”:”http://ita.abc/ita/login.action”}
通过 post 形式申请 localhost:port/hub/session/session_id/url 地址,并申请浏览器实现跳转 url 的操作。
如果上述申请是可承受的,server 会跳转到该 post data 蕴含的 url,并返回如下的 response:
{“name”:”get”,”sessionId”:”******”,”status”:0,”value”:””}
该 response 中蕴含如下信息:
- Name:server 端实现办法的名称,这里是 get,示意跳转到指定 url
- sessionId:以后 session 的 id
- Status:申请执行的状态码,非 0 示意未正确执行,这里是 0,示意执行胜利
- Value:申请的返回值,这里返回值为空。如果申请的是页面的 title,value 将被赋值为 title 的值。
4.2 元素定位形式
对于大多数 selenium 命令,都须要一个指标地位,该地位在 web 应用程序的上下文中惟一地定义 web 元素。
在 Selenium IDE 中,能够在每条录制命令中的 Target 抉择该元素的定位形式,如图 4 所示:
图 4 seleniumIDE 定位形式
在 webdriver 中一共有 8 种定位策略,具体列表如下:
图 5 webdriver 定位形式
以 id 为例阐明:
图 6 ITA 登陆界面
要在用户名输入框输出内容,能够通过 id=“userNameInput”作为定位条件获取该对象。如图 7 页面源码中,可看出,id=“userNameInput”可惟一标示用户名输入框。
代码 driver.findElement(By.id("userNameInput"))
示意寻找 id
为“userNameInput”的元素,在获取页面元素后,就能够对该页面元素进行各种操作了。
图 7 页面元素
4.3 元素操作
罕用的元素操作方法有如下几种:
- sendKeys()办法用于为 input 元素输出文本
- Click()办法用于执行单击元素的操作
- Clear()办法用于清空 input 元素的值
- Submit()办法用于对指定元素所在的 form 进行提交操作
示意找到 id 为 userNameInput 输入框之后,填写用户名信息。
五、总结
Selenium 蕴含 selenium IDE、seleniumwebdriver、selenium remote control(RC)和 selenium Grid 等组件。
Selenium 1 客户端库文件能够生成 selenese 命令,而后将其传递到 selenium 服务器,Selenium 服务器接管测试程序传来的 selenium 命令,通过 selenium core 操控浏览器,并向测试程序反馈测试的后果;webdriver 间接驱动浏览器进行各项操作,执行速度更优,易用性更强,然而 webdriver 对浏览器版本有肯定的依赖性,在版本升级后,须要下载新的驱动程序。
起源:IDCF 社区
作者:程伟静