カスタム コントロールのオートメーション サポートの実装

カスタム コントロールをテストする前に、カスタム コントロールの ActionScript でオートメーション サポート(オートメーションの委譲)を実装し、テスト アプリケーションにコンパイルします。

以下の手順では、Flex のカスタム Spinner コントロールを使用して、カスタム コントロールのオートメーション サポートの実装方法を示します。Spinner カスタム コントロールは、以下のグラフィックに示すように、2 つのボタンと 1 つのテキスト フィールドを含んでいます。

Flex カスタム コントロール

ユーザーは、Down をクリックしてテキスト フィールドに表示されている値を 1 減分させ、Up をクリックしてテキスト フィールドの値を 1 増分させることができます。

カスタム コントロールには、設定および取得が可能なパブリックの Value プロパティが用意されています。

  1. カスタム コントロールの ActionScript でオートメーション サポート(オートメーションの委譲)を実装します。 オートメーションの委譲の実装の詳細については、Adobe Live ドキュメント(http://livedocs.adobe.com/flex/3/html/help.html?content=functest_components2_14.html)を参照してください。 この例では、オートメーションの委譲によって、「increment」および「decrement」メソッドに対してサポートが追加されます。オートメーションの委譲のコード例は以下のとおりです。
    package customcontrols
    {
    	import flash.display.DisplayObject;
    	import mx.automation.Automation;
    	import customcontrols.SpinnerEvent;
    	import mx.automation.delegates.containers.BoxAutomationImpl;
    	import flash.events.Event;
    	import mx.automation.IAutomationObjectHelper;
    	import mx.events.FlexEvent;
    	import flash.events.IEventDispatcher;
    	import mx.preloaders.DownloadProgressBar;
    	import flash.events.MouseEvent;
    	import mx.core.EventPriority;
    	
    	[Mixin]
    	public class SpinnerAutomationDelegate extends BoxAutomationImpl
    	{
    		
    		public static function init(root:DisplayObject) : void {
    			// register delegate for the automation
    			Automation.registerDelegateClass(Spinner, SpinnerAutomationDelegate);
    		}   
    		
    		public function SpinnerAutomationDelegate(obj:Spinner) {
    			super(obj);
    			// listen to the events of interest (for recording)
    			obj.addEventListener(SpinnerEvent.DECREMENT, decrementHandler);
    			obj.addEventListener(SpinnerEvent.INCREMENT, incrementHandler);
    		}
    		
    		protected function decrementHandler(event : SpinnerEvent) : void {
    			recordAutomatableEvent(event);	
    		}
    		
    		protected function incrementHandler(event : SpinnerEvent) : void {
    			recordAutomatableEvent(event);
    		}
    		
    		protected function get spinner() : Spinner {
    			return uiComponent as Spinner;
    		}
    		
    		//----------------------------------
    		//  override functions
    		//----------------------------------
    		
    		override public function get automationValue():Array {
    			return [ spinner.Value.toString() ];
    		}
    		
    		private function replayClicks(button : IEventDispatcher, steps : int) : Boolean {
    			var helper : IAutomationObjectHelper = Automation.automationObjectHelper;
    			var result : Boolean;
    			for(var i:int; i < steps; i++) {
    				helper.replayClick(button);
    			}
    			return result;
    		}
    		
    		override public function replayAutomatableEvent(event:Event):Boolean {
    			
    			if(event is SpinnerEvent) {
    				var spinnerEvent : SpinnerEvent = event as SpinnerEvent;
    				if(event.type == SpinnerEvent.INCREMENT) {
    					return replayClicks(spinner.upButton, spinnerEvent.steps);
    				}
    				else if(event.type == SpinnerEvent.DECREMENT) {
    					return replayClicks(spinner.downButton, spinnerEvent.steps);
    				}
    				else {
    					return false;
    				}
    				
    			}
    			else {
    				return super.replayAutomatableEvent(event);
    			}
    		}
    		
    		// do not expose the child controls (i.e the buttons and the textfield) as individual controls 
    		override public function get numAutomationChildren():int {
    			return 0;
    		}	
    		
    	}
    }
  2. Open Agent にオートメーションの委譲を導入するために、カスタム コントロールを記述する XML ファイルを作成します。 クラス定義ファイルには、インストルメント化されたすべての Flex コンポーネントについての情報が含まれています。このファイルでは、記録中にイベントを送信でき、再生中にイベントを受け取ることができるコンポーネントについての情報が提供されます。クラス定義ファイルには、サポートされているプロパティの定義も含まれています。 Spinner カスタム コントロールの XML ファイルは以下のようになります。
    <?xml version="1.0" encoding="UTF-8"?>
    <TypeInformation>
    	<ClassInfo Name="FlexSpinner" Extends="FlexBox">
    		<Implementation
    			Class="customcontrols.Spinner" />
    		<Events>
    			<Event Name="Decrement">
    				<Implementation
    					Class="customcontrols.SpinnerEvent"
    					Type="decrement" />
    				<Property Name="steps">
    					<PropertyType Type="integer" />
    				</Property>
    			</Event>
    			<Event Name="Increment">
    				<Implementation
    					Class="customcontrols.SpinnerEvent"
    					Type="increment" />
    				<Property Name="steps">
    					<PropertyType Type="integer" />
    				</Property>
    			</Event>
    		</Events>
    		<Properties>
    			<Property Name="lowerBound" accessType="read">
    				<PropertyType Type="integer" />
    			</Property>
    			<Property Name="upperBound" accessType="read">
    				<PropertyType Type="integer" />
    			</Property>
    			<!-- expose read and write access for the Value property -->
    			<Property Name="Value" accessType="both">
    				<PropertyType Type="integer" />
    			</Property>
    			<Property Name="stepSize" accessType="read">
    				<PropertyType Type="integer" />
    			</Property>
    		</Properties>
    	</ClassInfo>
    </TypeInformation>
  3. サポートされている Flex コントロールのすべてのクラス、およびそのメソッドとプロパティを記述するすべての XML ファイルが格納されるフォルダに、カスタム コントロールの XML ファイルを配置します。 Silk Test には、サポートされている Flex コントロールのすべてのクラス、およびそのメソッドとプロパティを記述するいくつかの XML ファイルが含まれています。これらの XML ファイルは、<Silk Test_install_directory>\ng\agent\plugins\com.borland.fastxd.techdomain.flex.agent_<バージョン>\config\automationEnvironment フォルダにあります。 独自の XML ファイルを提供する場合は、XML ファイルをこのフォルダにコピーする必要があります。Open Agent が起動して、Apache Flex のサポートを初期化する場合、このディレクトリの内容が読み込まれます。 Flex の Spinner サンプル コントロールをテストするには、CustomControls.xml ファイルをこのフォルダにコピーする必要があります。Open Agent が現在実行されている場合は、ファイルをフォルダにコピーしたあと、Open Agent を再起動します。