月份归档 » 2014 / 08

1、下载并安装python(http://www.python.org/geti/)。 2、安装selenium(http://pypi.python.org/pypi/selenium)下载并解压缩selenium-2.32.0.tar.gz. 把selenium-2.32.0\py\下的selenium整个文件夹放入Python33\Lib\site-packages目录下。 3   下载Eclipse后安装pydev插件 4   打开eclipse创建pydev project,并添加一个Pydev Module 输入一下代码 # coding=gbk from selenium import webdriver from selenium.webdriver.common import by if __name__ == ‘__main__’: firefoxDriver=webdriver.Firefox() firefoxDriver.get(“http://www.baidu.com”) ele=firefoxDriver.find_element(by.By.ID,”kw”) ele.send_keys(“hello”) 5要想支持IE,Chrome,下载IEDriverServer,ChromeDriverServer.exe,将exe程序放在你所新建的Project的根目录下。。 6、如果是在Win7上运行IE8以上版本的浏览器,运行过程中可能会出现WebDriverException: Message: u’Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same value (enabled or disabled) for all zones.’ 这个错误,更改IE的internet选项->安全,将Internet/本地Internet/受信任的站定/受限制的站点中的启用保护模式全部去掉勾,或者全部勾上。下面是一个IE的例子,打开百度,自动搜索selenium。 from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Ie() driver.get(“http://www.baidu.com”) elem = driver.find_element_by_name(“wd”) elem.send_keys(“selenium”) elem.send_keys(Keys.RETURN) 完成上述步骤,你已经写了第一个基于python的selenium 脚本了 下面是我写的一个完整的例子,供大家参考: # coding=utf-8 ”’ Created on 2013/12/31   @author: zhangtiande ”’ import sys import time import os from selenium.webdriver.common.keys import Keys from selenium import webdriver def opensite(browserType): browser=getBrowser(browserType) browser.get(“http://www.baidu.com”); browser.maximize_window() return browser def getBrowser(browserType): if browserType==”IE”: command = ‘tskill iexplore’ os.system(command) command = ‘tskill IEDriverServer’ os.system(command) browser=webdriver.Ie() if browserType==”CHROME”: command = ‘tskill chromedriver’ os.system(command) command = ‘tskill chrome’ os.system(command) browser=webdriver.Chrome() if browserType==”FIREFOX”: browser=webdriver.Firefox() return browser def closesite(browser): browser.close() def beforestart(): ”’ clean env ”’ command = ‘tskill taskeng’ #杀进程 os.system(command)   if __name__ == ‘__main__’: browser=None try: beforestart() browser=opensite(sys.argv[1]) self.browser.find_element_by_name(“username”).send_keys(“test100”) self.browser.find_element_by_name(“password”).send_keys(“123”) self.browser.find_element_by_name(“password”).send_keys(Keys.ENTER) browser.close() browser.quit() except Exception,e: closesite(browser) browser.quit()  

  1   文档目的 编写此文档的目的在于帮助更多想学习Selenium webdriver的同好们,最近发现好多人想学习Selenium做自动化,又不知道怎么入门,因此写下这篇入门的文档供各位使用,希望大家能更快的领会到Selenium webdriver 的强大之处。本文只对Selenium webdriver入门作介绍,Selenium rc由于本人认为已经过时,不做介绍。另外本文只是一个简单的例子,想要深入学习的话,并不合适。 Java开发自己的第一个Webdriver脚本。   1)         前期准备 l   在官网的下载页面找到java版本的weddriver下载下来(Selenium Client & WebDriver Language Bindings) l   对于IE/Chrome浏览器你还需要下载IEDriverServer.exe,ChromeDriverServer.exe l   下载上述包文件后,解压缩。(请确保你的selenium版本能够支持你目前浏览器的版本) 2)  创建Java项目并添加Selenium相关jar包的引用,一下是我GAT框架里的一部分,做了少许修改。要只是运行一下代码 请将IEDriverServer.exe,ChromeDriverServer.exe放到你新建项目的根目录下。   public class Demo { public void main(String[] args) { DriverService service=getDriverService(browserType); WebDriver webDriver=null; switch (browserType.ordinal()) { case 1: { webDriver = new FirefoxDriver(); break; } case 0: webDriver =new InternetExplorerDriver((InternetExplorerDriverService)service); break; case 2: webDriver =new ChromeDriver((ChromeDriverService)service); break; } webDriver.get(“http://www.163.com”); webDriver.findElement(By.id(“kw”)).sendKeys(“selenium”); webDriver.findElement(By.id(“kw”)).sendKeys(“selenium”); } private DriverService getDriverService(BrowserType browserType) { DriverService service=null; switch (browserType.ordinal()) { case 0: { System.setProperty(“webdriver.ie.driver”,”IEDriverServer.exe”); service=InternetExplorerDriverService.createDefaultService(); break; } case 2: { System.setProperty(“webdriver.chrome.driver”,”chromedriver.exe”); service=ChromeDriverService.createDefaultService(); break; } } return service; } public enum BrowserType { IE, FireFox, Chrome } }  

  1     Web页面 对于很多做Selenium Web自动化的人来说,有时候会问到一个问题,就是我的网站是用java,Php等语言开发的。那我在做web自动化的时候要怎么处理不同开发语言做的网站呢。对于这个问题大家可以忽略,因为任何一种网站开发语言或者开发框架制作的网站在浏览器里显示的时候都是符合HTML标准的,也就是说同一个网站无论用什么语言来开发,在浏览器里来看的时候都是由一堆的html代码构成,所以说网页的展现是一种开发语言,开发架构无关的。 2     Web自动化原理 UI界面的自动化包括很多类型,包括Web自动化,Windows Application自动化,移动端自动化等等。但UI自动化的原理却是一致的。原理:通过抓取测试对象的控件,模拟操作来达到自动化的目的。后面会着重的讨论怎么样去抓取Web页面对象,至于其他几种UI自动化控件的获取不是本文的重点,不做过多介绍。 3     Dom Tree 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口。为什么我们可以获取到页面元素,并模拟操作就是因为DOM。 它定义了定义了所有 HTML 元素的对象和属性,以及访问它们的方法。之所以说这部门就是想让大家知道为什么我们可以用ID,Name等属性来获取元素,并能对获取到的元素做操作。 4       Selenium介绍 1)         Selenium RC: 2004年ThoughtWorks公司开发的web自动化测试工具。SeleniumRC也即现在所说的Selenium1.0.他的工作原理是基于浏览器的JavaScript注入,因此可以支持市面上所有可以支持javascript的浏览器做自动化。但是因为他的实现机制导致了很大的局限性,最明显的是不能支持在两个浏览器窗口间切换,只能在一个浏览器做操作。对于1.0的介绍就到这,我的观点是不推荐大家使用seleniumrc做自动化,因此不做过多介绍。 2)         Selenium WebDriver:这个版本也称之为Selenium2.0版,是把slenium rc和webdriver做了合并。WebDriver是由google内部工程师开发出来的,后来开源。他的工作原理如下图所示: 上图中没有提到FirefoxServer,是因为Firefox的server端是作为firefox的插件内置到浏览器中的,这也是为什么firefox浏览器在启动的时候比较慢的原因。Clinent端和服务器端的通信是通过http接口来完成的,我们写的任何一句Seleniu的代码都会被翻译成一个http请求发送给服务端,服务单解析然后来对浏览器做操作,然后将操作结果返回给客户端也就是我们的代码。 3)         Selenium Web Driver支持的语言比较多C#,java,python ,ruby等,支持多种语言得益于它的工作原理。顺便提一句目前业界各种自动化如果支持很多种语言的话,基本都是使用了webdriver的实现原理。 5     Selenium辅助工具 Selenium IDE Developer toolbar(IE),Firebug   这里只写了两类,SeleniumIDE是SeleniumRc提供的一个录制工作,这里介绍给大家是想让大家用它来获取页面元素的,并不是让大家录制的。像Firebug类的工作目前新一些的浏览器都提供,只要按下F12就可以了。既然可用Firebug类的工具为什么要介绍SeleniumIDE呢,因为它在获取页面元素的时候,可以给你提供多种定位元素的方式,你可以自由的选择。   6     用到的其他技能 1)         Winform类自动化工具:对于模态窗口(例如浏览器弹出的确认窗口,上传下载文件的窗口等)需要使用winform自动化工具。可以使用autoit,.net自带的自动化类等处理。 2)         对于页面flash的处理可以用sikuli来处理,它是一个图片对比工具。 3)         Javascript,有时候我们需要javascript来帮助我们处理页面元素。 4)         了解浏览器渲染页面的方式,会对你调试自动化代码有很大帮助。了解了渲染方式你就可以知道页面元素是怎么样加载的。   7     最基本的Web自动化运行方式 做web自动化的时候会遇到一个问题就是我的用例怎么能够批量的自动化的执行。 如果你用例数量不大或者资源不足的情况下,可以选择使用jenkins+testing+webdriver 的方式来搭建你的运行框架。如果你用的语言不是java,可以把testng替换为你使用的语言自己的单元测试框架即可。

