ひよっこ。

I want to…

FlexAutomationAPIに関して

Posted by hikaruworld : 2009 9月 17

FlexAutomationAPIの説明がぐだぐだになったので、悔しいのでblogで補足していきます。

FlexAutomationAPIとは

FlexAutomationAPIとは、Flexフレームワークで提供されているAPIで
Flexコンポーネントに対するユーザ操作をオートメーションする事が可能になります(と、解釈しました)。

ただし、このAPIはFlexBuilderProfessionalが必須に成ります。
※standard版でも実行可能ですが、一回あたりのアクション数が30回に限定されています。
(リリースドキュメントに書いてあったんですが、探すに苦労しました…)

これは、FlexAutomationAPIを利用するのに必要なライブラリ

  • automation.swc — Flexコンポーネントの委譲クラス群
  • automation_dmv.swc — FlexチャーティングとAdavancedDataGrid用の委譲クラス群
  • automation_agent.swc — agentクラス

が通常のFlexSDKに含まれていないためです。

AutomationAPIで実現可能なこと

FlexAutomationAPIを用いると以下の事が実現可能だとヘルプには書いてあります。

  1. メトリック(Omniture) — Adobeが買収しましたが、要するに詳細なアクセス解析を提供します。
  2. 自動テスト(FlexMonkey & MerquryQTP) — 周知の通りユーザ操作をエミュレートしてGUIテストの自動化を行います。
  3. コブラウジング — 特にサンプルがあるわけではありませんが、リモートでのユーザ操作の同期などを可能とします。ここ辺り(PDF)が参考になるかと思います。

AutomationAPIのフロー

AutomationAPIはAutomationManagerの実行によって対象Flexコンポーネントを委譲する形で組み込まれます。
(正確にはAutomationManagerによってSystemManagerに対してADDEDイベントが登録され、
SystemManagerにADDされるタイミングで委譲クラスがインスタンス化され、
Automationの静的プロパティdelegateClassMapに追加されます。)

# AutomationManager自体はAPIドキュメントが存在せず、インターフェイスの
# IAutomationManager,IAutomationManager2のみしか参照できません
# このようにFlexAutomationAPI関連はAPIドキュメント上に表示されない@privateなものが多いようです。
# AutomationManagerは参照できませんがAutomationはソースが参照できますので直接のぞいてみるとよいでしょう。

この辺りはヘルプを参照して頂くと理解が進むと思います(以下の図を参照。Adobeのヘルプより)。

AutomationAPIのイベント伝播

AutomationAPIのイベント伝播

AutomationAPIの初期化処理

では、SystemManagerから始まる内部の初期化の流れを追ってみます。
以下の図は、SystemManagerから始まる処理の流れを図にしたものです。

AutomationAPI関連図

AutomationAPI関連図

  1. SystemManager内のdocFrameHandler()でMixinに指定されているクラスのinit()メソッドが呼び出されます
    (詳細は前記事Mixinを参照して下さい)。
  2. AutomationManager及び委譲クラス群はMixinに指定されているため、
    SystemManagerのmixin呼び出しを受けて、AutomationManagerと委譲クラス群の処理が実行されます。
  3. 2.のMixinにより各設定が行われた後、画面上に各コンポーネントの描画が行われます。
  4. Automation.delegateClassMapにマッピングされたオブジェクトは、
    ADDEDのタイミングで処理の委譲が行われることになるため、委譲先のイベントとしてRECORDがdispatchされます。
  5. エージェントはこの委譲クラス群(正確にはAutomationManagerより発生される)イベントをListenすることでそのイベント及びイベントのトリガとなったコンポーネントの情報を取得することが可能になります。

ここで注目したいのは2番目の処理になります。AutomationManager及び委譲クラス群の処理に関して、もう少し掘り下げてみます。

AutomationManagerの場合

init()メソッドでは、rootに対してADDEDイベントをListenするイベントハンドラ(childHandler())が定義されます。
これは、SystemManagerをrootする表示オブジェクトにコンポーネントが追加(Event.ADDED)されたときにdispatchされます。
childHandler()は、引数に渡されたコンポーネントから対応するAutomationクラスに定義された委譲クラスのインスタンス化を行い、
Automation.delegateClassMapにそのインスタンスを登録します。

委譲クラス群の場合

init()メソッドでは、Automation.registerDelegateClassを利用してAutomation.delegateClassMapに自身を登録します。
# ここでは自身を登録しているのみで、インスタンス化を行っているわけではありません。
# 委譲クラスのインスタンス化はAutomationManagerのchildHandlerによって行われます。

また、委譲クラスの持つイベント(つまり実体クラスと同様のイベント群)に対しイベントリスナが登録されます。
このイベントリスナは内部でAutomationManager.recordAutomatableEvent()を呼び出します。
# AutomationManager.recordAutomatableEvent()が実行されると、
# AutomationManagerクラスによってRecordEventがDispatchされます。

Automationクラスの場合

実クラスと委譲クラスのMapを保持するAutomationクラスは静的クラスとして設計されており、
初期のアクセス時に内部プロパティdelegateMapを初期化しその値を保持します。

    /**
     *  Registers the component class and delegate class association with Automation.
     * 
     *  @param compClass The component class. 
     * 
     *  @param delegateClass The delegate class associated with the component.
     */
    public static function registerDelegateClass(compClass:Class, delegateClass:Class):void
    {
        if (!delegateClassMap)
            delegateClassMap = {};

        var className:String = getQualifiedClassName(compClass);
        delegateClassMap[className] = delegateClass;
    }

これらの仕組みを組み込んだ上で、AutomationRecordEvent.RECORDをListenするように
エージェントクラスの実装を行う事になります。

この4.から5.の流れは、Flexのヘルプを参照していただくとわかりやすいと思います(Flexのヘルプから)。

エージェントへの操作フロー

エージェントへの操作フロー

次へ続く…

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。