文章来源:http://www.cnblogs.com/raol/p/flexmonkey.html

我的有道云笔记:http://note.youdao.com/share/?id=22b79669c366c65e6bbdc5e541266b8f&type=note


1. 研究FlexMonkey的缘由, 关于自动化测试.

     每一次的迭代都需要大量的回归测试, 测试的点烦了, 开发的懒得点, 导致最后出来的版本BUG繁多, 为了进一步提高软件质量, 但也不能做重复工作,所以咱也研究一下自动化测试吧。
    项目介绍: XXX
    所用技术: Flex4+Java  
    现在主要关注UI, UI部分主要由html+swf文件组成。所以怎么测试呢? 工欲善其事, 必先利其器。那咱就先百度一把看看有哪些工具吧。
    经过搜索Flash Selenium ,Flex UI Selenium,Selenium Flex API,Fluorida、FunFx,FlexMonkey,RIATEST发现这些都是针对Flex进行录制的工具, 但是很多工具已经是昨日黄花, 其中Flash Selenium ,Flex UI Selenium,Selenium Flex API,Fluorida、FunFx,都支持Flex2, Flex3,之后没有再更新, FlexMonkey, QTP,RIATEST 都有Flex4的支持,其中又分,RIATEST只支持对纯Flex或者AIR的测试, 咱页面还有html呢, 先放弃QTP这个比较庞大, 体积就不小,还有一堆vb脚本, 没得选, 暂时先研究FlexMonkey吧。
   
    FlexMonkey官方网站上有5个产品,我这次主要关注了FlexMonkium这款工具,这款工具能与传统的Selenium进行整合,能集成在SeleniumIDE上进行录制网页上所有操作的行为,通过SeleniumIDE导出Junit4的单元测试代码,导出代码后,能加上数据的准备操作,以及验证flex页面上的数据是否准确,此套代码能在SeleniumServer上运行, 客户端需要导入SeleniumRC的Lib,能完好的与持续集成环境整合,导出测试报告。
 
    经过此次的前期调研工作, 发现FlexMonkey挺符合目前项目需要的。
    选定工具: FlexMonkey+selenium
      相关的一些文章:《Flex自动化功能测试工具大比拼》, 该文章中介绍了几种专业自动化测试工具。
     
 
2. 认识 FlexMonkium , 下载 FlexMonkium .
    上一篇文章已经确定了目标, 那咱就现在认识一下Flexmonkey,点击进入 官网, 什么,你点了, 还没打开?是的,官网奇慢, 慢如蜗牛, 慢的都怀疑FlexMonkey是不是没钱搞个好点的域名解析供应商, 但又想回来, 或许就天朝慢呢, 不知不觉中打开了, 点击TESTINGTOOLS可以看到这个菜单下有FoneMonkey, FlexMonkey, Flexmonium, 等,点击FlexMonium,点击download按钮, 下载进入如下页面:当然需要先注册。
    点击下载
  • FlexMonkium5.1.1.zip, 下载完之后别忘记安装FlexMonkeyConsole v5.1.1,到此软件准备完毕。为缓解蜗牛速度,
  • 下方附件提供下载已上传至有道:
 
 
2012/7/30 23:23
 
 
3. FlexMonkium介绍.
    打开FlexMonkium5.1.1.zip,可以看到libs, flexmonkium.xpi, user-extensions.js, 到这里不得不讲到selenium, flexmonkium是selenium-IDE的一个插件, 以增加flex的录制功能, selenium-IDE是FireFox的插件, 安装完selenium-IDE与flexMonkium插件后可以看到如图所示:
 
flexMonkium作为selenium-IDE的插件, 装完后在selenium-IDE的右上方可以看到Monkey的图标, 第一次你需要配置,如图:
 
点击FlexMonkium, 弹出MonkeyConsole配置地址:
 
到此处FlexMonkium软件配置完成, 现在还是不能录制Flex页面, 此处需要加上monkey和adobe提供的类库,在FlasHBuilder编译参数里加上-locale en_US  -include-libraries "../lib/automation_monkey4.x.swc" "${flexlib}/libs/automation/automation_spark.swc" "${flexlib}/libs/automation/automation.swc" "${flexlib}/libs/automation/automation_agent.swc" "${flexlib}/libs/automation/automation_dmv.swc"
重新编译编译完成后, 用FireFox浏览, 此时你可以进行录制了.
 
    附件: 
    
 
以下是FlexMonkium 遇到的问题的解决方法.
    1.右键行为
        2.自定义组件的事件录制
        3.表格数据的验证
 
4.  FlexMonkium 录制鼠标右键行为.
    在这里特别提出录制鼠标右键行为, 因为默认monkey,是不录制鼠标右键的事件的, 顺着思路往下找, 有很多文章介绍自定义组件的事件的录制, 需要配的东西N多, 所以能避开就避开, 这里介绍一种方法, 经过研究发现, monkey封装了一个事件, 这个事件可以调用Flex页面的属性为public的方法,  在这里可以直接用, 比如你的页面在初始化的时候已经创建菜单 下面是例子: 
    