3.2接口用例场景组件 在此之前,大家应该都已经开发完成了一个最简单的接口测试用例,但是之前的接口用例的期望结果是固定值,不能动态的去做对比,有很大局限性。下面开始介绍怎样通过场景组件来动态对测试结果做断言。(以下步骤的前提是你已经完成了3.1小结中的简单测试用例。)   1)         单一接口用例的断言组件 l   第一步:在eclipse中导入IATStepGroup,根据你自己的接口功能模块添加新的package包.本例中我添加的package名字:cn.gateside.iat.steps.demo   l   第二步:在新建的package下添加场景组件类。类名称建议以接口的名称+Steps作为你的场景组件类名称。本例中我添加的场景组件类名称为:UserInfoSteps.java   l   第三步:添加好场景组件后,开始添加场景组件方法。在UserInfoSteps.类中添加如下代码: @AssertStepMethodDesc(description=””,owner=””) publicvoid asserUserInfo(String parameterID,String expectResut,String actualResult) throws Exception { InterfaceStepParameter parameter=(InterfaceStepParameter)ParameterHelper.getInterfaceStepParameter(parameterID); JSONObject object=JSONObject.fromObject(actualResult); MysqlDBOperationService service=new MysqlDBOperationService(parameter.ConnectiongString); List<List<String>> resultSet= service.executeQuery(parameter.getValue(“announcerInfoSql”),parameter.getValue(“user”),parameter.getValue(“password”)); assertEquals(object.keys(), resultSet.size()-1,”!!!the announcer number from interface is different from the number from database!!!”); } 以上是一个最常用的断言场景组件的写法。接下来解释上述方法中的每一行。这里说到的每一行是指一行代码,请忽略换行,以及花括号。   H1:是断言方法的注解,包含两个参数description(方法功能描述),owner(方法的开发人员)   H2:场景组件方法定义,需要注意的是断言组件方法会有三个参数,分别表示这个方法中用到的数据的存储ID,期望结果,以及用例的实际结果。   H3:第三行是用来获取方法中用到的数据,根据parameterID从存储数据的xml文件中读取。此行可以照抄,如果没有用到数据可以不写此行。   H4:是将实际结果转换成Json对象,如果实际结果不是json字符串,请用相应的处理格式来处理。   H5,H6:两行是用来从数据库查询出期望的结果和实际结果做对比。对于H5行来说只有一个参数ConnectionString,在此是指JDBC链接字符串。H6行中三个参数,第一个只是要执行的sql语句,后面两个是访问数据库需要的用户名和密码。另外H6返回值是一个二维的list.resultSet.get(0)代表的是查询结果的column name.   H7:对实际结果以及查询到的期望结果做断言。   2)   断言场景组件的使用 完成自己的场景方法后,接下来介绍怎么使用。首先需要知道我们完成的场景方法的全名是什么。 l  场景方法全名:cn.gateside.iat.steps.demo.UserInfoSteps.asserUserInfo,也就是之前提到的pacakge.class.method l  现在来看怎么使用我们的场景方法,先打开你在excel中创建的用例,将AssertType的值改为Custom.然后修改AssertMethod的值为cn.gateside.iat.steps.demo.UserInfoSteps.asserUserInfo:Test01 l  到这一步的时候,很多人可能不明白AssertMethod的值里面【:Test01】的意思,这一段表示这个场景方法用到的数据在xml中的存储ID.这个ID也就是在你开发场景方法的时候的第一个参数parameterID. l  接下来看看,parameterID这个参数指定的数据是存放在哪里,对于Excel形式的用例,parameterID所指定的数据是存放在与Excel同名的xml文件里的。所以在我们示例中开发的场景方法用到的数据必须都放在xml中。 |  在运行你的用例之前,要做的一件事就是修改IATStepGroup项目下的build.xml文件。将下图中红框里的路径修改为你本地的Libs的路径。修改完成后,将IATStepGroup编译打包成jar文件   l  准备好数据后,就可以运行你的用例,注意如果只是修改了数据不需要重新执行GatRuner生成用例。

