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

カスタム コントロールをテストする前に、カスタム コントロールの 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 を再起動します。
これで、カスタム コントロールを含むビジュアル テストまたはスクリプトを記録および再生できるようになりました。