一、术语定义:
Mixin元数据标签:主要作用是为应用程序初始化工作创建一个静态代码块,该代码块会在Flex程序运行的最初阶段调用,即SystemManager初始化完毕,而Application尚未初始化时调用。
执行[Mixin]元标签的类的
public static function init(fbs:IFlexModuleFactory):void
二、工作流程:
1、SystemManager初始化完毕后,都会调用所Mixin的Init方法。
在所有代理委托类中的都会有一段Mixin的Init方法,用于注册控件对应的代理类似
[Mixin]
/**
*
* Defines methods and properties required to perform instrumentation for the
* Button control.
*
* @see mx.controls.Button
*
*/
public class ButtonAutomationImpl extends UIComponentAutomationImpl
{
include "../../../core/Version.as";
//--------------------------------------------------------------------------
//
// Class methods
//
//--------------------------------------------------------------------------
/**
* Registers the delegate class for a component class with automation manager.
*
* @param root The SystemManger of the application.
*/
public static function init(root:DisplayObject):void
{
Automation.registerDelegateClass(Button, ButtonAutomationImpl);
}
2、SystemManager在加载每一个UIComponent的时候,都会触发Event.ADDED事件。
3、 AutomationManager也是元数据[Mixin]标识的。
AutomationManager的init方法中监听了Event.ADDED事件。
root.addEventListener(Event.ADDED,childAddedHandler, false, 0, true);
在childAddedHandler处理函数中,为每一个可视化控件都创建了一个委托实例,并把控件和委托类进行了关联(根据第一步的结果)。
Automation.delegateClassMap[componentClass] = Automation.delegateClassMap[className];
AutomationManager中包含重要的recordAutomatableEvent()方法,方法内部主要是创建并触发了AutomationRecordEvent.RECORD事件。当进行录制操作的时候会触发这个事件
4、以Button的Click事件举例:
A、 用户单击了Button钮,SystemManager会触发一个MouseEvent.CLICK事件
B、 ButtonAutomationImpl是Button控件的自动化委托类,委托类的构造函数中监听了Button钮的CLICK事件。
obj.addEventListener(MouseEvent.CLICK, clickHandler, false, EventPriority.DEFAULT+1, true);
/**
* Constructor.
* @param obj Button object to be automated.
*/
public function ButtonAutomationImpl(obj:Button)
{
super(obj);
obj.addEventListener(KeyboardEvent.KEY_UP, btnKeyUpHandler, false, EventPriority.DEFAULT+1, true);
obj.addEventListener(MouseEvent.CLICK, clickHandler, false, EventPriority.DEFAULT+1, true);
}
/**
* @private
* storage for the owner component
*/
protected function get btn():Button
{
return uiComponent as Button;
}
/**
* @private
*/
private var ignoreReplayableClick:Boolean;
//----------------------------------
// automationName
//----------------------------------
/**
* @private
*/
override public function get automationName():String
{
return btn.label || btn.toolTip || super.automationName;
}
//----------------------------------
// automationValue
//----------------------------------
/**
* @private
*/
override public function get automationValue():Array
{
return [ btn.label || btn.toolTip ];
}
/**
* @private
*/
protected function clickHandler(event:MouseEvent):void
{
if (!ignoreReplayableClick)
recordAutomatableEvent(event);
ignoreReplayableClick = false;
}
/**
* @private
*/
private function btnKeyUpHandler(event:KeyboardEvent):void
{
if (!btn.enabled)
return;
if (event.keyCode == Keyboard.SPACE)
{
// we need to ignore recording a click being dispatched here
ignoreReplayableClick = true;
recordAutomatableEvent(event);
}
}
C、 CLICK事件的处理函数clickHandler内部,调用了AutomationManager的recordAutomatableEvent方法,该方法又触发了AutomationRecordEvent.RECORD事件。
5、 MonkeyLink的init方法中对FlexMonkey和Flex Application通过LocalConnection进行了关联,并且监听了AutomationRecordEvent.RECORD事件。
MonkeyAutomationManager.instance.addEventListener(AutomationRecordEvent.RECORD, recordEventHandler, false, 0, true);
6、MonkeyLink捕获到了AutomationRecordEvent.RECORD事件,记录下了事件信息,并创建了UIEventMonkeyCommand命令。
public function recordEventHandler(event:AutomationRecordEvent):void {
var id:String;
var idProp:String;
var obj:IAutomationObject = event.automationObject;
var container:UIComponent = null;
idProp = "automationID";
id=MonkeyAutomationManager.instance.createID(obj).toString();
var uiEventCommand:UIEventMonkeyCommand = new UIEventMonkeyCommand();
uiEventCommand.value = id;
uiEventCommand.prop = idProp;
uiEventCommand.command = event.name;
uiEventCommand.args = event.args;
if (MonkeyAutomationState.monkeyAutomationState.state != MonkeyAutomationState.SNAPSHOT) {
FMHub.instance.dispatchEvent(new CommandRecordedEvent(uiEventCommand));
7、FlexMonkium The FlexMonkey/Selenium Bridge
中处理UIEventMonkeyCommand命令,生成XML之类似的
[Mixin]
public class FlexMonkium {
// I'm totally static. No need to instance me.
public function FlexMonkium() {
}
public static function init(root:DisplayObject):void {
var link:MonkeyLink; // Dummy reference to cause class to load
root.addEventListener(FlexEvent.APPLICATION_COMPLETE, function():void {
// If we're in MonkeyLink, the external interface will be available. In AirMonkey, it won't be.
if (ExternalInterface.available) {
ExternalInterface.addCallback("playFromSelenium", FlexMonkium.playFromSelenium);
ExternalInterface.addCallback("verifyFromSelenium", FlexMonkium.verifyFromSelenium);
ExternalInterface.addCallback("getForSelenium", FlexMonkium.getForSelenium);
ExternalInterface.addCallback("getCellForSelenium", FlexMonkium.getCellForSelenium);
AQAdapter.aqAdapter.beginRecording();
FMHub.instance.listen(CommandRecordedEvent.COMMAND_RECORDED, function(ev:CommandRecordedEvent):void {
sendToSelenium(ev.command);
}, this);
// FMHub.instance.listen(VerifyCreatedEvent.VERIFY_CREATED, function(ev:VerifyCreatedEvent):void {
// sendVerifyToSelenium(ev.verify);
// }, this);
if (ExternalInterface.available)
{
var js:String = 'function() {window["_Selenium_IDE_Recorder"].record("waitForFlexMonkey")}';
ExternalInterface.call(js);
} else {
trace(new Error("FlexMonkium: Unexpectedly found ExternalInterface to be unavailable").getStackTrace());
}
}
}, false, -1); // Set to -1 priority so that aqadapter can initialize first
}
static public function sendToSelenium(event:UIEventMonkeyCommand):void {
if (ExternalInterface.available) {
//trace("FlexMonkium: Send to selenium: " + event.xml.toXMLString());
var js:String = 'function(xml) {window["_Selenium_IDE_Recorder"].record("flexMonkey",xml)}';
ExternalInterface.call(js, XmlConversionFactory.encode(event, true).toXMLString());
} else {
trace(new Error("FlexMonkium: Unexpectedly found ExternalInterface to be unavailable").getStackTrace());
}
}
三、回放操作
/**
* @private
* Replays click interactions on the button.
* If the interaction was from the mouse,
* dispatches MOUSE_DOWN, MOUSE_UP, and CLICK.
* If interaction was from the keyboard,
* dispatches KEY_DOWN, KEY_UP.
* Button's KEY_UP handler then dispatches CLICK.
*
* @param event ReplayableClickEvent to replay.
*/
override public function replayAutomatableEvent(event:Event):Boolean
{
var help:IAutomationObjectHelper = Automation.automationObjectHelper;
if (event is MouseEvent && event.type == MouseEvent.CLICK)
return help.replayClick(uiComponent, MouseEvent(event));
else if (event is KeyboardEvent)
return help.replayKeyboardEvent(uiComponent, KeyboardEvent(event));
else
return super.replayAutomatableEvent(event);
}
分享到:
相关推荐
Adobe Flex 4.5 SDK 是一个重要的开发工具,主要用于构建富互联网应用程序(Rich Internet Applications,RIAs)。...而`automation_agent` 文件则暗示了Flex SDK还支持自动化测试,进一步完善了开发流程。
**基于Flex的OA管理系统** Flex是一种用于创建富互联网应用程序(RIA)的技术,它基于...同时,这也是一个很好的案例,展示了如何将Flex与数据库、工作流程和其他业务逻辑相结合,以满足企业的信息化需求。
【JAVA结合FLEX开发OA系统】是一个典型的前后端分离的开发模式,主要用于构建企业级的办公自动化(Office Automation,简称OA)系统。这种技术组合利用JAVA的后端处理能力和FLEX的前端展示效果,实现高效、用户友好...
在T-FLEX CAD软件平台上进行三维参数化设计,可以更有效地支持产品开发流程,特别是对于机械工程设计领域,包括中间导柱拉伸模具的设计,具有显著的应用价值。 T-FLEX CAD是由俄罗斯TopSystems Ltd.公司开发的一款...
本文将详细介绍这两个技术栈以及如何结合它们构建一个OA(Office Automation)系统。 Flex4是Adobe Flash Platform的一部分,主要用于创建丰富的互联网应用程序(RIA)。它提供了一个面向对象的ActionScript编程...
【Java Web SSH Flex OA系统】是一个基于Java技术栈开发的企业级办公自动化(Office Automation,简称OA)系统。该系统利用了Spring、Struts和Hibernate这三大框架(SSH框架)进行构建,结合Flex前端技术,提供了...
在"oa.rar_flex ssh oa_java oa_ssh权限管理"这个项目中,我们可以看到一个基于SSH技术构建的企业级应用,它涉及到了OA(Office Automation)系统的核心功能。 OA系统是一种自动化办公软件,用于提升企业内部的工作...
通过上述介绍,我们了解到使用QTP进行Flex自动化测试的基本流程和关键技术点。从安装必要的软件和插件,到配置Flex项目和编译程序,再到编写具体的测试脚本,每一步都至关重要。掌握这些技能对于提高Flex应用的测试...
与依赖Flex、Applet等技术的流程设计器不同,它无需额外安装插件,且采用纯JS脚本编写,便于维护和升级。 1.2 版本管理:在流程建模过程中,版本管理功能允许用户保存并管理历史版本,以便随时回溯和对比,适应流程...
但是,我可以提供关于SMC-Flex电机控制器的一般知识,以及罗克韦尔自动化(Rockwell Automation)和智能调节器(Smart Motor Control)的背景信息。 首先,SMC-Flex是罗克韦尔自动化旗下的一款先进的电机控制器产品,它...
OA(Office Automation)办公自动化系统是一种集成化的信息管理工具,它将组织内部的各种业务流程、信息交流、文档管理等融合在一起,提高工作效率,减少工作中的重复劳动,实现信息共享。开发一个OA信息服务软件,...
在技术应用方面,SITOP Flexi电源支持与西门子的SIMATIC产品系列如WinAC (Windows-based Automation Control) 配合使用。WinAC是一套基于Windows操作系统的自动化控制解决方案,集成了可编程逻辑控制器(PLC)的功能...
PowerFlex 40是一款由Rockwell Automation公司推出的变频器产品,主要用于工业自动化领域的电机控制。这款变频器设计精巧,适用于各种应用场合,如生产线、物料搬运系统以及各种机械设备的驱动控制。在了解PowerFlex...
此版本提供了强大的功能集合,包括代码编辑、调试、性能优化以及与Adobe Flex Framework的深度集成,从而简化了复杂应用的开发流程。 #### 二、系统需求 - **最低系统配置**:为了确保软件能够正常运行,开发者...
FPGA如Xilinx的XC系列和Altera的FLEX系列,CPLD如Altera的FLEX系列和Lattice的ispLSI系列,它们的逻辑门/等效门数范围广泛,满足不同复杂度的设计需求。FPGA在结构上由可编程逻辑单元、输入/输出单元和连线组成,...
- 支持的设备包括:ACEX1K系列、APEX20K系列、APEXII系列、FLEX6000系列、FLEX10K系列、MAX3000A系列、MAX7000系列、MAX9000系列;MAX7000/MAX3000等乘积项器件;MAXII系列、Cyclone系列、CycloneII、StratixII系列...
EDA技术,全称电子设计自动化(Electronic Design Automation),是计算机辅助设计在电子工程领域的重要应用。它主要用于芯片、集成电路和系统级电子产品的设计和验证。VHDL(VHSIC Hardware Description Language)...