1 GAT代码地址:  https://github.com/TeamcatCorp/GAT-CODE.git 2 GAT快速开始项目模板地址:https://github.com/TeamcatCorp/GAT-DEMO.git 2  有问题请添加qq群:5130251950251951302519

2.3 用例开发架构 开发架构从物理角度看如下图:稍后就图10中的目录用途做详细说明 图10 1) 公共目录 l Libs:对于接口自动化以及WebUI自动化所使用的所有第三方类库都放在此目录里。 2) 接口相关目录 l InterfaceAutomation:接口自动化用例,场景组件,测试数据,用例描述文件等均放置在此目录中。总之就是接口自动化相关的文件都在此目录中。 l DataFiles\Excels: 用于存放单描述接口用例的Excel文件,以及其他参数文件 l DataFiles\Xmls:用于存放描述多接口用例的Xml文件,一起其他参数文件 l GatRunner:用于生成单元测试的工具 l IATStepGroup:所有测试用例中使用到的场景组件 l IATTestProject:由GatRunner生成的单元测试项目 3) WebUI相关目录 l UIAutomation: WebUI自动化用例,场景组件,测试数据,用例描述文件等均放置在此目录中。WebUI自动化相关的文件都在此目录中。 l DataFiles\Xmls:用于存放描述用例的Xml文件,参数数据文件,页面元素信息文件等。 l GatRunner:用于生成单元测试的工具 l WUATStepGroup:所有测试用例中使用到的场景组件 l WUATProject:由GatRunner生成的单元测试项目   3 开始写用例 3.1接口用例开发 1) 准备工作 l 第一步:获取图10中所有目录以及目录下文件。(注意:图10中顶层目录MobildePlatformQA.AutomationTesting名称可以自定义。另外如果只是做接口测试可以不获取UIAutomation目录及目录下的文件) l 第二步:获取到所有目录及文件后,打开InterfaceAutomation->GatRunner目录下的gatCreator.properties文件,做如下修改: 图11 l 第三步:打开InterfaceAutomation->GatRunner目录下的startup.bat文件,做如下修改 图12 2) 开始单接口用例开发 单一接口的用例的数据以及用例描述文件是存储在Excel文件中的。下面就详细解释一下Excel中各个字段的含义以及注意事项。 字段名称 字段说明 可选值/实例 ID 唯一即可 DomainName 接口URL的域名 http://api.demo.com Path 域名后参数前的部分 /service/uerlist ParameterName url的参数,列名以$开头 ExpectResult 接口的期望结果   AssertType 断言方式 Equal:和期望结果相等 Contains:包含期望结果 Custom:需要自定义场景组件   AssertMethod 断言方式为自定义情况下需要提供场景组件方法 packagename.classname.methodname:场景组件的参数ID SetupType Custom   SetupContext 需要Setup情况下需要提供场景组件方法 packagename.classname.methodname:场景组件的参数ID   TearDownType Custom   TearDownContext packagename.classname.methodname:场景组件的参数ID   备注:空值必须以:$NULL代替,不能留空 l 第一步:在InterfaceAutomation->DataFiles->Excels目录下创建一个Excel文件。文件名称代表接口所属的模块,请起一个有意义的名字。 l 第二步:打开新创建的Excel文件,并把一个sheet的名字修改为接口的名字,注意一个sheet只能为一个接口写用例。Sheet名字请不要包含特殊字符等。 l 第三步:复制已经存在的excel文件中的各个列名,到新建的sheet中,并开始填写值。 图13 l 请注意一下几点: n 确保ID唯一,DomainName,Path等字段的值都正确。 n 如果接口没有参数请确保没有以$开头的列。 n 如果不想传某个参数,可以把该参数的值置成$EMP. n Excel中的一行代表一个用例 n 如果需要添加描述性的列,列名请以#开头即可 n 黄色背景字段为默认字段,名称必须保持与图片中的一致。 n 绿色背景字段为接口参数,每增加一个参数在绿色字段增加一列即可。列名称为$+参数名称.如果没有参数请不要保留任何参数字段。 n 图片中可为空字段,在为空是请以$NULL代替 n 如果字段值为数字,请将单元格格式设置为字符串   l 第四步:完成以上步骤后,保存Excel文件。然后进入InterfaceAutomation->GatRunner中,双击bat文件。在双击之前请确保已经关闭了Excel文件,否则有可能出错。等到提示press any key的时候,就意味着框架已经根据你的excel文件为你在InterfaceAutomation->IATTestProject中生成了相应的测试用例方法。   3) 运行用例 到这步的时候你已经成功的完成了第一个用例,接下来是运行你的用例。 l 第一步:打开eclipse将生成的IATTestProject导入。 l 第二步:导入成功后,在Project下找到gatconfig.properties文件。做如下修改: 图14 l 修改完gatconfig.properties文件并保存后,在src文件中找到excel文件名_sheet名称.java文件然后点击右键,run as Testng就可以了

