`

FLEX Automation 流程

 
阅读更多

 

一、术语定义:

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);
    }
分享到:
评论

相关推荐

    Introducing Adobe Flex 4.5 SDK

    Adobe Flex 4.5 SDK 是一个重要的开发工具,主要用于构建富互联网应用程序(Rich Internet Applications,RIAs)。...而`automation_agent` 文件则暗示了Flex SDK还支持自动化测试,进一步完善了开发流程。

    基于Flex的 OA管理系统

    **基于Flex的OA管理系统** Flex是一种用于创建富互联网应用程序(RIA)的技术,它基于...同时,这也是一个很好的案例,展示了如何将Flex与数据库、工作流程和其他业务逻辑相结合,以满足企业的信息化需求。

    JAVA结合FLEX开发OA例子

    【JAVA结合FLEX开发OA系统】是一个典型的前后端分离的开发模式,主要用于构建企业级的办公自动化(Office Automation,简称OA)系统。这种技术组合利用JAVA的后端处理能力和FLEX的前端展示效果,实现高效、用户友好...

    基于T-FLEX的三维参数化拉伸模CAD的实践.pdf

    在T-FLEX CAD软件平台上进行三维参数化设计,可以更有效地支持产品开发流程,特别是对于机械工程设计领域,包括中间导柱拉伸模具的设计,具有显著的应用价值。 T-FLEX CAD是由俄罗斯TopSystems Ltd.公司开发的一款...

    flex4+ssh做的一个oa系统

    本文将详细介绍这两个技术栈以及如何结合它们构建一个OA(Office Automation)系统。 Flex4是Adobe Flash Platform的一部分,主要用于创建丰富的互联网应用程序(RIA)。它提供了一个面向对象的ActionScript编程...

    Java web ssh flex OA系统

    【Java Web SSH Flex OA系统】是一个基于Java技术栈开发的企业级办公自动化(Office Automation,简称OA)系统。该系统利用了Spring、Struts和Hibernate这三大框架(SSH框架)进行构建,结合Flex前端技术,提供了...

    oa.rar_flex ssh oa_java oa_ssh权限管理

    在"oa.rar_flex ssh oa_java oa_ssh权限管理"这个项目中,我们可以看到一个基于SSH技术构建的企业级应用,它涉及到了OA(Office Automation)系统的核心功能。 OA系统是一种自动化办公软件,用于提升企业内部的工作...

    QTPflash学习资料

    通过上述介绍,我们了解到使用QTP进行Flex自动化测试的基本流程和关键技术点。从安装必要的软件和插件,到配置Flex项目和编译程序,再到编写具体的测试脚本,每一步都至关重要。掌握这些技能对于提高Flex应用的测试...

    工作流引擎功能概要(OA系统).pdf

    与依赖Flex、Applet等技术的流程设计器不同,它无需额外安装插件,且采用纯JS脚本编写,便于维护和升级。 1.2 版本管理:在流程建模过程中,版本管理功能允许用户保存并管理历史版本,以便随时回溯和对比,适应流程...

    罗克韦尔1503E, 1560E 和1562E系列用户手册.pdf

    但是,我可以提供关于SMC-Flex电机控制器的一般知识,以及罗克韦尔自动化(Rockwell Automation)和智能调节器(Smart Motor Control)的背景信息。 首先,SMC-Flex是罗克韦尔自动化旗下的一款先进的电机控制器产品,它...

    一个OA办公信息服务的开发文档

    OA(Office Automation)办公自动化系统是一种集成化的信息管理工具,它将组织内部的各种业务流程、信息交流、文档管理等融合在一起,提高工作效率,减少工作中的重复劳动,实现信息共享。开发一个OA信息服务软件,...

    西门子SITOP Flexi电源—为更广泛的应用提供解决方案.pdf

    在技术应用方面,SITOP Flexi电源支持与西门子的SIMATIC产品系列如WinAC (Windows-based Automation Control) 配合使用。WinAC是一套基于Windows操作系统的自动化控制解决方案,集成了可编程逻辑控制器(PLC)的功能...

    PowerFlex 40.zip

    PowerFlex 40是一款由Rockwell Automation公司推出的变频器产品,主要用于工业自动化领域的电机控制。这款变频器设计精巧,适用于各种应用场合,如生产线、物料搬运系统以及各种机械设备的驱动控制。在了解PowerFlex...

    Adobe Flash Builder 4 Read Me

    此版本提供了强大的功能集合,包括代码编辑、调试、性能优化以及与Adobe Flex Framework的深度集成,从而简化了复杂应用的开发流程。 #### 二、系统需求 - **最低系统配置**:为了确保软件能够正常运行,开发者...

    EDA技术课后答案.pdf

    FPGA如Xilinx的XC系列和Altera的FLEX系列,CPLD如Altera的FLEX系列和Lattice的ispLSI系列,它们的逻辑门/等效门数范围广泛,满足不同复杂度的设计需求。FPGA在结构上由可编程逻辑单元、输入/输出单元和连线组成,...

    eda设计(二).pdf

    - 支持的设备包括:ACEX1K系列、APEX20K系列、APEXII系列、FLEX6000系列、FLEX10K系列、MAX3000A系列、MAX7000系列、MAX9000系列;MAX7000/MAX3000等乘积项器件;MAXII系列、Cyclone系列、CycloneII、StratixII系列...

    EDA技术(VHDL)试卷及答案.pdf

    EDA技术,全称电子设计自动化(Electronic Design Automation),是计算机辅助设计在电子工程领域的重要应用。它主要用于芯片、集成电路和系统级电子产品的设计和验证。VHDL(VHSIC Hardware Description Language)...

Global site tag (gtag.js) - Google Analytics