文章来源: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. 从Adobe调查问卷看原型设计工具大战

    近年国内外原型设计工具新品频出,除了拥趸众多的老牌Axure在RP 8之后没有什么大的动作,大家都拼了命地在出新品.今天 inVision 的 Craft 出了 2.0 的预告视频,明天 Adobe ...

  2. CSS特效汇集

    http://www.lanrenzhijia.com/js/css3/ http://js.mobanwang.com/special/allcss/ 其他效果:http://www.cnblogs ...

  3. 2018.08.06 bzoj1503: [NOI2004]郁闷的出纳员(非旋treap)

    传送门 平衡树简单题. 直接用fhgtreap实现分裂和合并就没了. 代码: #include<bits/stdc++.h> #define N 100005 using namespac ...

  4. [转载][翻译]Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[2]

    Golang作为一个略古怪而新的语言,有自己一套特色和哲学.从其他语言转来的开发者在刚接触到的时候往往大吃苦头,我也不例外.这篇文章很细致地介绍了Golang的一些常见坑点,读完全篇中枪好多次.故将其 ...

  5. json&pickle

    用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进行转换Json模块提供了四个功能:dumps.du ...

  6. Java_得到GET和POST请求URL和参数列表

    一. 获取URL: getRequestURL()(还有个getRequestURI(),只取后面部分) 二. 获取参数列表: 1.getQueryString() 只适用于GET,比如客户端发送ht ...

  7. Sublime必用快捷键[私人]

    最近一年前端开发都是用sublime这款编辑器, 相对于webStorm强大而启动慢.editplus快启动而功能弱, sublime恰好在两者之间:而且其指令行安装.更新.卸载插件比eclipse之 ...

  8. Paper格式-国际会议版

    Paper Title 论文题目 Authors Name/s per 1st Affiliation (Author) 作者名字/s 每第一作者 line 1 (of Affiliation): d ...

  9. (KMP)剪花布条 -- hdu -- 2087

    http://acm.hdu.edu.cn/showproblem.php?pid=2087 剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory ...

  10. (字典树模板)统计难题--hdu--1251

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1251 在自己敲了一遍后终于懂了,这不就用了链表的知识来建立了树,对!就是这样的,然后再查找 代码: #i ...