1背景 1.1  项目背景 开发GAT(General Automation Testing)的最初目的是公司同时需要做Web前端自动化,以及服务端的接口自动化。可能很多人觉得服务端接口测试和Web前端测试的方式差别的太大,所以应该各自写框架做测试。这种想法是很自然的想法,如果按照这种方法做了,写自动化测试用例的人就要分成两类,如果想互相备份那么就会形成相应的成本。基于我多年的Web开发,接口开发经验,以及4年多Web,接口自动化测试经验,决定将接口测试框架与Web前端自动化框架集成,统一接口用例开发,以及Web前端开发的方式,运行的方式等。降低测试人员开发自动化用例的门槛。 1.2  框架适用范围 1) 服务端接口 l 基于Rest协议的接口(移动端调用的接口基本都是此类接口) l Web Service类接口 2) Web UI 自动化 l 框架基于Web Driver封装 3) Android l To Do 1.3  使用要求 1) 支持的语言:Java 2) 必备软件:Eclipse,JDK 7.0+

2 GAT框架 2.1 GAT介绍 GAT框架目前支持两种类型的自动化测试,接口自动化,以及Web UI自动化测试。未来计划添加对Android Native App的自动化支持。使用框架的用例最终以Testng 的TestMethod来展现,因此支持与jenkins的无缝集成。 2.2 框架特点 1) 接口自动化 l 提供多种接口测试方式。即单一接口测试,多接口业务流程测试。目前多见的为单一接口的测试。 l 根据用户需求不同,不同的接口测试方式,用例开发难易度不同。 l 用例开发门槛低,用户只需要将接口用例数据填入格式化文件即可自动通过工具生成用例。 l 对于高级需求,框架提供自定义配置包括数据构造,精确匹配测试结果等。 l 框架对于不同域名下的相同接口支持自定义配置,只需要简单修改测试平台配置即可轻松将用例应用在不同平台上。 l 框架对于不同协议接口的支持,近乎无缝连接。 l 框架支持可配置 2) Web UI自动化 l 用例开发实现页面元素,测试用例数据,测试用例分离,实现了参数化与数据驱动 l 用例开发模式一致,语句编写一致,降低维护成本 l 更高粒度上的关键字实现 l 关键字模型化,模型数据驱动化,通过数字驱动化的关键字的组合可以拥有千变万化的用例,但是需要维护的代码降低到了最少、 2.3框架整体组成 图1 对于Web UI自动化和接口自动化来说,图1 中表示的功能可能会有少许差异,下面我将分别做说明。   1) 公共部分 l 单元测试集生成工具:根据用例描述文件来生成Testng 的TestMethod l 公共类库:包含了访问数据库,XML文件等各种公共类 l 单元测试集:由代码生成工具根据用例描述文件自动生成,一个Testmehod为一个用例。 l 核心框架:包含操作用例描述文件,测试数据文件,以及数据构造,接口调用,结果验证等功能 2) 接口测试部分 l 场景组件:场景组件是由用例开发人员开发的具有特定格式的方法,场景组件方法是定义在用户自定义的一个类中。场景组件作为用例的重要组成部分,在用例执行时由核心框架通过反射的方式逐个执行。分为3种。具体形式看下图。 图2 a) 红圈1代表了第一种场景组件,用来做断言的断言类组件 b) 红圈2 代表了第二种场景组件,用来作为用例其中一个步骤的步骤组件 c) 红圈3 代表了在用例执行前需要执行的组件 l 用例数据:对于接口测试来说,用例测试数据由于接口测试用例类型的不同分别存储在Excel文件和xml文件中。形式如下: a) 存储在excel中的数据 图3 b) 存储在xml中的数据 图 4 以上数据无论是存储在什么文件中,都是一个段格式化的数据,分别对应着框架中的一个类。 l 用例描述文件:用来描述用例使用了哪些数据或者由哪些场景组件组成等信息。对于接口测试来说用例描述文件根绝测试用例类型也分为两种。形式如下: a) 存储在excel中(这种形式的用例,用例描述和用例数据是放在一起的具体形式查看数据小结) b) 存储在xml中,这种类型的用例是由多个测试场景组件组成的,xml文件中保存了测试场景组件的必要信息。形式如下: 图6 1) Web UI部分 l 场景组件:场景组件是由用例开发人员开发的具有特定格式的方法,场景组件方法是定义在用户自定义的一个类中。场景组件作为用例的重要组成部分,在用例执行时由核心框架通过反射的方式逐个执行。分为3种。具体形式看下图。 图7 a) 红圈1代表了第一种场景组件,用来做断言的断言类组件,断言类组件方法有三个参数本组件用到的数据的ID,以及期望结果,实际结果 b) 红圈2 代表了第二种场景组件,用来作为用例其中一个步骤的步骤组件(仅有一个参数) c) 红圈3 代表了在用例执行前需要执行的组件(仅有一个参数) l 用例数据:对于Web UI自动化测试来说测试用例数据全部存储在xml文件中 形式如下:   图8 以上数据和接口用例数据一样,都是一个段格式化的数据,分别对应着框架中的一个类。 l 用例描述文件:用来描述用例使用了哪些数据或者由哪些场景组件组成等信息。对于Web UI自动化来说用例描述文件只有xml一种,这种类型的用例是由多个测试场景组件组成的,xml文件中保存了测试场景组件的必要信息。形式如下: 图-9