Sahi 是 Tyto Software 旗下的一个基于业务的开源 Web 应用自动化测试工具。Sahi 运行为一个代理服务器,并经过注入 JavaScript 来访问 Web 页面中的元素。Sahi 支持 HTTPS 而且独立于 Web 站点,简单小巧却功能强大。它相对于 Selenium 等自动化测试工具,在动态 ID 元素查找和隐式页面等待处理等方面具备必定的优点。选择 Sahi 工具来实现具体 Web 项目的自动化测试是一个很不错的选择。html
Web 测试背景java
随着 Web 技术和互联网的发展,Web 应用产品愈来愈丰富,基于 Web 页面测试的需求与日俱增。在当前全球软件都在追求高效、敏捷的开发模式的大背景下,Web 自动化测试成为了新一波技术探讨和研究的热潮。由于传统的手工测试不只效率低,而且测试质量受限于测试人员的一些情绪和心情。若当一个测试人员带着烦躁情绪来测这些繁杂的大量重复性工做,测试的质量使人担心。更况且,当这项测试工做涉及到全球化方面的测试时,多语言版本的测试工做致使该测试工做量的成倍增长,这无疑是一项巨大的考验!web
当说起面向 Web 的自动化测试,相信许多读者会想到或者说使用过 Selenium、Watir 等工具,而对于 Sahi 就可能比较陌生。首先,让咱们先来了解下 Sahi 工具。它是一款印度公司 Tyto Software 开发的成熟的开源 Web 自动化测试工具。Sahi 简单易用,能良好支持 Ajax 和 Web2.0 技术,同时适用于敏捷和传统的不一样测试模式。那么,它与其余很是流行的 Web 自动化测试工具备哪些不一样和优点呢?让咱们将其与主流自动化测试工具 Selenium 和 Watir 来进行一番对比,请参考图 1:正则表达式
从上图的对比能够看出,Selenium 支持的脚本语言比较丰富,且自带 Selenium IDE 自动录制工具,Watir 执行的速度相对其余较快。而 Sahi 一样具有了自带的录制器,且支持几乎全部浏览器,且对 JS 支持较好,拥有页面等待判断机制,内置 Java 异常报告,支持 Ajax 等优点。数据库
下面,本文将详细介绍一下 Sahi 的几大优点。编程
大多数如 Selenium 等 Web 自动化测试工具或是自动化框架,都采用相似基于 DOM 的定位策略、Xpath 定位策略和 id、name、identifier 等页面元素定位策略。浏览器
Identifier 定位是最广泛的一种定位方式,当不能识别为其它定位方式后,默认为 identifier 定位。在这种策略下,第一个使用 id 的页面元素将被识别出来,若是没有使用指定 id 的元素,那么将识别第一个名字与指定条件相符的元素。服务器
例如,identifier 识别 username 元素的定位策略:identifier=username网络
Id 定位是在知道元素具体 id 特征的状况下的一种更精肯定位。例如,定位页面元素 loginFrom:id=loginFrom框架
name 定位方式是去识别第一个匹配名称属性的 UI 元素。若是多个元素拥有相同的名称属性,可使用 value 过滤器来进一步优化您的定位策略。例如,定位页面元素为 username:
name=username
Xpath 定位是在 XML 中定位元素的方法,而 HTML 能够被看做是 XML 的一种实现。XPath 扩展了上面 id 和 name 定位方式,提供了绝对路径和至关路径两种查找方式。
绝对路径:html/body/div[1]/div[1]/div[3]/div[1]/form/span/input[1]
相对路径查找://div[@id='fm']/form/span/input
然而,在实际的状况下,页面元素并不是如预期般明确。一些动态页面的 DOM 树经常随着 Web 产品的更新而频繁改变。许多的元素值如 ID、Name 等在代码中并非必须的,经常会缺省。而且,属性值每每不是惟一对应的,页面中有时会存在相同属性的元素。当缺省 id 值或是 Xpath 定位失效时,上述这几种查找定位方式每每显得无助和脆弱。
Sahi 采用了一种主动查找的机制,它不受限于特定的元素属性。在没有 ID、Name 值的状况下,它可使用一些如“title,value”等属性,这些都是页面可见的属性,所见即所得。同时,Sahi 会经过传入这些可见可识别的属性值,来按照 Sahi 预设的机制进行查找识别。Sahi 容许开发者对每一种元素设置不一样属性和特定的查找顺序,包括那些自定义的属性名。因此 Sahi 相对于其余的 Web 自动化测试工具更灵活更开放。
好比,_link(“valueName”)用来定位一个定义为“valueName”的 link,这里的 valueName 并不必定是 value 的属性值,也能够是它的 id、title 等。
前面提到了 Sahi 主动查找的机制,那么它是如何去查找 DOM 节点下的特定元素的呢?Sahi 主要提供了三种基于上下文的元素 API:_in,_near 和_under。
从字面意思上,咱们不难理解,_in 是指在某个 DOM 节点下查找某个元素,这比 Xpath 的无论是绝对路径或是相对路径查找都来的灵活,不会由于 DOM 树内部结构发生变化而致使路径失效找不到元素的问题。
_near 是指在某个元素附近查找相应设定规则条件的最近一个元素,这对于一个页面中有多个相同属性值的状况提供了一个很好的解决方式,使查找的范围更精确。
_under 是指在某个元素下方开始查找,找到符合条件的最近一个元素,通常_under 都适用在具备相同偏移量的同一列中。下面,咱们来看一个例子,加深对 Sahi 这种基于上下文识别查找机制的理解:
假设,在图 2 显示的 Web 页面的全部 text box 的 name=”q”,那么,Sahi 的侦探器经过一些标识来鉴别它们,如(_textbox("q"), _textbox("q[1]")和_textbox("q[2]"))。
若是,咱们要定位“Ruby for Rails”那一行的 text box,即_textbox("q[1]")。传统的元素识别会遇到多个相同属性元素的问题,即便是 Xpath 的定位方式也会由于在它前面加了一行新的数据而致使 Xpath 定位失败的状况。
这时 Sahi 能够经过_near 这种方式来定位:
_textbox("q",_near(_cell("Ruby for Rails")))
当要定位 check box 时,咱们又会发现,“Ruby for Rails”这一行有“Recommend”和“Already own”两个 check box,为了更准确地定位,咱们能够结合_under,例如:_checkbox(0,_near(_cell("Ruby for Rails")),_under(_cell("Recommend")))。
若是在整个页面中存在多个这样的表格,咱们还能够用_in 来进一步缩小范围,如:_checkbox(0,_near(_cell("Ruby for Rails")),_under(_cell("Recommend")),
_in(_cell("Cost))).
同时值得一提的是,Sahi API 中的 identifier 参数都支持正则表达式,例如,_div(/name.*/) 用来识别全部以某种预属性值是 name 开头的 div。
如今愈来愈多的 Web 应用采用 Ajax 的应用技术,来支持网页数据的异步请求响应。当前通常的 Web 自动化测试工具没有一个智能的处理机制,来判断什么时候能够继续下一个操做。像 Selenium 等自动化测试工具一般会在脚本中人为来设定一个固定的等待时间。但这每每被证明不必定是准确的。实际测试中,人是很难准确判断每个操做请求须要的合理时间数值。由于,等待时间设置太短,下一步操做在被测应用请求还未返回就执行了,或是因为网络因素使正常的响应时间变长,均可能致使测试过程找不到相应的页面元素,从而致使整个测试用例失败的状况。而若是把时间设置过长,又会形成在一些正常响应过程当中的没必要要等待的时间浪费,下降了测试效率。
固然,一些测试人员会在自动化测试脚本中加入一些自定义的代码。经过轮询界面上某个指定元素,来判断请求响应是否返回,进而决定继续下一步操做或者是超时。可是,这样的查找过程会致使整个脚本代码变得很是臃肿,加大了开发的成本。更况且,在一个动态的页面找到指定的元素自己就不是一件容易的事。
Sahi 内置了智能的页面等待机制,可以自动判断 Ajax 请求是否已经处理完毕,而后继续下一步操做。而且,这一点对于用户是“隐式”的,不须要增长额外的代码。
简单地说,用 Sahi 实现自动化测试有三步,录制,精炼脚本和回放,以下图:
如上图 Sahi 就是先用其自带的录制工具,把大体的操做过程录制下来,并用 Sahi 代码记录下整个操做过程。随后,将自动生成的代码进一步的精炼和开发,调用一些外部 API 或编写特定代码来实现特定的操做。最后,用 Sahi 来回放保存好的最终脚本,Sahi 就将自动对 Web 应用进行定义好的测试操做。
下面,本文将对这三个过程进行详细说明。
Sahi 是经过运行为一个代理服务器,并经过设置浏览器代理为 Sahi 服务器。这样 Sahi 的脚本就可以经过 request 请求来注入到 JavaScript 里以访问 Web 页面中的元素。如图,能够很清晰的看到,Sahi 就是 Web 浏览器和 Web 服务器之间的一个中间代理。
录制的脚本都是指定元素并惟一操做的,这时就须要对代码进行重构,抽取出核心的功能块,对其中的元素进行参数化处理,以实现重用。这样的数据能够从外部的 DB 或文件中读取而来。与此同时,也可调用 Sahi API 或外部 Java 等 API 实现特定的一些功能。
Sahi 运行提炼好的脚原本自动化测试操做,并生成测试报告。
Sahi 虽然是 Tyto 公司的产品,但它的下载放在世界上最大的开源软件开发网站 SourceForge 上,能够经过点击这里下载。
默认推荐是下载 install_sahi_xxx.jar,这是一个可执行文件,包含了 Sahi 的安装器和 Sahi 工具及其源代码。固然您也能够点击上图红框处“Browse All Files”来选择历史版本和一些免安装压缩文件。好比,选择只包含 Sahi 工具的 sahi_xxx.zip 文件,或者包含了 Sahi 和源代码的免安装压缩包文 件sahi-src_xxx.zip。
通常建议选择推荐的 Sahi 安装包文件便可,这样能够免去一些设置操做,并能够选择是否安装源代码。双击 jar 文件进行安装,如图:
安装过程很是简单,待安装完成后双击桌面图标打开 Sahi 程序。打开程序先会出现一个 Sahi Dashboard,它能自动开启 Sahi 代理服务来启动浏览器,而不须要繁琐的代理服务器设置操做。固然若有须要,您也能够手动修改这些代理设置。
Sahi 会自动去侦探您系统里安装的一些浏览器,并在 Sahi Dashboard 上显示出来,若是发现有一些其余的浏览器未被准确侦探出来,您也能够点击下面的“Configure”来进行配置添加进来。
接下来,经过点击 Sahi Dashboard 上的浏览器图标按钮来启动相应浏览器。
您能够输入起始测试的网页 URL 开始您的测试。若是测试的目标 URL 是 HTTPS 协议的,也能够点击“SSL Manager”来查看和管理 SSL 证书。
按住 Alt 键并双击页面,将弹出 Sahi 控制窗口,如图 12:
这个窗口至关于 Sahi 的主控台,在这里咱们能够来录制和回放 Sahi 脚本,并编辑和管理脚本信息。
在 Record 视图界面,输入一个脚本名称,点击“Record”,这时 Sahi 录制器便开始工做了。把鼠标移到浏览器上的目标网页上,您的全部操做过程都将被记录下来。您也能够自定义增长一个 Assertion。按住 Ctrl 键,把鼠标移动到目标网页的任意一个 HTML 元素,那么这个 Accessor 会自动出如今 Sahi 控制器中。这时,即可以自定制对该元素的操做。经常使用的操做有“点击”,“高亮”,“赋值等。同时,您能够经过“Append to Script”按钮来加到脚本代码中。录制完成后按“Stop”来结束整个过程。
图 13 是一个简单的 Sahi 自动录制过程获得的 Sahi 脚本代码。其大体过程为:经过百度搜索“sahi”关键字,校验 Sahi 官网的 assert 是否存在,点击进入 Sahi 官网后继续校验 assert“Community Forums”,点击进入。经过前一节“Sahi Controller 录制”来完成这个操做过程,那么,您能够在默认目录“C:\Users\IBM_ADMIN\sahi\userdata\scripts”中找到先前命名为“Test_sahi”的脚本文件,咱们能够将这段代码进行一个精炼和丰富的过程,好比在点击“Community Forums”连接前将它进行高亮操做:
_popup("Sahi Web Test Automation Tool")_highlight(_link("Community Forums"));
或者您想在 Sahi 脚本代码中调用内置的 Java 类,例如:
functionprintThroughJava(s){ java.lang.System.out.println("Through Java: "+s);} printThroughJava("Hi there");
“Through Java: Hi there”将在 sahi 的命令行中输出。
回放的时候,只须要在 Sahi 控制台上切换到“Playback”tab 页面,找到脚本存放的路径,下面就有开始、暂停和结束等按钮来进行操做。须要注意的是,开始之前必须给它设置一个“Stat URL”不然没法回放脚本。脚本回放的时候,在“Statements”里能够看到脚本运行的日志,好比操做步骤和一些错误信息等。
经过点击右下角的“View Logs”能够查看详细的 Sahi 运行日志报告:
由图可见,这样自动录制生成的脚本代码都是 Sahi 代码,咱们能够在实际的 Java 项目中调用这些 Sahi 代码,以实现重用。其实,咱们能够经过打开 sahi/config/sahi.properties 文件将其中属性设置为 controller.mode=java 来实现自动录制脚本的语言为 Java。值得注意的是,改成 Java 语言录制后的 Sahi 控制器和原来有所不一样,它的界面更简洁,功能也更简单一些,没有了自动回放功能。由于,这更可能是为了自动生成一些简单的脚本,来提升开发人员的开发效率。
Sahi 脚本是基于 JavaScript 的,而 Sahi 脚本是经过代理解析的,并可以在 rhino JavaScript 引擎中有效执行的。除了变量前的强制符$,它和 JavaScript 基本很像。
Sahi 操做的代码声明是一句以分号结尾的普通代码行,如:
_click(_link("Login"));
变量声明:
var$variableName =value;
或者先声明再赋值:
var$variableName;// declaration $variableName =value;// assignment
全部的变量都是以$符号开头的,关键字 var 用于局部变量,如:
var$username ="SahiTestUser"; var$password;// declaration; $password =$username +"_password";// "SahiTestUser_password"
函数声明:
// function declarationfunctionlogin($usr,$pwd){ _click(_link("Login")); _setValue(_textbox("username"),$usr); _setValue(_password("password"),$pwd); _click(_submit("Login")); } // function call login("sahi_user","secret");
在一个 Sahi 代码文件中能够经过_include来包含调用其余 Sahi 文件,如:
_include("includes/common_functions.sah");
由上面的语法可知,Sahi 是由下划线开头,带上操做或 HTML 元素,很是简单,清晰易懂,这些 API 基本都是可以看字面就能理解它的功能。
Sahi 的 API 主要能够分为 3 类:浏览器访问 API、浏览器操做 API和混合 API。
浏览器访问 API:用于访问浏览器上的元素,并经过代理来注入这些 API 到浏览器中去。
浏览器操做 API:主要来执行一些如点击、输入数据等操做,并在浏览器上声明这些元素的。
混合 API:是既能在浏览器又能在代理上用于处理异常和操做文件和数据库的。
因为 Sahi 对网页的访问方法的 API 不少,你们能够参考官方 API 文档进行学习。
由上可知,Sahi 脚本都是很直接的声明和操做过程,在一个运行的代理上,由 Sahi Dashboard 来管理执行。若是咱们但愿可以将咱们的 Sahi 自动执行的过程与咱们其余的项目功能模块进行集成,那么把这些脚本转换成 Java 代码,又能用独立运行,是一件一箭双鵰的事。
接下来,本文将介绍一个用 Sahi Java Driver 来编写 Sahi 自动化脚本实现 Web 自动化测试的简单案例。
首先,将 Sahi 的开发库包文件 sahi.jar 加入到 Java 项目中,该文件位于 Sahi 安装路径下..\sahi\lib\下,接下来就能够参考 Sahi 的 Java API 来开发自动化测试脚本。下面是一个简单的案例脚本:
import net.sf.sahi.client.Browser; import net.sf.sahi.config.Configuration;
设置 sahi 安装路径和 userdata 路径
String sahiBase = "C:/Users/ADMIN/sahi/"; String userDataDirectory = "C:/Users/ADMIN/sahi/userdata"; Configuration.initJava(sahiBase, userDataDirectory);
您能够设置任意一种浏览器类型,也能够在 sahi/userdata/config/browser_types.xml 文件中本身建立定义
String browserType = "firefox"; Browser browser = new Browser(browserType); browser.open();
browser.navigateTo("http://sahi.co.in/demo/training/"); browser.textbox("user").setValue("test"); browser.password("password").setValue("secret"); browser.submit("Login").click(); browser.textbox("q").setValue("2"); browser.textbox("q[1]").setValue("9"); browser.textbox("q[2]").setValue("4"); browser.button("Add").click(); System.out.println(":: browser.textbox(\"total\").value()=" + browser. textbox("total").value()); browser.close();// close the browser
须要注意一点,除了 Firefox 浏览器,其余的浏览器都必须进行服务器代理配置,并在运行脚本前打开 Sahi 代理服务。
实际测试结果代表,Sahi 代码简介,运行轻巧快速,并且它还能与外置的一些模块集成完成发送邮件,读取 PDF 文件等操做,功能很是完善。
综上所述,本文从当前 Web 自动化测试的困境出发,经过与其余开源 Web 自动化测试进行对比,介绍了 Sahi 的特性和优点。主要从基于上下文页面识别机制和智能页面加载响应等待机制两方面进行阐述。同时,详细介绍了 Sahi 的工做原理以及如何安装部署进行自动化测试开发的过程。总之,Sahi 提供了一套在多浏览器和多编程语言的开源自动化测试方案,解决了当前一些页面元素难找,页面响应不一样步而致使测试失败的问题。Sahi 是一个可以快速部署,易于开发而且功能强大的开源 Web 自动化测试工具。因为篇幅所限,本文不能对 Sahi 全部的功能进行一一阐述,但愿有兴趣的朋友一块儿研究探讨。
【源地址】http://www.ibm.com/developerworks/cn/web/1403_yangxb_sahi/