编译环境: FlashBuilder4.6  FlexMonkey5.1
 
 
1. 在录制的事件中在<UIEvent command="Select" value="test"><arg value="label1"/></UIEvent>之前加入 <CallFunctionMonkeyCommand value="wwwe" prop="automationName" functionName="show" />
即可解决问题.
 
2. 利用js调用函数
在需要调用函数的页面中加入ExternalInterface.addCallback("showRightClick", showRightClick);
扩展user-extensions.js    
在test方法里调用proc.getString("isCallFlexMethod", new String[] {"showRightClick", "", ""}))即可
 

自动化测试之flexmonkey-页面flex元素识别机制

目前,项目组在做功能自动化的时候使用flexmonkey5对flex元素进行识别。经过研究,Flexmonkey遵循着这样的识别准则:

一.默认识别:

1.automationName

2.id

3.monkeyID

二.使用其他属性对识别

具体来说,

1.当元素拥有automationName时,默认以automationName来识别一个元素,automationName可以不用指出;

2.没有automationName的情况下,使用id来识别元素;

3.在没有automationName以及id的情况下,使用monkeyID来识别,flexmonkey官方文档建议使用1与2两种方式来识别元素;

4.除了这三个属性以外,还可以使用其他属性来识别元素,要求此属性能唯一标志出该元素。

目前在项目中的实际使用中发现,flex元素的属性存在这样的情况:

1.大多数元素都拥有automationName和id,且automationName与id相同;

2.拥有automationName和id,二者值不同;

3.只拥有automationName或者Id其中之一;

4.没有automationName与id。这种情况下,自动产生monkeyID。

在项目中发现,在同一个parentowner下,存在多个automationName与id都一样的元素时,默认只能识别到第一个元素。这个时候,有两个途径来解决同类元素的识别:

1.使用monkeyID

2.使用其他属性对

现在首先介绍下如何使用monkeyID来识别,使用monkeyID几乎可以识别所有的flex元素。MonkeyID,在以前的版本中叫automationID,是使用automation tree来定位元素的。

MonkeyID的格式:automationowner.classname.number

解释一下,automationowner是父类的名字,classname是该元素的类名,number是该元素在父类下的序数值,默认从1开始,这个也可以从flexmonkey的最新产品看出来,monkeytalk与fonemonkey中,monkeyID的产生就是以#1开始,第一个同类元素是#1,第二个是#2,以此类推。

如果两个元素拥有同样的automationName和id,默认flexmonkey将以automationName来识别元素,这样就会出现识别不到的情况,在这个情况下,因为工具录制不能产生monkeyID,我们就需要手工编写脚本,按照monkeyID的格式,强制使用monkeyID来识别元素。

另外,如果元素有以上三个属性外的唯一属性值,也可以修改下录制的脚本,使用唯一属性值来识别元素。但是这里需要注意,flexmonkey只能使用一个属性对来识别元素,该工具还做不到使用多个属性对识别。

 
5.  FlexMonkium 录制Flex自定义组件.
    自定义组件的解决方法很多, Monkey不厚道, 只说override function get automationValue():Array方法, 不见效果, 加上如下方法
                        override public function getAutomationChildAt(index:int):IAutomationObject 
override public function get numAutomationChildren():int 
override public function getAutomationChildren():Array
即可
 
6. Flex dataGrid 多选
按住shif多选一下示例是选中1-3行
<UIEvent command="SelectIndex" value="dataGrid"><arg value="1"/><arg value="1"/><arg value="0"/></UIEvent>
<UIEvent command="SelectIndex" value="dataGrid"><arg value="3"/><arg value="1"/><arg value="2"/></UIEvent>
按住Ctrl 多选,选第一行和第三行
<UIEvent command="SelectIndex" value="dataGrid"><arg value="1"/><arg value="1"/><arg value="1"/></UIEvent>
<UIEvent command="SelectIndex" value="dataGrid"><arg value="3"/><arg value="1"/><arg value="1"/></UIEvent>
 
7. 取Alert值
<VerifyProperty value=\"Alert\" prop="className" propertyString=\"text\" expectedValue=\"核对的字符\" propertyType=\"equals\"/>
 
6. Flex验证
    这里介绍几个常用的标签:
 
    Verify

Verify Expression

VerifyProperty见验证表格所选中的第一行数据的属性的用法

    VerifyGrid获取某个cell用来验证某个cell的值 自己代码搞定吧
        <VerifyGrid  value=\"grid\" row=\"0\" col=\"1\"/>
 
    选中单元格第一行默认的录制没有提供, 得自己写代码
        <UIEvent command=\"SelectIndex\" value=\"grid\"><arg value=\"1 \"/></UIEvent>
 
    验证表格所选中的第一行数据的属性 这个也是要自己代码搞定
          proc.doCommand("getFlexMonkeyValue"
        <VerifyProperty value=\"grid\" propertyString=\"selectedItem.name\" expectedValue=\"w\" propertyType=\"equals\"/>
 
7.  FlexMonkium 结合selenium RC实现自动化.
        此时所有准备工作已全部完成, 这时你可以像使用Selenium-IDE一样.
录制完成后可以选择回放,可以导出JUNIT, 选择导出时需注意, 选择菜单
 
怎么自动化测试
1. 以上都准备就绪后, 打开网站录制操作, 录制完成后导出JUNIT生成java文件, 
 
2. 测试环境搭建: 
准备如下文件列表:
   JDK5
   selenium-server-standalone-2.24.1.jar
   user-extensions.js
   selenium-java-2.24.1.zip
准备测试服务器: windows环境,安装好JDK, linux需运行在窗口模式下, 还需装有firefox浏览器
编译及运行TestCase服务器: windows  或者 linux
3. 启动服务器:
启动selenium-server
输入: java -jar selenium-server-standalone-2.24.1.jar -userExtensions user-extensions.js
4. 测试端TestCase代码需注意的地方: 如下: 
 
Flexmonkey提供的简单的API介绍
1.验证属性
VerifyProperty 标签的使用:
例子:
 
if (proc.getBoolean("isFlexMonkey", new String[] {"<VerifyProperty value=\"grid\" propertyString=\"dataProvider.length\" expectedValue=\"1\" propertyType=\"equals\"/>"})) break; 
 
value: 界面UI中Flex 元素的ID.
propertyString: 界面UI中Flex 元素的属性.
expectedValue: 期望值.
propertyType: 对比类型.
2.验证表格
 
VerifyGrid标签的使用:
 assertEquals("err", "OK,w", proc.doCommand("getFlexMonkeyValue", new String[] {"<VerifyGrid  value=\"grid\" row=\"0\" col=\"1\"/>", ""}));
 
3. 提一下Selenium
在以上代码中用到两种Selenium提供的命令如下:
proc.getBoolean(String commandName, String[] args);
返回验证后的Boolean值.
proc.doCommand(String commandName, String[] args);
返回所定位的元素的String类型的值.
5. 现在你可以尽情的写你的前置条件里的数据, 和做完操作后断言所期望的值.
 
 
8. 关于半自动化
    

附录说明:

1.FlexMonkey官方文档官方网站很难打开,提供以下链接.

http://note.youdao.com/share/?id=a5a4881475b3864f459776fdea34d31d&type=note

2.扩展组件加入自动化测试:

http://www.infoq.com/cn/articles/flexmonkey-deep-dive

3. Selenium学习的文档
<selenium私房菜>
http://www.cnblogs.com/hyddd/archive/2009/05/30/1492536.html

4.Flex持续集成:

http://note.youdao.com/share/?id=e73ab7201fd66c637887bacf655a76dc&type=note

FlexMonkey实战的更多相关文章

  1. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  2. GitHub实战系列汇总篇

    基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...

  3. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  4. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  5. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  6. asp.net core 实战之 redis 负载均衡和"高可用"实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

  7. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

  8. Linux实战教学笔记07:Linux系统目录结构介绍

    第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...

  9. Linux实战教学笔记06:Linux系统基础优化

    第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...

随机推荐

  1. Picard Tools

    Picard Tools - By Broad Institute http://broadinstitute.github.io/picard/command-line-overview.html ...

  2. sigint sigterm 有什么区别啊

    SIGHUP     终止进程     终端线路挂断SIGINT     终止进程     中断进程SIGQUIT   建立CORE文件终止进程,并且生成core文件SIGILL   建立CORE文件 ...

  3. KBMMW 4.6 正式版发布

    喜大普奔迎新年! Merry Christmas! We are happy to announce the release of kbmMW v. 4.60.00 Professional and ...

  4. freeRadius与NetGear WNAP210的简使用

    1.下载安装freeRadius for win 2.2 2.配置client.cnf文件 加入 client 192.168.0.0/16{ secret=1111122222 shortname= ...

  5. ExtJS+SpringMVC文件上传与下载

    说到文件上传.下载功能,网络上大多介绍的是采用JSP.SpringMVC或者Struts等开源框架的功能,通过配置达到文件上传.下载的目地.可是最近项目要用到文件上传与下载的功能,因为本项目框架采用开 ...

  6. SQL 查找重复记录

    CREATE TABLE product( ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL, Pid INT NOT NULL, Pname VARCHAR(50) ...

  7. 三)mybatis 二级缓存,整合ehcache

    mybatis-config.xml <setting name="cacheEnabled" value="true" /> PersonMapp ...

  8. (网络流)ACM Computer Factory --POJ --3436

    链接: http://poj.org/problem?id=3436 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#probl ...

  9. Hdu1548 A strange lift 2017-01-17 10:34 35人阅读 评论(0) 收藏

    A strange lift Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Tota ...

  10. Java菜鸟学习笔记(23)--继承篇(二):继承与组合

    组合是什么 1.继承和组合都是一种随思想渗透而下的编码方式,其根本目的都是为了复用类,减少重复代码 2.要实现一个类的复用,可以分为组合语法和继承语法 3.组合就是通过将一个对象置于一个新类中,将其作 ...