<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Curl Global Community - Getting Started Plus]]></title>
		<link>https://communities.curl.com/</link>
		<description><![CDATA[Curl Global Community - https://communities.curl.com]]></description>
		<pubDate>Wed, 29 Apr 2026 12:08:53 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[BlueStacks]]></title>
			<link>https://communities.curl.com/showthread.php?tid=467</link>
			<pubDate>Fri, 13 Apr 2012 01:49:51 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=467</guid>
			<description><![CDATA[<img src="attachment.php?aid=308 width="300" height="300" alt="BlueStacks" " /> <br />
<br />
PC上でAndroidアプリを動作させる「<a href="http://bluestacks.com/" target="_blank" rel="noopener" class="mycode_url">BlueStacks</a>」の beta-1 が先日リリースされました。<br />
こちらの記事などに概要が載っています。<br />
<a href="http://japanese.engadget.com/2012/03/27/windows-android-bluestacks-app-player-gpu-arm/" target="_blank" rel="noopener" class="mycode_url">http://japanese.engadget.com/2012/03/27/...r-gpu-arm/</a> <br />
<br />
ためしにCaedeアプリを動かしてみました。<br />
<img src="attachment.php?aid=307 width="300" height="300" alt="BlueStacks" " /> <br />
<br />
<br />
beta-1 ということで若干不安定な場面や、画面がLandscapeにしか対応していない等の制限がありますが<br />
概ね問題なく動作しました。動作速度についても、公式のエミュレーターよりもかなり軽快に感じられます。<br />
<br />
BlueStacksへのAndroidアプリのインストールは、マーケットからできる他、apkファイルの右クリックメニューからも可能です。<br />
(BlueStacksをインストールするとapkファイルに関連付けされてしまうようですのでご注意を)<br />
<br />
<br />
興味のある方は試してみる価値ありです。<br />
<br />
<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=308" target="_blank" title="">bluestacks2.jpg</a> (Size: 379.18 KB / Downloads: 4152)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=307" target="_blank" title="">bluestacks.jpg</a> (Size: 320.74 KB / Downloads: 4197)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<img src="attachment.php?aid=308 width="300" height="300" alt="BlueStacks" " /> <br />
<br />
PC上でAndroidアプリを動作させる「<a href="http://bluestacks.com/" target="_blank" rel="noopener" class="mycode_url">BlueStacks</a>」の beta-1 が先日リリースされました。<br />
こちらの記事などに概要が載っています。<br />
<a href="http://japanese.engadget.com/2012/03/27/windows-android-bluestacks-app-player-gpu-arm/" target="_blank" rel="noopener" class="mycode_url">http://japanese.engadget.com/2012/03/27/...r-gpu-arm/</a> <br />
<br />
ためしにCaedeアプリを動かしてみました。<br />
<img src="attachment.php?aid=307 width="300" height="300" alt="BlueStacks" " /> <br />
<br />
<br />
beta-1 ということで若干不安定な場面や、画面がLandscapeにしか対応していない等の制限がありますが<br />
概ね問題なく動作しました。動作速度についても、公式のエミュレーターよりもかなり軽快に感じられます。<br />
<br />
BlueStacksへのAndroidアプリのインストールは、マーケットからできる他、apkファイルの右クリックメニューからも可能です。<br />
(BlueStacksをインストールするとapkファイルに関連付けされてしまうようですのでご注意を)<br />
<br />
<br />
興味のある方は試してみる価値ありです。<br />
<br />
<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=308" target="_blank" title="">bluestacks2.jpg</a> (Size: 379.18 KB / Downloads: 4152)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=307" target="_blank" title="">bluestacks.jpg</a> (Size: 320.74 KB / Downloads: 4197)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Ghotap、GPSとGoogleMapとイメージを連動させたアプリを作ってみた]]></title>
			<link>https://communities.curl.com/showthread.php?tid=464</link>
			<pubDate>Fri, 06 Apr 2012 13:05:21 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=464</guid>
			<description><![CDATA[caedeのベータ版がリリースされ、ある程度機能がそろいましたので、使ってみたくなりました。そして、写真とかGPSとかスマホを持つ人は大体使うもので、面白そうなので、caedeのAPIで簡単にできそうと言う切っ掛けで、コーディングしてみました。<br />
<br />
アプリ名はGhotapにした理由は自分もよくわかりません。どうでもいいですが、この小ボーイなアプリをコーディングしている間に頭の中で浮かんだアプリ名の解釈は二つありました：　<br />
1．GHOst ＋ TAP　<br />
2．Google HOT ｍAP<br />
どうでもいい話でした...<br />
<br />
さて、この簡単アプリの主な機能は、標準のカメラ機能にGPSの設定がOFFにしても、<br />
保存した画像とリンクしているGPS情報が保存されます（もちろん、GPS自体の設定は使用禁止になると駄目）。<br />
<br />
さて、本番（と言えるかな？）のアプリを0.01版を作成しましたので、動作イメージと簡単な説明をさして頂きます。<br />
１．メイン画面。<br />
<img src="attachment.php?aid=300 alt="caede gps camera" " /> <br />
２．カメラ画面、ここで写真を撮る。<br />
<img src="attachment.php?aid=301 alt="caede gps camera" " /> <br />
<br />
３．下の右側のボタン「PhotoMap」をタップすると、さっき保存された写真を選べたら、どこで撮った写真かGoogleMapで表示されます。<br />
<img src="attachment.php?aid=302 alt="caede gps camera" " /> <br />
<br />
４．とった写真の位置をGoogleMap上で表示させる。<br />
<img src="attachment.php?aid=303 alt="caede gps camera" " /><br />
<br />
最後はソースコードです、ここからDLできます：<br />
<a href="http://developers.curlap.com/curl/caede/samples/ghotap.zip" target="_blank" rel="noopener" class="mycode_url">http://developers.curlap.com/curl/caede/...ghotap.zip</a><br />
<br />
ダウンロード後、解凍する時に、パスワードとして“curl“と半角４文字を入力してください。<br />
<br />
これだけの機能ではおそらく誰も使わないでしょう...。また、改善・拡張版を作成して、記事にします！そのころにはAndroid Playで一般ダウンロードできるぐらいのものにしていたいです。<br />
<br />
ただ一つのご注意：<br />
このアプリ経由で撮った写真は写真ファイル自体にGPS情報が入っておりません、また、このアプリ経由せずに、普通にスマホのカメラを直接起動して撮った写真は、このアプリでは位置情報を持たない為、地図上に場所を示せません。<br />
<br />
<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=300" target="_blank" title="">写真 1.JPG</a> (Size: 49.99 KB / Downloads: 2317)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=301" target="_blank" title="">写真 2.JPG</a> (Size: 57.35 KB / Downloads: 2609)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=302" target="_blank" title="">写真 3.JPG</a> (Size: 42.11 KB / Downloads: 2211)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=303" target="_blank" title="">写真 4.JPG</a> (Size: 44.69 KB / Downloads: 2209)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[caedeのベータ版がリリースされ、ある程度機能がそろいましたので、使ってみたくなりました。そして、写真とかGPSとかスマホを持つ人は大体使うもので、面白そうなので、caedeのAPIで簡単にできそうと言う切っ掛けで、コーディングしてみました。<br />
<br />
アプリ名はGhotapにした理由は自分もよくわかりません。どうでもいいですが、この小ボーイなアプリをコーディングしている間に頭の中で浮かんだアプリ名の解釈は二つありました：　<br />
1．GHOst ＋ TAP　<br />
2．Google HOT ｍAP<br />
どうでもいい話でした...<br />
<br />
さて、この簡単アプリの主な機能は、標準のカメラ機能にGPSの設定がOFFにしても、<br />
保存した画像とリンクしているGPS情報が保存されます（もちろん、GPS自体の設定は使用禁止になると駄目）。<br />
<br />
さて、本番（と言えるかな？）のアプリを0.01版を作成しましたので、動作イメージと簡単な説明をさして頂きます。<br />
１．メイン画面。<br />
<img src="attachment.php?aid=300 alt="caede gps camera" " /> <br />
２．カメラ画面、ここで写真を撮る。<br />
<img src="attachment.php?aid=301 alt="caede gps camera" " /> <br />
<br />
３．下の右側のボタン「PhotoMap」をタップすると、さっき保存された写真を選べたら、どこで撮った写真かGoogleMapで表示されます。<br />
<img src="attachment.php?aid=302 alt="caede gps camera" " /> <br />
<br />
４．とった写真の位置をGoogleMap上で表示させる。<br />
<img src="attachment.php?aid=303 alt="caede gps camera" " /><br />
<br />
最後はソースコードです、ここからDLできます：<br />
<a href="http://developers.curlap.com/curl/caede/samples/ghotap.zip" target="_blank" rel="noopener" class="mycode_url">http://developers.curlap.com/curl/caede/...ghotap.zip</a><br />
<br />
ダウンロード後、解凍する時に、パスワードとして“curl“と半角４文字を入力してください。<br />
<br />
これだけの機能ではおそらく誰も使わないでしょう...。また、改善・拡張版を作成して、記事にします！そのころにはAndroid Playで一般ダウンロードできるぐらいのものにしていたいです。<br />
<br />
ただ一つのご注意：<br />
このアプリ経由で撮った写真は写真ファイル自体にGPS情報が入っておりません、また、このアプリ経由せずに、普通にスマホのカメラを直接起動して撮った写真は、このアプリでは位置情報を持たない為、地図上に場所を示せません。<br />
<br />
<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=300" target="_blank" title="">写真 1.JPG</a> (Size: 49.99 KB / Downloads: 2317)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=301" target="_blank" title="">写真 2.JPG</a> (Size: 57.35 KB / Downloads: 2609)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=302" target="_blank" title="">写真 3.JPG</a> (Size: 42.11 KB / Downloads: 2211)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=303" target="_blank" title="">写真 4.JPG</a> (Size: 44.69 KB / Downloads: 2209)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[PhoneGap（Apache Cordova1.5）+]]></title>
			<link>https://communities.curl.com/showthread.php?tid=436</link>
			<pubDate>Wed, 14 Mar 2012 05:15:53 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=436</guid>
			<description><![CDATA[Curlのモバイル開発環境「<a href="http://caede.curl.com" target="_blank" rel="noopener" class="mycode_url">Caede</a>」と同様のアーキテクチャ「ハイブリッド方式」である<a href="http://phonegap.com/" target="_blank" rel="noopener" class="mycode_url">PhoneGap</a> を触ってみました。<br />
<br />
※ハイブリッド方式とは、ネイティブアプリの中に組み込まれたWebブラウザ機能を利用して、HTML/JavaScript/CSSで開発ができ（我々の製品の場合は、Curl言語のみ）、さらにネイティブ機能へもアクセスできる方式です。これによって、AndroidならJava、iOSならObjective-Cでというように別の言語で開発する必要がなくなります。<br />
<br />
<br />
現在PhoneGapはAdobeに買収され、Apache Software Foundationへソースを寄贈されたようです。また、Apache Cordovaに名前も変更されたようです。（途中、Apache Callbackという名前になったときもあったようですが。）<br />
（2012年3月時点ではバージョン1.5）<br />
<br />
さっそく、AndroidでPhoneGapのGetting Startedをやってみたいと思います。<br />
<br />
基本的には以下の操作をすればいいはずです。<br />
<a href="http://phonegap.com/start#android" target="_blank" rel="noopener" class="mycode_url">http://phonegap.com/start#android</a><br />
<br />
と思いきや、まだ最新の1.5用には書き換えていないみたいですね。<br />
<br />
まず、以下のファイル名が変更されているようです。<ul class="mycode_list"><li>phonegap.js =&gt; cordova-1.5.0.js<br />
</li>
<li>phonegap.jar =&gt; cordova-1.5.0.jar<br />
</li>
</ul>
また、AndroidManifest.xmlの「android:icon="@drawable/icon"」を、「android:icon="@drawable/ic_launcher"」に変更しなければならないようです。 <br />
<br />
さらに、記載はされていませんがxmlディレクトリをresディレクトリ配下に作成して、<br />
cordova.xmlとplugins.xmlをコピーしないと以下のExceptionでクラッシュしてしまった。<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>java.lang.RuntimeException: Unable to start activityComponentInfo{com.curl.lab.phonegap/com.curl.lab.phonegap.HelloActivity}:<br />
android.content.res.Resources&#36;NotFoundException: Resource ID #0x0<br />
....</code></div></div><br />
パッケージもcom.phonegapからorg.apache.cordovaに変わっているので注意を！例えば以下のようなコードになります。<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>import org.apache.cordova.DroidGap;<br />
mport android.os.Bundle;<br />
<br />
public class HelloActivity extends DroidGap {<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void onCreate(Bundle savedInstanceState) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.onCreate(savedInstanceState);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.loadUrl("file:///android_asset/www/index.html");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</code></div></div><br />
<br />
これで実行したら、無事うまく動きました。<br />
<br />
ちょっと手順が多いですが、現在我々のCurlモバイル開発ツール「<a href="http://caede.curl.com" target="_blank" rel="noopener" class="mycode_url">Caede</a>」も類似の手順なので、次のバージョンではもっとシンプルにセットアップやプロジェクト作成ができるよう心がけたいと思います。（現在開発中）<br />
<br />
さらにGPSのAPIも簡単に試してみました。これもちゃんと動きました。<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>navigator.geolocation.getCurrentPosition(<br />
&nbsp;&nbsp; function (position) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var c = position.coords;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Latitude:' + c.latitude + 'Longitude:' + c.longitude);<br />
&nbsp;&nbsp; },<br />
&nbsp;&nbsp; function (error) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(JSON.stringify(error));<br />
&nbsp;&nbsp; }<br />
);</code></div></div><br />
<img src="attachment.php?aid=255 width="300" height="300" alt="Curl Facebook page" " /> <br />
<br />
これだけでは面白くないので、趣味でJavaScriptのゲームエンジン<a href="http://enchantjs.com" target="_blank" rel="noopener" class="mycode_url">enchant.js</a> を使って、Android上でゲームを動かしてみました。ダウンロードしたファイルにサンプルがありましたので、それを上記PhoneGapのプロジェクトにコピーしました。<br />
<br />
<img src="attachment.php?aid=257 width="300" height="300" alt="Curl Facebook page" " /> <br />
（見づらいですが、画面上の方でクマが走っています。）<br />
とりあえずは上記のサンプルを添付しておきます。（手元にあるAndroid4.0の実機で確認しました。）<br />
<br />
ちなみに、終わった後気付いたのですが、こっちにApache Cordovaのサイトがありました。<br />
<a href="http://incubator.apache.org/cordova/" target="_blank" rel="noopener" class="mycode_url">http://incubator.apache.org/cordova/</a><br />
<br />
<br />
<br />
触ってみた結果、コンセプト通り、HTML/CSS/JavaScriptを知っている方にとっては、なじみやすいと思います。<br />
これに、<a href="http://www.sencha.com/" target="_blank" rel="noopener" class="mycode_url">Sencha</a> や<a href="http://jquerymobile.com/" target="_blank" rel="noopener" class="mycode_url">jQuery Mobile</a> などを学習すれば、モバイル用UIが開発できます。ただ、jQuery Mobileは触ってみた感じですとちょっとクセがあるように感じます。それはまた違う回で紹介したいと思います。<br />
<br />
<br />
ちなみに、「<a href="http://caede.curl.com" target="_blank" rel="noopener" class="mycode_url">Caede</a>」は<a href="http://www.curl.com" target="_blank" rel="noopener" class="mycode_url">Curl言語</a>のみで「UI、スタイル、ロジック」のすべてをコーディングすることが可能となっています。また、Curlでモバイルアプリのみならず、デスクトップ上のリッチクライアント・アプリまで開発が可能です。これをいかに学習コストを下げて開発することができるようになることを目指して製品開発をしています。<br />
<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=255" target="_blank" title="">device-2012-03-14-133320.png</a> (Size: 39.26 KB / Downloads: 3843)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=256" target="_blank" title="">device-2012-03-14-133325.png</a> (Size: 39.26 KB / Downloads: 1316)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=257" target="_blank" title="">device-2012-03-14-134446.png</a> (Size: 21.01 KB / Downloads: 3371)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/zip.gif" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=258" target="_blank" title="">hello-phonegap.zip</a> (Size: 227.17 KB / Downloads: 1214)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Curlのモバイル開発環境「<a href="http://caede.curl.com" target="_blank" rel="noopener" class="mycode_url">Caede</a>」と同様のアーキテクチャ「ハイブリッド方式」である<a href="http://phonegap.com/" target="_blank" rel="noopener" class="mycode_url">PhoneGap</a> を触ってみました。<br />
<br />
※ハイブリッド方式とは、ネイティブアプリの中に組み込まれたWebブラウザ機能を利用して、HTML/JavaScript/CSSで開発ができ（我々の製品の場合は、Curl言語のみ）、さらにネイティブ機能へもアクセスできる方式です。これによって、AndroidならJava、iOSならObjective-Cでというように別の言語で開発する必要がなくなります。<br />
<br />
<br />
現在PhoneGapはAdobeに買収され、Apache Software Foundationへソースを寄贈されたようです。また、Apache Cordovaに名前も変更されたようです。（途中、Apache Callbackという名前になったときもあったようですが。）<br />
（2012年3月時点ではバージョン1.5）<br />
<br />
さっそく、AndroidでPhoneGapのGetting Startedをやってみたいと思います。<br />
<br />
基本的には以下の操作をすればいいはずです。<br />
<a href="http://phonegap.com/start#android" target="_blank" rel="noopener" class="mycode_url">http://phonegap.com/start#android</a><br />
<br />
と思いきや、まだ最新の1.5用には書き換えていないみたいですね。<br />
<br />
まず、以下のファイル名が変更されているようです。<ul class="mycode_list"><li>phonegap.js =&gt; cordova-1.5.0.js<br />
</li>
<li>phonegap.jar =&gt; cordova-1.5.0.jar<br />
</li>
</ul>
また、AndroidManifest.xmlの「android:icon="@drawable/icon"」を、「android:icon="@drawable/ic_launcher"」に変更しなければならないようです。 <br />
<br />
さらに、記載はされていませんがxmlディレクトリをresディレクトリ配下に作成して、<br />
cordova.xmlとplugins.xmlをコピーしないと以下のExceptionでクラッシュしてしまった。<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>java.lang.RuntimeException: Unable to start activityComponentInfo{com.curl.lab.phonegap/com.curl.lab.phonegap.HelloActivity}:<br />
android.content.res.Resources&#36;NotFoundException: Resource ID #0x0<br />
....</code></div></div><br />
パッケージもcom.phonegapからorg.apache.cordovaに変わっているので注意を！例えば以下のようなコードになります。<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>import org.apache.cordova.DroidGap;<br />
mport android.os.Bundle;<br />
<br />
public class HelloActivity extends DroidGap {<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void onCreate(Bundle savedInstanceState) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.onCreate(savedInstanceState);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.loadUrl("file:///android_asset/www/index.html");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</code></div></div><br />
<br />
これで実行したら、無事うまく動きました。<br />
<br />
ちょっと手順が多いですが、現在我々のCurlモバイル開発ツール「<a href="http://caede.curl.com" target="_blank" rel="noopener" class="mycode_url">Caede</a>」も類似の手順なので、次のバージョンではもっとシンプルにセットアップやプロジェクト作成ができるよう心がけたいと思います。（現在開発中）<br />
<br />
さらにGPSのAPIも簡単に試してみました。これもちゃんと動きました。<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>navigator.geolocation.getCurrentPosition(<br />
&nbsp;&nbsp; function (position) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var c = position.coords;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Latitude:' + c.latitude + 'Longitude:' + c.longitude);<br />
&nbsp;&nbsp; },<br />
&nbsp;&nbsp; function (error) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(JSON.stringify(error));<br />
&nbsp;&nbsp; }<br />
);</code></div></div><br />
<img src="attachment.php?aid=255 width="300" height="300" alt="Curl Facebook page" " /> <br />
<br />
これだけでは面白くないので、趣味でJavaScriptのゲームエンジン<a href="http://enchantjs.com" target="_blank" rel="noopener" class="mycode_url">enchant.js</a> を使って、Android上でゲームを動かしてみました。ダウンロードしたファイルにサンプルがありましたので、それを上記PhoneGapのプロジェクトにコピーしました。<br />
<br />
<img src="attachment.php?aid=257 width="300" height="300" alt="Curl Facebook page" " /> <br />
（見づらいですが、画面上の方でクマが走っています。）<br />
とりあえずは上記のサンプルを添付しておきます。（手元にあるAndroid4.0の実機で確認しました。）<br />
<br />
ちなみに、終わった後気付いたのですが、こっちにApache Cordovaのサイトがありました。<br />
<a href="http://incubator.apache.org/cordova/" target="_blank" rel="noopener" class="mycode_url">http://incubator.apache.org/cordova/</a><br />
<br />
<br />
<br />
触ってみた結果、コンセプト通り、HTML/CSS/JavaScriptを知っている方にとっては、なじみやすいと思います。<br />
これに、<a href="http://www.sencha.com/" target="_blank" rel="noopener" class="mycode_url">Sencha</a> や<a href="http://jquerymobile.com/" target="_blank" rel="noopener" class="mycode_url">jQuery Mobile</a> などを学習すれば、モバイル用UIが開発できます。ただ、jQuery Mobileは触ってみた感じですとちょっとクセがあるように感じます。それはまた違う回で紹介したいと思います。<br />
<br />
<br />
ちなみに、「<a href="http://caede.curl.com" target="_blank" rel="noopener" class="mycode_url">Caede</a>」は<a href="http://www.curl.com" target="_blank" rel="noopener" class="mycode_url">Curl言語</a>のみで「UI、スタイル、ロジック」のすべてをコーディングすることが可能となっています。また、Curlでモバイルアプリのみならず、デスクトップ上のリッチクライアント・アプリまで開発が可能です。これをいかに学習コストを下げて開発することができるようになることを目指して製品開発をしています。<br />
<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=255" target="_blank" title="">device-2012-03-14-133320.png</a> (Size: 39.26 KB / Downloads: 3843)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=256" target="_blank" title="">device-2012-03-14-133325.png</a> (Size: 39.26 KB / Downloads: 1316)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/image.gif" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=257" target="_blank" title="">device-2012-03-14-134446.png</a> (Size: 21.01 KB / Downloads: 3371)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/zip.gif" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=258" target="_blank" title="">hello-phonegap.zip</a> (Size: 227.17 KB / Downloads: 1214)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[WindowTester Pro入門+++]]></title>
			<link>https://communities.curl.com/showthread.php?tid=434</link>
			<pubDate>Tue, 13 Mar 2012 11:01:30 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=434</guid>
			<description><![CDATA[以前、Window Tester Proを使って、我々の製品である<a href="http://www.curl.com" target="_blank" rel="noopener" class="mycode_url">Curl</a> のIDEテスト自動化に適用できるかの検証をやってみましたので、<a href="http://www.infoq.com/jp/news/2012/03/WindowTester-Pro;jsessionid=3AFA5D6D138D193D62AF60C653AE3E66" target="_blank" rel="noopener" class="mycode_url">GoogleがWindowTester Proをオープンソース化</a>というニュースが最近出て、少し「あれっ？」と思いました。なぜかと言うと、googleのこの決定は2010年12月に出たので、ちょっと違和感（いまだに？）がある気がしました。が、ネットでうろうろしたら、あっ、オープンソース後の初めてのリリースがこのニュースのきっかけかと気づき納得しました。Windows Tester Proを検証する時に手掛かりが少なく、その時にもしオープンソース版が出たら、ぶつかった壁がもう少し和らいだかもしれません（笑）。<br />
しかし、先ほど<a href="http://code.google.com/javadevtools/wintester/html/whatsnew.html" target="_blank" rel="noopener" class="mycode_url">Window Tester Proの本家</a> に行ってよく確認してみたら、Whats's newを読んでも、別に新しい機能なり、バグ修正なりの情報が全くありませんでした。あれれ、この<a href="http://google-opensource.blogspot.com/2012/03/announcing-windowtester-open-source.html" target="_blank" rel="noopener" class="mycode_url">オープンソース後の初期リリース</a> は何の為だった？バージョンを5.1から6.0に挙げただけ？数か月前に検証した状態と変わってないじゃん、なぞなぞですね...。<br />
<br />
<div style="text-align: left;" class="mycode_align">さて、この日本ではあまりなじみのないツールをせっかく検証しましたので、ちょっと古くなったところがあるかもしれませんが（先ほどの確認によると、この可能性もあまりないですね）、ご参考になる方もいるかもしれませんので、情報をみなさんとシェアしたいと思います。</div>
<br />
<div style="text-align: left;" class="mycode_align">Window Tester Proを利用したい方は、ここのサイトから最新のコードを入手してください：</div>
<div style="text-align: left;" class="mycode_align"> <a href="http://code.google.com/javadevtools/download-wintester.html" target="_blank" rel="noopener" class="mycode_url">http://code.google.com/javadevtools/down...ester.html</a></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">目次</span></div><ul class="mycode_list"><li>1　<span style="color: #552200;" class="mycode_color">概要</span></li>
<li>2　<span style="color: #552200;" class="mycode_color">開発元</span></li>
<li>3　<span style="color: #552200;" class="mycode_color">セットアップ</span></li>
<li>3.1　<span style="color: #552200;" class="mycode_color">Eclipse </span><span style="color: #552200;" class="mycode_color">のインストール（検証はEclipse3.6.2</span><span style="color: #552200;" class="mycode_color">を利用する）。</span></li>
<li>4　<span style="color: #552200;" class="mycode_color">制限事項</span></li>
<li>4.1　<span style="color: #552200;" class="mycode_color">言語サポート</span></li>
<li>4.2　<span style="color: #552200;" class="mycode_color">プラットフォーム制限</span></li>
<li>4.3　<span style="color: #552200;" class="mycode_color">OS</span><span style="color: #552200;" class="mycode_color">の制限</span></li>
<li>5　<span style="color: #552200;" class="mycode_color">利用方法</span></li>
<li>5.1　<span style="color: #552200;" class="mycode_color">記録機能の設定</span></li>
<li>5.2<span style="color: #552200;" class="mycode_color">　CDE</span><span style="color: #552200;" class="mycode_color">テスト時の注意点</span></li>
<li>5.3　<span style="color: #552200;" class="mycode_color">記録問題</span></li>
<li>5.3.1　<span style="color: #552200;" class="mycode_color">Curl</span><span style="color: #552200;" class="mycode_color">側の記録ができない</span></li>
<li>5.3.2　<span style="color: #552200;" class="mycode_color">Drag&amp;Drop</span><span style="color: #552200;" class="mycode_color">が正しく記録できないケースがある</span></li>
<li>5.3.3　<span style="color: #552200;" class="mycode_color">記録漏れがある</span></li>
<li>5.3.4　<span style="color: #552200;" class="mycode_color">ご操作などによって余計な操作を記録される場合がある</span></li>
<li>5.3.5　<span style="color: #552200;" class="mycode_color">ロケールの問題</span></li>
<li>5.3.6　<span style="color: #552200;" class="mycode_color">記録コードが実行できない場合がある（文法エラー）</span></li>
<li>5.4　<span style="color: #552200;" class="mycode_color">検証条件の追加</span></li>
<li>5.4.1　<span style="color: #552200;" class="mycode_color">Assertion Inspector</span><span style="color: #552200;" class="mycode_color">の使用</span></li>
<li>5.4.2　<span style="color: #552200;" class="mycode_color">検証の詳細</span></li>
<li>5.4.2.1　<span style="color: #552200;" class="mycode_color">検証条件</span></li>
<li>5.4.2.2　<span style="color: #552200;" class="mycode_color">普通のUI</span><span style="color: #552200;" class="mycode_color">部品の属性検証(</span><span style="color: #552200;" class="mycode_color">使用可否・テキスト・選択・可視性・フォーカス)</span></li>
<li>5.4.2.3　<span style="color: #552200;" class="mycode_color">検証用ファクトリ</span></li>
<li>5.4.2.4　<span style="color: #552200;" class="mycode_color">条件確保</span></li>
<li>5.4.2.5　<span style="color: #552200;" class="mycode_color">手動で条件検証を作成する</span></li>
<li>5.4.3　<span style="color: #552200;" class="mycode_color">条件と条件ハンドラー</span></li>
<li>5.4.3.1　<span style="color: #552200;" class="mycode_color">条件</span></li>
<li>5.4.3.2　<span style="color: #552200;" class="mycode_color">ハンドラー</span></li>
<li>5.5　<span style="color: #552200;" class="mycode_color">再生時の問題</span></li>
<li>5.5.1　<span style="color: #552200;" class="mycode_color">Java</span><span style="color: #552200;" class="mycode_color">のUI</span><span style="color: #552200;" class="mycode_color">でも、再生する時に、停止されている場合がある</span></li>
<li>5.5.2　<span style="color: #552200;" class="mycode_color">記録した入力が記録時と異なるコードが再生されてしまう</span></li>
<li>5.6<span style="color: #552200;" class="mycode_color">　Welcome</span><span style="color: #552200;" class="mycode_color">ページのテスト</span></li>
<li>5.7　<span style="color: #552200;" class="mycode_color">UI</span><span style="color: #552200;" class="mycode_color">部品の特定方法</span></li>
<li>5.7.1　<span style="color: #552200;" class="mycode_color">Matcher</span><span style="color: #552200;" class="mycode_color">とLocator</span></li>
<li>5.7.2　<span style="color: #552200;" class="mycode_color">UI</span><span style="color: #552200;" class="mycode_color">部品の検索範囲</span></li>
<li>5.7.3　<span style="color: #552200;" class="mycode_color">UI</span><span style="color: #552200;" class="mycode_color">の階層構造の調査</span></li>
<li>5.7.4　<span style="color: #552200;" class="mycode_color">部品の特定</span></li>
<li>5.7.5　<span style="color: #552200;" class="mycode_color">対象外部品の対応</span></li>
<li>6<span style="color: #552200;" class="mycode_color">　RCP/SWT</span><span style="color: #552200;" class="mycode_color">に組み込まれたSwing </span><span style="color: #552200;" class="mycode_color">部品のテストについて</span></li>
<li>7　<span style="color: #552200;" class="mycode_color">GEF (Graphical Editing Framework)</span><span style="color: #552200;" class="mycode_color">について</span></li>
<li>8　<span style="color: #552200;" class="mycode_color">ほかに重要な参照情報</span></li>
<li>9　<span style="color: #552200;" class="mycode_color">CDE</span><span style="color: #552200;" class="mycode_color">テストプランの自動化対象</span><br />
<br />
</li>
</ul>
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">概要</span></div>
<br />
<div style="text-align: left;" class="mycode_align">Window　Tester　ProはEclipseベースのGUI自動テストツールであり、EclipseのPluginテスト、RCPアプリテスト、SWING・SWTアプリテストなどに対応されています。主な機能は記録、テストケース生成、再生、Code Coverage確認などの機能が提供されている。生成されるテストコードはJUnit テストのフォーマットに準処している。本資料では、テスト関連の機能のみ対象とする。<br />
</div>
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">開発元</span></div>
<a href="http://www.instantiations.com/" target="_blank" rel="noopener" class="mycode_url">Instantiations</a>に開発され、<a href="http://code.google.com/javadevtools/wintester/html/index.html" target="_blank" rel="noopener" class="mycode_url">google</a>に買収された後に、Apacheにコントリビューされました。今はApache2ライセンスのオープンソースです。<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">セットアップ</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Eclipse </span><span style="font-weight: bold;" class="mycode_b">のインストール（検証は</span><span style="font-weight: bold;" class="mycode_b">Eclipse3.6.2</span><span style="font-weight: bold;" class="mycode_b">を利用する）。</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><a href="http://www.curlap.com/download/ide/" target="_blank" rel="noopener" class="mycode_url">CDE</a> をEclipseにインストールする</div>
<br />
<div style="text-align: left;" class="mycode_align">Window Testerを<a href="http://code.google.com/javadevtools/download-wintester.html" target="_blank" rel="noopener" class="mycode_url">次のURLから</a><a href="http://code.google.com/javadevtools/wintester/html/installation.html" target="_blank" rel="noopener" class="mycode_url">Eclipseにインストールできる</a></div>
<br />
<div style="text-align: left;" class="mycode_align"> Eclipse 3.6 (Helios)</div>
<div style="text-align: left;" class="mycode_align"> <a href="http://dl.google.com/eclipse/inst/windowtester/latest/3.6" target="_blank" rel="noopener" class="mycode_url">http://dl.google.com/eclipse/inst/window...latest/3.6</a></div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"> Eclipse 3.5 (Galileo)</div>
<div style="text-align: left;" class="mycode_align"> <a href="http://dl.google.com/eclipse/inst/windowtester/latest/3.5" target="_blank" rel="noopener" class="mycode_url">http://dl.google.com/eclipse/inst/window...latest/3.5</a></div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"> Eclipse3.7の正式版はまだリリースされてなく、次のサイトから、ベータ版のインストールができる</div>
<div style="text-align: left;" class="mycode_align"> <a href="http://code.google.com/javadevtools/download-wintester-beta.html" target="_blank" rel="noopener" class="mycode_url">http://code.google.com/javadevtools/down...-beta.html</a></div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">制限事項</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">言語サポート</span></div>
<br />
<div style="text-align: left;" class="mycode_align">次のの言語のみサポートされている（2011年/10/24, ver.6.0.0）</div>
<div style="text-align: left;" class="mycode_align">English</div>German (Germany)<br />
Dutch (Belgium)<br />
French (France)<br />
Spanish (Spain)<br />
Swedish (Sweden)<br />
Japanese (Japan)<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">その他: enterText の問題及び回避策 </div>
<br />
<div style="text-align: left;" class="mycode_align"> ":" と日本語入力の問題,について、次の回避策は":"の問題のみ対応可能で, 日本語入力の問題はまだ対応策を見つかってません, このニュースグループ<a href="http://groups.google.com/group/windowtester-pro/browse_thread/thread/6375ba9a5d6b605f" target="_blank" rel="noopener" class="mycode_url">WT news group</a>に質問したんですが、返事がすぐに来なくて、数週間たってやっと来た感じですが、もう検証が終わってしまい、対策の検証ができなかった）</div>
<br />
<div style="text-align: left;" class="mycode_align"> /**</div>
<br />
<div style="text-align: left;" class="mycode_align"> * Use this if ui.enterText(String<br />
s) does not enter some chars correctly.</div>
<br />
<div style="text-align: left;" class="mycode_align"> *</div>
<br />
<div style="text-align: left;" class="mycode_align"> * @param s</div>
<br />
<div style="text-align: left;" class="mycode_align"> * The text to be entered</div>
<br />
<div style="text-align: left;" class="mycode_align"> * @param language</div>
<br />
<div style="text-align: left;" class="mycode_align"> * examples: "en" for English,<br />
"de" for German</div>
<br />
<div style="text-align: left;" class="mycode_align"> * @param country</div>
<br />
<div style="text-align: left;" class="mycode_align"> * examples: "US" for USA,<br />
"DE" for Germany</div>
<br />
<div style="text-align: left;" class="mycode_align"> */</div>
<br />
<div style="text-align: left;" class="mycode_align"> private void<br />
enterTextWithTempLocale(String s, String language, String country)</div>
<br />
<div style="text-align: left;" class="mycode_align"> {</div>
<br />
<div style="text-align: left;" class="mycode_align"> Locale defaultLocale =<br />
Locale.getDefault(); // remember previous Locale</div>
<br />
<div style="text-align: left;" class="mycode_align"> Locale.setDefault(new<br />
Locale(language, country));</div>
<br />
<div style="text-align: left;" class="mycode_align"> WT.setLocaleToCurrent();</div>
<br />
<div style="text-align: left;" class="mycode_align"> ui.enterText(s); // enter the<br />
text in the ui</div>
<br />
<div style="text-align: left;" class="mycode_align">
Locale.setDefault(defaultLocale); // reset to previous locale</div>
<br />
<div style="text-align: left;" class="mycode_align"> WT.setLocaleToCurrent();</div>
<br />
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">上記の回避策はここから持ってきた: <a href="http://forums.instantiations.com/topic-5-3938.html" target="_blank" rel="noopener" class="mycode_url">http://forums.instantiations.com/topic-5-3938.html</a> </div>
<br />
<div style="text-align: left;" class="mycode_align">追加情報：<br />
　　enterTextは上記の対策で日本語キーボードに対応でき、かな入力に対応できそうになるが、どうもenterText自体は、文字一つは一つのキーとして入力しようとする為、“プロジェクト“や“日本語”など、入力できません。具体的に、次のコードで再生する時に、Fatal Error が発生し、Eclipseがクラッシュしてしまう：</div>
<br />
<div style="text-align: left;" class="mycode_align"> enterTextWithTempLocale(<br />
</div><div style="text-align: left;" class="mycode_align"> "C:\\Curl マニフェスト名\\myfile.text", </div>"ja",<br />
<div style="text-align: left;" class="mycode_align">"JP");</div>
<div style="text-align: left;" class="mycode_align">また、次のようなコードで再生すると、”:”の問題が解消できたが、その後ろの文字が入力出来なくなってしまった。</div>
<div style="text-align: left;" class="mycode_align"> enterTextWithTempLocale(</div>　　"C:\\temp\\files\\myfile.text", "ja","JP");<br />
<br />
ほかにもたくさんのケースを試した結果、結局解消できない：<br />
<br />
<div style="text-align: left;" class="mycode_align">//<br />
C*\ReadOnlyDirになる（標準APIのデフォルト）<br />
</div>System.out.println("********ui.enterText:");<br />
ui.enterText("C:\\ReadOnlyDir"); <br />
// C:\Ra になる、また、画面上誤動作が引き起こす<br />
// （旧メーカ掲示板情報による対応、ALT+Shortcutキーのような場合発生する、ログによると、e -&gt; e + ALT になる）<br />
<br />
<div style="text-align: left;" class="mycode_align">System.out.println("********LocaleTools.enterTextWithTempLocale(\"C:\\ReadOnlyDir\",\"ja\",\"JP\",ui):");</div>LocaleTools.enterTextWithTempLocale("C:\\ReadOnlyDir","ja","JP",ui);<br />
<div style="text-align: left;" class="mycode_align">System.out.println("********LocaleTools.enterTextWithTempLocale(\"C:\\ReadOnlyDir\",ui):");</div>LocaleTools.enterTextWithTempLocale("C:\\ReadOnlyDir",ui);<span style="font-weight: bold;" class="mycode_b"><br />
<br />
プラットフォーム制限</span><br />
<br />
<div style="text-align: left;" class="mycode_align"> WTは現状次のEclipseバージョンのみ対応している： Eclipse3.4, 3.5, 3.6 Eclipse 3.7の対応ステータスはベータ（検証してません）</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">OS</span><span style="font-weight: bold;" class="mycode_b">の制限</span></div>
<div style="text-align: left;" class="mycode_align"> 特になし、Linux上でも利用可。ただし、ファイルパスなど、OS依存の部分がテストケースにある場合、分岐処理をカスタマイズして対応する必要がある。なお、ロケールの問題もあり、メッセージ・ラベルなど英語・日本語両方対応する必要がある為、同じく分岐処理が必要（OSではなく、OSのデフォルトロケールによって処理を振り分け）。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">利用方法</span></div>
<br />
<div style="text-align: left;" class="mycode_align"> WindowTester Pro User Guide（Eclipseのヘルプ画面）で習得できます。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">記録機能の設定</span></div>[*]記録機能を利用する前に、設定が必要です、ユーザガイドに設定方法が紹介されていますが、本検証中に利用している設定を次の通りに例としてリストする。Record Configurations --- main<br />
<br />
<div style="text-align: left;" class="mycode_align"><img src="http://update.curl.com/images/RecordConfig_main.jpg" alt="[Image: RecordConfig_main.jpg]" class="mycode_img" /></div>
<br />
<div style="text-align: left;" class="mycode_align">
Record Configurations --- Arguments<br />
<br />
 <img src="http://update.curl.com/images/RecordConfig_Arguments.jpg" alt="[Image: RecordConfig_Arguments.jpg]" class="mycode_img" /></div>
<br />
<div style="text-align: left;" class="mycode_align">
Record Configurations --- Plugins<br />
<br />
<img src="http://update.curl.com/images/RecordConfig_Plugins.jpg" alt="[Image: RecordConfig_Plugins.jpg]" class="mycode_img" /></div>
<br />
<div style="text-align: left;" class="mycode_align">
Record Configurations --- Configuration<br />
<br />
 <img src="http://update.curl.com/images/RecordConfig_Configuration.jpg" alt="[Image: RecordConfig_Configuration.jpg]" class="mycode_img" /></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">CDE</span><span style="font-weight: bold;" class="mycode_b">テスト時の注意点</span></div>
[*]Recordする前に、CurlのRTEを終了させる必要がある、CDEのテストを記録する為のEclipseでCDEを起動しない、万が一起動されてしまったら、CurlのRTEを強制でも終了させてください。[*]記録時の環境は英語環境がお勧めです。テストコード・テスト条件・テストケースの作成時に、よく利用するメッセージの特定は英語で確認しやすいためだ。（日本語環境の場合、UIのメッセージ・テキストが日本語になっている為、propritiesファイルが特定のツールを使わないと読めない。　例：　ファイルeclipse\com.curl.eclipse.plugin\src\com\curl\eclipse\ui\CurlUIMessages_ja.properties<br />
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">記録問題</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Curl</span><span style="font-weight: bold;" class="mycode_b">側の記録ができない</span></div>
<br />
<div style="text-align: left;" class="mycode_align">JavaのUIしかレコードできない為、VLEやVLEE、ほかのCurlでできたツールのレコードができない。解決策：なし</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Drag&amp;Drop</span><span style="font-weight: bold;" class="mycode_b">が正しく記録できないケースがある</span></div>
<br />
<div style="text-align: left;" class="mycode_align">（手動で追加できるか、確認する必要がある）全く記録されないか、部分的に記録される、再生に利用できないコードになっている。解決策：手動で記録コードを追加する。例：to be added.</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">記録漏れがある</span></div>
<br />
<div style="text-align: left;" class="mycode_align">記録中に、記録漏れが発生する場合がある。例：ダイアログの表示・非表示解決策：手動で記録コードを追加する。例：ui.wait(new ShellShowingCondition("Curlメディエーターの開始中")); ui.wait(new ShellDisposedCondition("Curlメディエーターの開始中"));</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">ご操作などによって余計な操作を記録される場合がある</span></div>
<br />
<div style="text-align: left;" class="mycode_align">例：Welcome画面の閉じる操作など。解決策：不要なオペレーションが記録された場合に、該当コードをコメントアウトする。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">ロケールの問題</span></div>
<br />
<div style="text-align: left;" class="mycode_align">記録時に、ダイアログやUIのIDは記録した時の言語設定によって、日本語か英語になるが、再生の環境によって、言語設定が記録時と異なる場合がある。解決策：CDE pluginのパッケージをインポートし、CDE pluginのパッケージに定義されているロケール対応の文字列定数を利用して、対応可能。例：ui.wait(new<br />
ShellShowingCondition(InstallHandlerMessages.InstallHandler_Starting_Mediator)); この行のコードにあるInstallHandler_Starting_Mediatorは記録時に、日本語環境の場合、ui.wait(new ShellShowingCondition("Curlメディエーターの開始中"));になるが、パッケージクラスcom.curl.eclipse.InstallHandlerMessagesをインポートすれば、定数を直接利用し、Eclipseのローカライズ機能で対応できる。</div>
<br />
<div style="text-align: left;" class="mycode_align">上記プロパティファイルで対応できるのが、Dialogや、ラベルのメッセージのみで、メイン画面のMenuの場合、plugin.xmlで定義されており、この方法で対応できません。代替案が必要と思われます（制限付きの対応になるなど）</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">記録コードが実行できない場合がある（文法エラー）</span></div>
<br />
<div style="text-align: left;" class="mycode_align">例：Curlのコード行がある行の横のルーラをダブルクリックする処理を記録したコードは次になっているが、文法エラーです。</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"> AnnotationRulerColumn&#36;5.class,<br />
1, new SWTWidgetLocator(</div>
<br />
<div style="text-align: left;" class="mycode_align"> CompositeRuler&#36;CompositeRulerCanvas.class)),<br />
4, 143));</div>
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">CompositeRulerCanvasがパッケージアクセス属性の為、定義されたパッケージ外からアクセスできない！（のに、記録された）</div>
<br />
<div style="text-align: left;" class="mycode_align">また、&#36;5もなぜ記録コードに入っているか不明(インナークラスのようだが。。。）、CompositeRuler&#36;CompositeRulerCanvasにある&#36;もdot(.)にすべき。</div>
<br />
<div style="text-align: left;" class="mycode_align">対策：不明</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">検証条件の追加</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Assertion<br />
Inspector</span><span style="font-weight: bold;" class="mycode_b">の使用</span></div>
<br />
<div style="text-align: left;" class="mycode_align">記録時に記録バーにあるassertion inspector tool(虫眼鏡アイコン)を使えば、記録すると同時に検証条件を追加できる。このツールを起動したら、検証対象のコントロールにマウスホバーをすると、該当対象の検証できる属性が表示されるので、検索条件を記録コードに追加することができる。<img src="http://update.curl.com/images/Assertion_inspector.png" alt="[Image: Assertion_inspector.png]" class="mycode_img" /></div>
<br />
<div style="text-align: left;" class="mycode_align">制限事項：<br />
<br />
1. メニュー・メニューアイテムに対応されてない。<br />
<br />
2. Editorの左側のルーラ(AnnotationRulerColumn)対応できない（&#36;5などが追加される）<br />
<br />
3. CurlEditorのコンテンツの検証ができない（色、下線などのスタイル、選択、クイックメニュー、コード補完）</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">検証の詳細</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">検証条件</span></div>
<br />
<div style="text-align: left;" class="mycode_align">特定の対象のプロパティを条件に満たすか検証する。例：<br />
<br />
ui.assertThat(new ShellShowingCondition("Input Dialog"));<br />
<br />
WTは複数種類の条件を検証できる。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">普通の</span><span style="font-weight: bold;" class="mycode_b">UI</span><span style="font-weight: bold;" class="mycode_b">部品の属性検証</span><span style="font-weight: bold;" class="mycode_b">(</span><span style="font-weight: bold;" class="mycode_b">使用可否・テキスト・選択・可視性・フォーカス</span><span style="font-weight: bold;" class="mycode_b">)</span></div>
<br />
<div style="text-align: left;" class="mycode_align">次の属性条件が用意されている。</div>
<br />
<div style="text-align: left;" class="mycode_align">部品のenabled検証</div>
<br />
<div style="text-align: left;" class="mycode_align">IsEnabledConditionを利用する。IsEnabledインターフェースを実装した LocatorはIsEnabledConditionを使って、enabled属性の検証ができる。</div>
<br />
<div style="text-align: left;" class="mycode_align">部品のテキスト検証</div>
<br />
<div style="text-align: left;" class="mycode_align">HasTextConditionを利用する。HasTextインターフェースを実装した LocatorはHasTextConditionを使って、部品に格納されるテキストの検証ができる。同様に、上記以外に次のような条件も用意されている：</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">IsSelected and IsSelectedCondition</div>
<br />
<div style="text-align: left;" class="mycode_align">IsVisible and IsVisibleCondition</div>
<br />
<div style="text-align: left;" class="mycode_align">HasFocus and HasFocusCondition</div>
検証条件例：<br />
“Finished”ボタンが使用可能の判断条件：<br />
<div style="text-align: left;" class="mycode_align">
ui.assertThat(new IsEnabledCondition(new ButtonLocator("Finished"),<br />
true));</div>
<div style="text-align: left;" class="mycode_align">某ウィザードダイアログのUIにエラーメッセージを含まれているかの判断条件： <br />
<br />
ui.assertThat(new HasTextCondition(new WizardErrorMessageLocator(), "エラーメッセージ"));</div>
<br />
<div style="text-align: left;" class="mycode_align">または、条件に合わない場合検証エラーのメッセージ付きの判断条件は次のように書く：</div>
<div style="text-align: left;" class="mycode_align">
<br />
ui.assertThat("Finish button should be enabled", new<br />
IsEnabledCondition(new ButtonLocator("Finished"), true)); <br />
<br />
ui.assertThat("The error message is wrong", new<br />
HasTextCondition(new WizardErrorMessageLocator(), "some wizard<br />
message"));</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">§ <br />
実際に、実装された条件であれば、どれでも検証可能だ。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">検証用ファクトリ</span></div>
<br />
<div style="text-align: left;" class="mycode_align">便利にコードを書く為、一部のLocatorに条件を生成するファクトリが実装されている。上記の二つの例だと、次のようにも書ける：<br />
<br />
ui.assertThat(new ButtonLocator("Finished").isEnabled());<br />
<br />
ui.assertThat(new WizardErrorMessageLocator().hasText("some wizard<br />
message"));</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">条件確保</span></div>
<br />
<div style="text-align: left;" class="mycode_align">一部の条件で、属性をtrueになっていることを確保（保証）するような書き方もある。それらの条件はcom.windowtester.runtime.condition.IConditionHandler<br />
を実装していて、IUIContext.ensureThat(..)<br />
に渡している。</div>
<br />
<div style="text-align: left;" class="mycode_align">Welcomeページをクローズされていることを確保する実装例：</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">public class BaseTest extends UITestCaseSWT {</div>
<br />
<div style="text-align: left;" class="mycode_align"> protected void setUp() throws Exception<br />
{</div>
<br />
<div style="text-align: left;" class="mycode_align"> closeWelcomePageIfNecessary();</div>
<br />
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">protected void closeWelcomePageIfNecessary() throws Exception {</div>
<br />
<div style="text-align: left;" class="mycode_align"> IWidgetLocator[]<br />
welcomeTab = getUI().findAll(new CTabItemLocator("Welcome"));</div>
<br />
<div style="text-align: left;" class="mycode_align"> if (welcomeTab.length == 0)</div>
<br />
<div style="text-align: left;" class="mycode_align"> return;</div>
<br />
<div style="text-align: left;" class="mycode_align"> getUI().close(welcomeTab[0]);</div>
<br />
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">手動で条件検証を作成する</span></div>
<br />
<div style="text-align: left;" class="mycode_align">既存の条件(ICondition)で検証目的に達成できない場合、独自に実装することも可能。ただし、条件を検証する処理は、テストスレッドで実装してはいけなくて、UIスレッドで実装する必要がある。テストスレッド側で、検証処理をRunnableを経由して呼び出す必要がある。</div>
<br />
<div style="text-align: left;" class="mycode_align">実装例：</div>
<br />
<div style="text-align: left;" class="mycode_align">ツリーアイテムをドラッグして、別のツリーアイテムにドロップし、一つ目のラベルが期待したラベルになる検証。</div>
<br />
<div style="text-align: left;" class="mycode_align">//select a tree item <br />
</div>
<div style="text-align: left;" class="mycode_align">ui.click(new TreeItemLocator("treeItem2"));</div>
<div style="text-align: left;" class="mycode_align">//drag and drop it on another</div>
<div style="text-align: left;" class="mycode_align">ui.dragTo(new XYLocator(new<br />
TreeItemLocator("treeItem2"), 5, 5));</div>
<div style="text-align: left;" class="mycode_align">//perform assertions safely on the UI thread</div>
<div style="text-align: left;" class="mycode_align">Display.getDefault().syncExec( new Runnable() {</div>
<div style="text-align: left;" class="mycode_align"> public void run() { </div>
<div style="text-align: left;" class="mycode_align"> //get<br />
the tree widget</div>
<div style="text-align: left;" class="mycode_align"> Tree<br />
tree = (Tree)((IWidgetReference)ui.find(new<br />
SWTWidgetLocator(Tree.class))).getWidget();</div>
<div style="text-align: left;" class="mycode_align"> //the<br />
first item in the tree should now have the EXPECTED label</div>
<div style="text-align: left;" class="mycode_align"> TestCase.assertEquals(EXPECTED_LABEL,<br />
tree.getItems()[0].getText());</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">});</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">上記の条件検証方法があるが、テストケースのメンテナンス性や、実行時の健全性などを考えると、IConditionで実装し、WTの検証条件の仕組みを利用すべき。次の節も参照してください。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">条件と条件ハンドラー</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">条件</span></div>
<br />
<div style="text-align: left;" class="mycode_align">条件は特定の状態が存在しているかをチェックする為のオブジェクト、ハンドラーは条件がtrueになる場合に起こすべき処理をカプセル化する。条件はテストの実行とテストされているアプリケーションの実行を同調させることができる、あるいはテストで特定のシチュエーションを検証する。</div>
<br />
<div style="text-align: left;" class="mycode_align">例えば、UIスレッドのある処理を待つ為に、Thread.sleep(5000);処理より、条件を使えば、テストスレッドとアプリケーションスレッドの同調の信頼性が高くなる。</div>ui.wait(new ShellShowingCondition("My<br />
<div style="text-align: left;" class="mycode_align">Dialog"));</div>
<div style="text-align: left;" class="mycode_align">ui.wait(new ShellDisposedCondition("My<br />
Dialog"));</div>
<div style="text-align: left;" class="mycode_align">ui.wait(new IsEnabledCondition(new<br />
ButtonLocator("Finish")));</div>
<div style="text-align: left;" class="mycode_align">ui.wait(new FileExistsCondition("MyProject/newFile.txt")),<br />
true);</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">あるいはSwingの場合</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">ui.wait(new WindowShowingCondition("My<br />
Dialog"));</div>
<div style="text-align: left;" class="mycode_align">ui.wait(new WindowDisposedCondition("My<br />
Dialog"));</div>
<div style="text-align: left;" class="mycode_align">ui.wait(new IsEnabledCondition(new<br />
JButtonLocator("Finish")));</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">ほかのICondition, IUIConditionの対応状況は次のAPI Refを参考してください：<br />
<br />
com.windowtester.runtime.condition<br />
<br />
com.windowtester.runtime.swing.condition<br />
<br />
com.windowtester.runtime.swt.condition<br />
<br />
com.windowtester.runtime.swt.condition.eclipse<br />
<br />
com.windowtester.runtime.swt.condition.shell<br />
<br />
com.windowtester.runtime.swing.condition</div>
<br />
<div style="text-align: left;" class="mycode_align">上記以外に、Condition ファクトリを利用することも可能。例<br />
<br />
ui.assertThat(new ButtonLocator("OK").isEnabled());</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">ハンドラー</span></div>
<br />
<div style="text-align: left;" class="mycode_align">条件/ハンドラーはペアでIConditionMonitorまたはIShellMonitorに登録され、予想できないイベントへの対処を頑丈にできる。次のサンプルはテストの過程で稀にライセンスダイアログが表示されるケースがあってもテストが正常に遂行できるようにライセンスダイアログが表示されたら"OK"ボタンをクリックさせる為の条件/Handlerを作成し、モニターに登録する。</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">monitor = (IConditionMonitor)<br />
ui.getAdapter(IConditionMonitor.class);</div>
<div style="text-align: left;" class="mycode_align">monitor.add(new<br />
ShellShowingCondition("License*"), new IHandler() {</div>
<div style="text-align: left;" class="mycode_align"> public handle(IUIContext ui) {</div>
<div style="text-align: left;" class="mycode_align"> ui.click(new ButtonLocator("OK"));<br />
</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">});</div>
条件は常にUIのアクションより先に処理される<br />
<br />
//conditions processed before menu selection<br />
<br />
<div style="text-align: left;" class="mycode_align">ui.click(new MenuItemLocator("New/File"));</div>
<br />
<div style="text-align: left;" class="mycode_align">//conditions processed during wait</div>
<br />
<div style="text-align: left;" class="mycode_align">ui.wait(New ShellShowingCondition("New File"));</div>
<br />
<div style="text-align: left;" class="mycode_align">//conditions processed before click</div>
<br />
<div style="text-align: left;" class="mycode_align">ui.click(new ButtonLocator("Cancel"));</div>
<br />
<div style="text-align: left;" class="mycode_align">//conditions processed during wait</div>
<br />
<div style="text-align: left;" class="mycode_align">ui.wait(new ShellDisposedCondition("New File"));</div>
<br />
<br />
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">Swing Conditionの場合、CDEで利用しない為、省略。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">再生時の問題</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Java</span><span style="font-weight: bold;" class="mycode_b">の</span><span style="font-weight: bold;" class="mycode_b">UI</span><span style="font-weight: bold;" class="mycode_b">でも、再生する時に、停止されている場合がある</span></div>
<br />
<div style="text-align: left;" class="mycode_align">対策：ユーザが止まっている個所を確認し、手動でその操作を追加し、その後の再生が継続される。たとえば、New Curl<br />
Projectの選択、再生されない場合がある。それは再生時に、Mediatorの起動に時間がかかり、Curlのビューが選択された後に、CurlのメニューがまだEclipseに作成されてない為、次のステップはCurlの新規Projectを作成する処理で失敗する（該当メニューが見つからない）為だ。</div>
<br />
<div style="text-align: left;" class="mycode_align">この問題の対応は、ui.waitの追加が必要。つまりMediatorにつなぐダイアログの表示・非表示を待たせて、このダイアログが消えたら、次のステップに進むようにテストの記録コードに処理を追加する必要がある。</div>
<br />
<div style="text-align: left;" class="mycode_align">例</div>
<br />
<div style="text-align: left;" class="mycode_align">ui.wait(new ShellShowingCondition(</div>
<br />
<div style="text-align: left;" class="mycode_align">
InstallHandlerMessages.InstallHandler_Starting_Mediator));//"Curlメディエーターの開始中"</div>
<br />
<div style="text-align: left;" class="mycode_align">ui.wait(new ShellDisposedCondition(</div>
<br />
<div style="text-align: left;" class="mycode_align">
InstallHandlerMessages.InstallHandler_Starting_Mediator));//"Curlメディエーターの開始中"</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">記録した入力が記録時と異なるコードが再生されてしまう</span></div>
<br />
<div style="text-align: left;" class="mycode_align">例えば、CurlEditorに手動で入力したコード</div>
<br />
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align"> {define-proc public {test-code<br />
in:String}:void </div>
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">が、再生する時に、次のコードで入力されてしまう：</div>{define-proc public {test-code<br />
<div style="text-align: left;" class="mycode_align">in*String}*void</div>
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">対策：不明</div>
[*]テスト結果[*]テストが失敗する場合に、失敗した時のscreen shotsが自動的に作成される。<br />
[*]その他メモ<br />
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Welcome</span><span style="font-weight: bold;" class="mycode_b">ページのテスト</span></div>
<br />
[*]デフォルトはEclipseのWelcome画面がテストされません、テストする必要になる場合、次のように、セットアップメソッドのカスタマイズなどが必要です。例：<br />
<br />
<div style="text-align: left;" class="mycode_align">public class BaseTest extends UITestCaseSWT {</div>
<div style="text-align: left;" class="mycode_align"> @Override</div>
<div style="text-align: left;" class="mycode_align"> protected<br />
void setUp() throws Exception {</div>
<div style="text-align: left;" class="mycode_align"> closeWelcomePageIfNecessary();</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<div style="text-align: left;" class="mycode_align">//Handling the “Welcome” page involves the following<br />
steps:</div>
<br />
<div style="text-align: left;" class="mycode_align">//Test if it is visible </div>
<div style="text-align: left;" class="mycode_align">//If it is visible, dismiss it </div>
<div style="text-align: left;" class="mycode_align">//The closeWelcomePageIfNecessary() method does just<br />
that:</div>
<br />
<div style="text-align: left;" class="mycode_align">protected void closeWelcomePageIfNecessary() throws<br />
WidgetSearchException {</div>
<div style="text-align: left;" class="mycode_align"> IUIContext<br />
ui = getUI();</div>
<div style="text-align: left;" class="mycode_align"> IWidgetLocator[]<br />
welcomeTab = ui.findAll(new CTabItemLocator("Welcome"));</div>
<div style="text-align: left;" class="mycode_align"> if<br />
(welcomeTab.length == 0)</div>
<div style="text-align: left;" class="mycode_align"> return;</div>
<div style="text-align: left;" class="mycode_align"> ui.close(welcomeTab[0]);</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<br />
テストケースで保存されてないEditorバッファがある場合の対応。未保存のEditorバッファがある場合、テストが終了できない、または終了に時間がかかる（UIの生成がある為）。それを回避するために、コードでバッファを保存するような処理を書く必要がある。<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">例：（SWTテストの例、Pluginテストは同様だと思われる）</div>
<br />
<div style="text-align: left;" class="mycode_align">public class DirtyEditorCondition implements ICondition<br />
{</div>
<div style="text-align: left;" class="mycode_align"> public　boolean test() {</div>
<div style="text-align: left;" class="mycode_align"> final　boolean result[] = new boolean[] { false };</div>
<div style="text-align: left;" class="mycode_align"> Display.getDefault().syncExec(new　Runnable() {</div>
<div style="text-align: left;" class="mycode_align"> public　void run() {</div>
<div style="text-align: left;" class="mycode_align">　　result[0]　= anyUnsavedChanges0();</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> });</div>
<div style="text-align: left;" class="mycode_align"> return　result[0];</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> protected　static boolean anyUnsavedChanges0() {</div>
<div style="text-align: left;" class="mycode_align"> IWorkbenchWindow[]　windows = PlatformUI.getWorkbench().getWorkbenchWindows();</div>
<div style="text-align: left;" class="mycode_align"> for　(int i = 0; i &lt; windows.length; i++) {</div>
<div style="text-align: left;" class="mycode_align"> IWorkbenchPage[]　pages = windows.getPages();</div>
<div style="text-align: left;" class="mycode_align"> for<br />
(int j = 0; j &lt; pages.length; j++) {</div>
<div style="text-align: left;" class="mycode_align"> IEditorReference[]<br />
editorRefs = pages[j].getEditorReferences();</div>
<div style="text-align: left;" class="mycode_align"> for<br />
(int k = 0; k &lt; editorRefs.length; k++) {</div>
<div style="text-align: left;" class="mycode_align"> IEditorReference<br />
each = editorRefs[k];</div>
<div style="text-align: left;" class="mycode_align"> if<br />
(each.isDirty())</div>
<div style="text-align: left;" class="mycode_align"> return<br />
true;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> return<br />
false;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align">//(The details are unsurprising. The one thing to note<br />
is that we need to ensure that </div>
<div style="text-align: left;" class="mycode_align">//we safely access the workbench windows on the UI<br />
thread.)</div>
<br />
<div style="text-align: left;" class="mycode_align">//With our DirtyEditorCondition in hand, we can hook<br />
into teardown like this:</div>
<br />
<div style="text-align: left;" class="mycode_align">public class BaseTest extends UITestCaseSWT {</div>
<div style="text-align: left;" class="mycode_align"> ... same<br />
as above</div>
<div style="text-align: left;" class="mycode_align"> @Override</div>
<div style="text-align: left;" class="mycode_align"> protected<br />
void tearDown() throws Exception {</div>
<div style="text-align: left;" class="mycode_align"> saveAllIfNecessary();</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> protected<br />
void saveAllIfNecessary() throws WidgetSearchException {</div>
<div style="text-align: left;" class="mycode_align"> if<br />
(anyUnsavedChanges())</div>
<div style="text-align: left;" class="mycode_align"> getUI().click(new<br />
MenuItemLocator("File/Save All"));</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> private<br />
boolean anyUnsavedChanges() {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
new DirtyEditorCondition().test();</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">UI</span><span style="font-weight: bold;" class="mycode_b">部品の特定方法</span></div><div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Matcher</span><span style="font-weight: bold;" class="mycode_b">と</span><span style="font-weight: bold;" class="mycode_b">Locator</span></div>
<div style="text-align: left;" class="mycode_align">WindowTesterでMatcherとLocatorでUI部品を特定する。</div>
<br />
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">LocatorはMatcherの子供</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">public interface IWidgetMatcher {</div>
<div style="text-align: left;" class="mycode_align"> boolean<br />
matches(Object widget);</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align">//Widget locators are matchers. </div>
<div style="text-align: left;" class="mycode_align">public interface IWidgetLocator extends IWidgetMatcher { ... }</div><div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">UI</span><span style="font-weight: bold;" class="mycode_b">部品の検索範囲</span></div>
<div style="text-align: left;" class="mycode_align">部品の検索はWindowTester の実行環境がwidget　finderに代理され、アクティブになっているアプリケーション画面のみ、検索対象にする。テストされているアプリが画面(Window)を持ってない場合、例外がfinderにスローされる。検索は外から中へ、上から下へ、左から上への順で探す、次のイメージ：(button-&gt; label -&gt; text -&gt; the second composite -&gt; the last text widget)<img src="http://update.curl.com/images/WidgetSearch.jpg" alt="[Image: WidgetSearch.jpg]" class="mycode_img" /></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">UI</span><span style="font-weight: bold;" class="mycode_b">の階層構造の調査</span></div>
<br />
<div style="text-align: left;" class="mycode_align">SWTDebugHelperでUIの階層構造を標準コンソールに出力することが可能。</div>
<br />
<div style="text-align: left;" class="mycode_align">例: EclipseのAboutダイアログのUI階層をコンソールに出力するサンプル</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">public void testSpelunkAboutWindow() throws Exception {</div>
<div style="text-align: left;" class="mycode_align"> IUIContext<br />
ui = getUI();</div>
<div style="text-align: left;" class="mycode_align"> ui.click(new<br />
MenuItemLocator("Help/About Eclipse SDK"));</div>
<div style="text-align: left;" class="mycode_align"> ui.wait(new<br />
ShellShowingCondition("About Eclipse SDK"));</div>
<div style="text-align: left;" class="mycode_align"> new<br />
DebugHelper().printWidgets();</div>
<div style="text-align: left;" class="mycode_align"> ui.click(new<br />
ButtonLocator("OK"));</div>
<div style="text-align: left;" class="mycode_align"> ui.wait(new<br />
ShellDisposedCondition("About Eclipse SDK"));</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">部品の特定</span></div>
<br />
<div style="text-align: left;" class="mycode_align">§ <br />
部品を特定する簡易的な方法は2つある：</div>
<br />
<div style="text-align: center;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">IUIContext.find(..) </span><span style="font-weight: bold;" class="mycode_b">または IUIContext.findAll(..))</span></div>
<br />
<div style="text-align: left;" class="mycode_align">IUIContext.find(ILocator)</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">一つ以上の部品を条件に合った場合、<br />
MultipleWidgetsFoundException がスローされる。注意：IUIContext.click(ILocator) がIUIContext.find(ILocator)に代表されるのでILocatorが一つ以上存在する場合、同じようにMultipleWidgetsFoundException<br />
がスローされる。</div>
<br />
<div style="text-align: left;" class="mycode_align">IUIContext.findAll(ILocator)</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">マッチしたすべての部品がアレイにセットされ返却される。</div>
<br />
<div style="text-align: left;" class="mycode_align">幾つか例を見よう。</div>
<br />
<div style="text-align: left;" class="mycode_align">例えば、“OK”ボタンを探すために、ui.find(new<br />
ButtonLocator("OK"));を使えばいい（もちろん、見つからない、または二つ以上見つかった場合に、例外がスローされる）。</div>
<br />
<div style="text-align: left;" class="mycode_align">対照的にui.findAll(new ButtonLocator("OK"));を使うと、見つかった“OK”ボタンがすべてアレイにセットされる（空かもしれないが）</div>
<br />
<div style="text-align: left;" class="mycode_align">一般的に、“OK”ボタンが同じ画面上に一個しかないのが普通ですが、複数ある場合に、取得したいボタンの場所、UIの階層情報を利用して、特定できる。</div>
<br />
<div style="text-align: left;" class="mycode_align">例：new ButtonLocator("OK", new<br />
SWTWidgetLocator(Composite.class)) このコードは、Compositeの中に入っているボタンを取得する（ほかの“OK”ボタンがこのCompositeに入ってない場合）。</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">§ <br />
確実に部品を特定する方法は部品にタグを付けさせることで、テストケースの開発段階で該当UIにユニークな名前を付けると特定しやすくなる。例：widget.setData("name", "widgetName"); </div>
<div style="text-align: left;" class="mycode_align">テストケースで呼び出す時に次のように利用できる：</div>
<br />
<div style="text-align: left;" class="mycode_align">NamedWidgetLocator widgetLocator = new<br />
NamedWidgetLocator("widgetName");</div>
<div style="text-align: left;" class="mycode_align">IWidgetReference widgetRef = (IWidgetReference)ui.find(widgetLocator);</div>
<div style="text-align: left;" class="mycode_align">assertNotNull(widgetRef);</div>
<div style="text-align: left;" class="mycode_align">ui.click(widgetLocator); //if you want to click the<br />
widget</div>
<br />
[*]対象外部品の特定<br />
<br />
<div style="text-align: left;" class="mycode_align">既存Locatorの動作を変えたい場合や、対象外の部品を特定する為に、Locatorをカスタマイズする必要がある。</div>
<br />
<div style="text-align: left;" class="mycode_align">§ <br />
動作を変えたい場合、IWidgetMatcherを継承し実装する。SWTの場合、SWTWidgetLocator.buildMatcher() で該当Matcherを呼び出す。</div>
<br />
<div style="text-align: left;" class="mycode_align">例（選択されたボタンを特定する）</div>
<br />
<div style="text-align: left;" class="mycode_align">class SelectedButtonMatcher implements IWidgetMatcher {</div>
<br />
<div style="text-align: left;" class="mycode_align"> private<br />
final IWidgetMatcher defaultMatcher;</div>
<br />
<div style="text-align: left;" class="mycode_align"> SelectedButtonMatcher(IWidgetMatcher<br />
defaultMatcher) {</div>
<div style="text-align: left;" class="mycode_align"> this.defaultMatcher<br />
= defaultMatcher;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
boolean matches(Object widget) {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
isSelected(widget) &amp;&amp; matchesDefaultCriteria(widget);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> private<br />
boolean matchesDefaultCriteria(Object widget) {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
defaultMatcher.matches(widget);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> private<br />
boolean isSelected(Object widget) {</div>
<div style="text-align: left;" class="mycode_align"> if<br />
(!(widget instanceof Button))</div>
<div style="text-align: left;" class="mycode_align"> return<br />
false;</div>
<div style="text-align: left;" class="mycode_align"> final<br />
Button button = (Button)widget;</div>
<div style="text-align: left;" class="mycode_align"> final<br />
boolean[] result = new boolean[1];</div>
<div style="text-align: left;" class="mycode_align"> Display.getDefault().syncExec(</div>
<div style="text-align: left;" class="mycode_align"> new<br />
Runnable() {</div>
<div style="text-align: left;" class="mycode_align"> public<br />
void run() {</div>
<div style="text-align: left;" class="mycode_align"> result[0]<br />
= button.getSelection();</div>
<div style="text-align: left;" class="mycode_align">
} </div>
<div style="text-align: left;" class="mycode_align"> });</div>
<div style="text-align: left;" class="mycode_align"> return<br />
result[0];</div>
<div style="text-align: left;" class="mycode_align"> } </div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align">//(Note that here we are decorating the default<br />
matcher. A simpler implementation would </div>
<div style="text-align: left;" class="mycode_align">//forego a reference to the default matcher.)</div>
<br />
<div style="text-align: left;" class="mycode_align">//With this matcher defined a SelectedButtonLocator<br />
could be defined like this:</div>
<br />
<div style="text-align: left;" class="mycode_align">public class SelectedButtonLocator extends<br />
ButtonLocator {</div>
<div style="text-align: left;" class="mycode_align"> private static final long<br />
serialVersionUID = 1L;</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
SelectedButtonLocator(String label) {</div>
<div style="text-align: left;" class="mycode_align"> super(label);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> @Override</div>
<div style="text-align: left;" class="mycode_align"> protected<br />
IWidgetMatcher buildMatcher() {</div>
<div style="text-align: left;" class="mycode_align"> IWidgetMatcher<br />
defaultMatcher = super.buildMatcher();</div>
<div style="text-align: left;" class="mycode_align"> return<br />
new SelectedButtonMatcher(defaultMatcher);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align">//Using this locator looks just like using the standard<br />
button locator:</div>
<br />
<div style="text-align: left;" class="mycode_align">ui.click(new ButtonLocator("OK")); //standard</div>
<div style="text-align: left;" class="mycode_align">ui.click(new SelectedButtonLocator(".*"));<br />
//custom</div>
<br />
<div style="text-align: left;" class="mycode_align">//(Notice that you can use a wildcard just like the<br />
standard locator since we are </div>
<div style="text-align: left;" class="mycode_align">// decorating the default matching criteria. The custom<br />
locator reference reads: </div>
<div style="text-align: left;" class="mycode_align">// "click the selected button with any<br />
text".)</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">対象外部品の対応</span></div>
<br />
<div style="text-align: left;" class="mycode_align">対象外の部品を対応する為に、新しいLocatorを作成する必要がある。作成方法について、一番単純なものはSWTWidgetLocator を継承するだけで対応可能。例えば、次の例で、EclipseのSection（org.eclipse.ui.forms.widgets.Section）部品の検出に役立つLocatorが作成されている。</div>
<br />
<div style="text-align: left;" class="mycode_align">public class SectionLocator extends SWTWidgetLocator {</div>
<br />
<div style="text-align: left;" class="mycode_align"> private<br />
static final long serialVersionUID = 621335057837701982L;</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
SectionLocator(String text) {</div>
<div style="text-align: left;" class="mycode_align"> super(Section.class,<br />
text);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
SectionLocator(String text, SWTWidgetLocator parent) {</div>
<div style="text-align: left;" class="mycode_align"> super(Section.class,<br />
text, parent);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
SectionLocator(String text, int index, SWTWidgetLocator parent) {</div>
<div style="text-align: left;" class="mycode_align"> super(Section.class,<br />
text, index, parent);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align">上記の実装は、SWTWidgetLocatorのデフォルト機能を利用している。ただ、より複雑なロジックについて、例えばツリーの項目選択の制御など、まだドキュメントされてない。【2011/10/25現在】</div>
<br />
<div style="text-align: left;" class="mycode_align">理解を深める為に、より複雑な対象外部品<br />
org.eclipse.swt.browser.Browser の対応例もWTのヘルプに載っている。部品BrowserにはHTMLのコンテンツが入っており、このサンプルの実装で、次のようなテストケースが作成できる：<br />
<br />
ui.assertThat(new BrowserLocator().htmlContains(EXPECTED_URL));</div>
<div style="text-align: left;" class="mycode_align">本対応のコツは、Browserインスタンスの為にIWidgetReference をカスタマイズして、特殊なBrowserReferenceを作成する。 <br />
<br />
また、ほかのサンプルについて、次のリンクを参照してみてください：<a href="http://code.google.com/p/wt-commons/wiki/WTSnippets" target="_blank" rel="noopener" class="mycode_url"><span style="color: blue;" class="mycode_color">http://code.google.com/p/wt-commons/wiki/WTSnippets</span></a> <br />
<br />
BrowserLocatorの実装例</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">public class BrowserLocator extends SWTWidgetLocator {</div>
<br />
<div style="text-align: left;" class="mycode_align"> private<br />
static final long serialVersionUID = 1L;</div>
<div style="text-align: left;" class="mycode_align"> public<br />
BrowserLocator() {</div>
<div style="text-align: left;" class="mycode_align"> super(Browser.class);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> @Override</div>
<div style="text-align: left;" class="mycode_align"> public<br />
IWidgetLocator[] findAll(IUIContext ui) {</div>
<div style="text-align: left;" class="mycode_align"> IWidgetLocator[]<br />
refs = super.findAll(ui);</div>
<div style="text-align: left;" class="mycode_align"> BrowserReference[]<br />
browsers = new BrowserReference[refs.length];</div>
<div style="text-align: left;" class="mycode_align"> for<br />
(int i = 0; i &lt; browsers.length; i++) {</div>
<div style="text-align: left;" class="mycode_align"> browsers<br />
= new BrowserReference((IWidgetReference)refs);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> return<br />
browsers;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align">BrowerReferenceの実装例：</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">public class BrowserReference implements<br />
IWidgetReference {</div>
<br />
<div style="text-align: left;" class="mycode_align"> private class<br />
HtmlContainsCondition implements ICondition {</div>
<br />
<div style="text-align: left;" class="mycode_align"> String<br />
expectedText;</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
HtmlContainsCondition(String expectedText) {</div>
<div style="text-align: left;" class="mycode_align">
this.expectedText = expectedText;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
boolean test() {</div>
<div style="text-align: left;" class="mycode_align">
String html = getHTML();</div>
<div style="text-align: left;" class="mycode_align"> if (html == null)</div>
<div style="text-align: left;" class="mycode_align">
return false;</div>
<div style="text-align: left;" class="mycode_align">
return html.contains(expectedText);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"> private final<br />
IWidgetReference browserWidget;</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
BrowserReference(IWidgetReference browserWidget) {</div>
<div style="text-align: left;" class="mycode_align">
this.browserWidget = browserWidget;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public Object<br />
getWidget() {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
browserWidget.getWidget();</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> /**</div>
<div style="text-align: left;" class="mycode_align"> * @since<br />
Eclipse 3.4 where Browser.getText() is introduced</div>
<div style="text-align: left;" class="mycode_align"> */</div>
<div style="text-align: left;" class="mycode_align"> public String<br />
getHTML() {</div>
<div style="text-align: left;" class="mycode_align"> final<br />
String text[] = new String[1];</div>
<div style="text-align: left;" class="mycode_align">
Display.getDefault().syncExec(new Runnable() {</div>
<div style="text-align: left;" class="mycode_align">
public void run() {</div>
<div style="text-align: left;" class="mycode_align">
text[0] = getText(getBrowser());</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> });</div>
<div style="text-align: left;" class="mycode_align"> return<br />
text[0];</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> private<br />
static String getText(Browser browser) {</div>
<div style="text-align: left;" class="mycode_align"> if<br />
(browser == null)</div>
<div style="text-align: left;" class="mycode_align">
return null;</div>
<br />
<div style="text-align: left;" class="mycode_align"> try {</div>
<div style="text-align: left;" class="mycode_align">
Method m = browser.getClass().getMethod("getText", (Class[])<br />
null);</div>
<div style="text-align: left;" class="mycode_align">
m.setAccessible(true);</div>
<div style="text-align: left;" class="mycode_align">
return (String) m.invoke(browser, (Object[]) null);</div>
<div style="text-align: left;" class="mycode_align"> } catch<br />
(SecurityException e) {</div>
<div style="text-align: left;" class="mycode_align"> } catch<br />
(NoSuchMethodException e) {</div>
<div style="text-align: left;" class="mycode_align"> } catch<br />
(IllegalArgumentException e) {</div>
<div style="text-align: left;" class="mycode_align"> } catch<br />
(IllegalAccessException e) {</div>
<div style="text-align: left;" class="mycode_align"> } catch<br />
(InvocationTargetException e) {</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> return<br />
null;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public void<br />
execute(final String script) {</div>
<div style="text-align: left;" class="mycode_align">
Display.getDefault().syncExec(new Runnable() {</div>
<div style="text-align: left;" class="mycode_align">
public void run() {</div>
<div style="text-align: left;" class="mycode_align">
getBrowser().execute(script);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> });</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> public void<br />
setURL(final String url) {</div>
<div style="text-align: left;" class="mycode_align">
Display.getDefault().syncExec(new Runnable() {</div>
<div style="text-align: left;" class="mycode_align">
public void run() {</div>
<div style="text-align: left;" class="mycode_align">
getBrowser().setUrl(url);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> });</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
ICondition htmlContains(String expectedText) {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
new HtmlContainsCondition(expectedText);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
Browser getBrowser() {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
(Browser)getWidget();</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> /*<br />
(non-Javadoc)</div>
<div style="text-align: left;" class="mycode_align"> * @see<br />
com.windowtester.runtime.locator.IWidgetLocator#findAll</div>
<div style="text-align: left;" class="mycode_align"> * (com.windowtester.runtime.IUIContext)</div>
<div style="text-align: left;" class="mycode_align"> */</div>
<div style="text-align: left;" class="mycode_align"> public<br />
IWidgetLocator[] findAll(IUIContext ui) {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
browserWidget.findAll(ui);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> /*<br />
(non-Javadoc)</div>
<div style="text-align: left;" class="mycode_align"> * @see<br />
com.windowtester.runtime.locator.IWidgetMatcher#matches</div>
<div style="text-align: left;" class="mycode_align"> * (java.lang.Object)</div>
<div style="text-align: left;" class="mycode_align"> */</div>
<div style="text-align: left;" class="mycode_align"> public boolean matches(Object widget) {</div><div style="text-align: left;" class="mycode_align"> return browserWidget.matches(widget);</div><div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">RCP/SWT</span><span style="font-weight: bold;" class="mycode_b">に組み込まれた</span><span style="font-weight: bold;" class="mycode_b">Swing </span><span style="font-weight: bold;" class="mycode_b">部品のテストについて</span></div><div style="text-align: left;" class="mycode_align">Eclipse上のWTのヘルプを参照してください（"Embedded Swing Components"で検索)。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">GEF<br />
(Graphical Editing Framework)</span><span style="font-weight: bold;" class="mycode_b">について</span></div>
<div style="text-align: left;" class="mycode_align">GEFはCDEに利用されてない為、GEF関係のガイドを省略する。</div>
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">ほかに重要な参照情報</span></div>
<div style="text-align: left;" class="mycode_align">API Ref: WindowTester Pro User<br />
Guide &gt; Reference</div>
<br />
]]></description>
			<content:encoded><![CDATA[以前、Window Tester Proを使って、我々の製品である<a href="http://www.curl.com" target="_blank" rel="noopener" class="mycode_url">Curl</a> のIDEテスト自動化に適用できるかの検証をやってみましたので、<a href="http://www.infoq.com/jp/news/2012/03/WindowTester-Pro;jsessionid=3AFA5D6D138D193D62AF60C653AE3E66" target="_blank" rel="noopener" class="mycode_url">GoogleがWindowTester Proをオープンソース化</a>というニュースが最近出て、少し「あれっ？」と思いました。なぜかと言うと、googleのこの決定は2010年12月に出たので、ちょっと違和感（いまだに？）がある気がしました。が、ネットでうろうろしたら、あっ、オープンソース後の初めてのリリースがこのニュースのきっかけかと気づき納得しました。Windows Tester Proを検証する時に手掛かりが少なく、その時にもしオープンソース版が出たら、ぶつかった壁がもう少し和らいだかもしれません（笑）。<br />
しかし、先ほど<a href="http://code.google.com/javadevtools/wintester/html/whatsnew.html" target="_blank" rel="noopener" class="mycode_url">Window Tester Proの本家</a> に行ってよく確認してみたら、Whats's newを読んでも、別に新しい機能なり、バグ修正なりの情報が全くありませんでした。あれれ、この<a href="http://google-opensource.blogspot.com/2012/03/announcing-windowtester-open-source.html" target="_blank" rel="noopener" class="mycode_url">オープンソース後の初期リリース</a> は何の為だった？バージョンを5.1から6.0に挙げただけ？数か月前に検証した状態と変わってないじゃん、なぞなぞですね...。<br />
<br />
<div style="text-align: left;" class="mycode_align">さて、この日本ではあまりなじみのないツールをせっかく検証しましたので、ちょっと古くなったところがあるかもしれませんが（先ほどの確認によると、この可能性もあまりないですね）、ご参考になる方もいるかもしれませんので、情報をみなさんとシェアしたいと思います。</div>
<br />
<div style="text-align: left;" class="mycode_align">Window Tester Proを利用したい方は、ここのサイトから最新のコードを入手してください：</div>
<div style="text-align: left;" class="mycode_align"> <a href="http://code.google.com/javadevtools/download-wintester.html" target="_blank" rel="noopener" class="mycode_url">http://code.google.com/javadevtools/down...ester.html</a></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">目次</span></div><ul class="mycode_list"><li>1　<span style="color: #552200;" class="mycode_color">概要</span></li>
<li>2　<span style="color: #552200;" class="mycode_color">開発元</span></li>
<li>3　<span style="color: #552200;" class="mycode_color">セットアップ</span></li>
<li>3.1　<span style="color: #552200;" class="mycode_color">Eclipse </span><span style="color: #552200;" class="mycode_color">のインストール（検証はEclipse3.6.2</span><span style="color: #552200;" class="mycode_color">を利用する）。</span></li>
<li>4　<span style="color: #552200;" class="mycode_color">制限事項</span></li>
<li>4.1　<span style="color: #552200;" class="mycode_color">言語サポート</span></li>
<li>4.2　<span style="color: #552200;" class="mycode_color">プラットフォーム制限</span></li>
<li>4.3　<span style="color: #552200;" class="mycode_color">OS</span><span style="color: #552200;" class="mycode_color">の制限</span></li>
<li>5　<span style="color: #552200;" class="mycode_color">利用方法</span></li>
<li>5.1　<span style="color: #552200;" class="mycode_color">記録機能の設定</span></li>
<li>5.2<span style="color: #552200;" class="mycode_color">　CDE</span><span style="color: #552200;" class="mycode_color">テスト時の注意点</span></li>
<li>5.3　<span style="color: #552200;" class="mycode_color">記録問題</span></li>
<li>5.3.1　<span style="color: #552200;" class="mycode_color">Curl</span><span style="color: #552200;" class="mycode_color">側の記録ができない</span></li>
<li>5.3.2　<span style="color: #552200;" class="mycode_color">Drag&amp;Drop</span><span style="color: #552200;" class="mycode_color">が正しく記録できないケースがある</span></li>
<li>5.3.3　<span style="color: #552200;" class="mycode_color">記録漏れがある</span></li>
<li>5.3.4　<span style="color: #552200;" class="mycode_color">ご操作などによって余計な操作を記録される場合がある</span></li>
<li>5.3.5　<span style="color: #552200;" class="mycode_color">ロケールの問題</span></li>
<li>5.3.6　<span style="color: #552200;" class="mycode_color">記録コードが実行できない場合がある（文法エラー）</span></li>
<li>5.4　<span style="color: #552200;" class="mycode_color">検証条件の追加</span></li>
<li>5.4.1　<span style="color: #552200;" class="mycode_color">Assertion Inspector</span><span style="color: #552200;" class="mycode_color">の使用</span></li>
<li>5.4.2　<span style="color: #552200;" class="mycode_color">検証の詳細</span></li>
<li>5.4.2.1　<span style="color: #552200;" class="mycode_color">検証条件</span></li>
<li>5.4.2.2　<span style="color: #552200;" class="mycode_color">普通のUI</span><span style="color: #552200;" class="mycode_color">部品の属性検証(</span><span style="color: #552200;" class="mycode_color">使用可否・テキスト・選択・可視性・フォーカス)</span></li>
<li>5.4.2.3　<span style="color: #552200;" class="mycode_color">検証用ファクトリ</span></li>
<li>5.4.2.4　<span style="color: #552200;" class="mycode_color">条件確保</span></li>
<li>5.4.2.5　<span style="color: #552200;" class="mycode_color">手動で条件検証を作成する</span></li>
<li>5.4.3　<span style="color: #552200;" class="mycode_color">条件と条件ハンドラー</span></li>
<li>5.4.3.1　<span style="color: #552200;" class="mycode_color">条件</span></li>
<li>5.4.3.2　<span style="color: #552200;" class="mycode_color">ハンドラー</span></li>
<li>5.5　<span style="color: #552200;" class="mycode_color">再生時の問題</span></li>
<li>5.5.1　<span style="color: #552200;" class="mycode_color">Java</span><span style="color: #552200;" class="mycode_color">のUI</span><span style="color: #552200;" class="mycode_color">でも、再生する時に、停止されている場合がある</span></li>
<li>5.5.2　<span style="color: #552200;" class="mycode_color">記録した入力が記録時と異なるコードが再生されてしまう</span></li>
<li>5.6<span style="color: #552200;" class="mycode_color">　Welcome</span><span style="color: #552200;" class="mycode_color">ページのテスト</span></li>
<li>5.7　<span style="color: #552200;" class="mycode_color">UI</span><span style="color: #552200;" class="mycode_color">部品の特定方法</span></li>
<li>5.7.1　<span style="color: #552200;" class="mycode_color">Matcher</span><span style="color: #552200;" class="mycode_color">とLocator</span></li>
<li>5.7.2　<span style="color: #552200;" class="mycode_color">UI</span><span style="color: #552200;" class="mycode_color">部品の検索範囲</span></li>
<li>5.7.3　<span style="color: #552200;" class="mycode_color">UI</span><span style="color: #552200;" class="mycode_color">の階層構造の調査</span></li>
<li>5.7.4　<span style="color: #552200;" class="mycode_color">部品の特定</span></li>
<li>5.7.5　<span style="color: #552200;" class="mycode_color">対象外部品の対応</span></li>
<li>6<span style="color: #552200;" class="mycode_color">　RCP/SWT</span><span style="color: #552200;" class="mycode_color">に組み込まれたSwing </span><span style="color: #552200;" class="mycode_color">部品のテストについて</span></li>
<li>7　<span style="color: #552200;" class="mycode_color">GEF (Graphical Editing Framework)</span><span style="color: #552200;" class="mycode_color">について</span></li>
<li>8　<span style="color: #552200;" class="mycode_color">ほかに重要な参照情報</span></li>
<li>9　<span style="color: #552200;" class="mycode_color">CDE</span><span style="color: #552200;" class="mycode_color">テストプランの自動化対象</span><br />
<br />
</li>
</ul>
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">概要</span></div>
<br />
<div style="text-align: left;" class="mycode_align">Window　Tester　ProはEclipseベースのGUI自動テストツールであり、EclipseのPluginテスト、RCPアプリテスト、SWING・SWTアプリテストなどに対応されています。主な機能は記録、テストケース生成、再生、Code Coverage確認などの機能が提供されている。生成されるテストコードはJUnit テストのフォーマットに準処している。本資料では、テスト関連の機能のみ対象とする。<br />
</div>
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">開発元</span></div>
<a href="http://www.instantiations.com/" target="_blank" rel="noopener" class="mycode_url">Instantiations</a>に開発され、<a href="http://code.google.com/javadevtools/wintester/html/index.html" target="_blank" rel="noopener" class="mycode_url">google</a>に買収された後に、Apacheにコントリビューされました。今はApache2ライセンスのオープンソースです。<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">セットアップ</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Eclipse </span><span style="font-weight: bold;" class="mycode_b">のインストール（検証は</span><span style="font-weight: bold;" class="mycode_b">Eclipse3.6.2</span><span style="font-weight: bold;" class="mycode_b">を利用する）。</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><a href="http://www.curlap.com/download/ide/" target="_blank" rel="noopener" class="mycode_url">CDE</a> をEclipseにインストールする</div>
<br />
<div style="text-align: left;" class="mycode_align">Window Testerを<a href="http://code.google.com/javadevtools/download-wintester.html" target="_blank" rel="noopener" class="mycode_url">次のURLから</a><a href="http://code.google.com/javadevtools/wintester/html/installation.html" target="_blank" rel="noopener" class="mycode_url">Eclipseにインストールできる</a></div>
<br />
<div style="text-align: left;" class="mycode_align"> Eclipse 3.6 (Helios)</div>
<div style="text-align: left;" class="mycode_align"> <a href="http://dl.google.com/eclipse/inst/windowtester/latest/3.6" target="_blank" rel="noopener" class="mycode_url">http://dl.google.com/eclipse/inst/window...latest/3.6</a></div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"> Eclipse 3.5 (Galileo)</div>
<div style="text-align: left;" class="mycode_align"> <a href="http://dl.google.com/eclipse/inst/windowtester/latest/3.5" target="_blank" rel="noopener" class="mycode_url">http://dl.google.com/eclipse/inst/window...latest/3.5</a></div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"> Eclipse3.7の正式版はまだリリースされてなく、次のサイトから、ベータ版のインストールができる</div>
<div style="text-align: left;" class="mycode_align"> <a href="http://code.google.com/javadevtools/download-wintester-beta.html" target="_blank" rel="noopener" class="mycode_url">http://code.google.com/javadevtools/down...-beta.html</a></div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">制限事項</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">言語サポート</span></div>
<br />
<div style="text-align: left;" class="mycode_align">次のの言語のみサポートされている（2011年/10/24, ver.6.0.0）</div>
<div style="text-align: left;" class="mycode_align">English</div>German (Germany)<br />
Dutch (Belgium)<br />
French (France)<br />
Spanish (Spain)<br />
Swedish (Sweden)<br />
Japanese (Japan)<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">その他: enterText の問題及び回避策 </div>
<br />
<div style="text-align: left;" class="mycode_align"> ":" と日本語入力の問題,について、次の回避策は":"の問題のみ対応可能で, 日本語入力の問題はまだ対応策を見つかってません, このニュースグループ<a href="http://groups.google.com/group/windowtester-pro/browse_thread/thread/6375ba9a5d6b605f" target="_blank" rel="noopener" class="mycode_url">WT news group</a>に質問したんですが、返事がすぐに来なくて、数週間たってやっと来た感じですが、もう検証が終わってしまい、対策の検証ができなかった）</div>
<br />
<div style="text-align: left;" class="mycode_align"> /**</div>
<br />
<div style="text-align: left;" class="mycode_align"> * Use this if ui.enterText(String<br />
s) does not enter some chars correctly.</div>
<br />
<div style="text-align: left;" class="mycode_align"> *</div>
<br />
<div style="text-align: left;" class="mycode_align"> * @param s</div>
<br />
<div style="text-align: left;" class="mycode_align"> * The text to be entered</div>
<br />
<div style="text-align: left;" class="mycode_align"> * @param language</div>
<br />
<div style="text-align: left;" class="mycode_align"> * examples: "en" for English,<br />
"de" for German</div>
<br />
<div style="text-align: left;" class="mycode_align"> * @param country</div>
<br />
<div style="text-align: left;" class="mycode_align"> * examples: "US" for USA,<br />
"DE" for Germany</div>
<br />
<div style="text-align: left;" class="mycode_align"> */</div>
<br />
<div style="text-align: left;" class="mycode_align"> private void<br />
enterTextWithTempLocale(String s, String language, String country)</div>
<br />
<div style="text-align: left;" class="mycode_align"> {</div>
<br />
<div style="text-align: left;" class="mycode_align"> Locale defaultLocale =<br />
Locale.getDefault(); // remember previous Locale</div>
<br />
<div style="text-align: left;" class="mycode_align"> Locale.setDefault(new<br />
Locale(language, country));</div>
<br />
<div style="text-align: left;" class="mycode_align"> WT.setLocaleToCurrent();</div>
<br />
<div style="text-align: left;" class="mycode_align"> ui.enterText(s); // enter the<br />
text in the ui</div>
<br />
<div style="text-align: left;" class="mycode_align">
Locale.setDefault(defaultLocale); // reset to previous locale</div>
<br />
<div style="text-align: left;" class="mycode_align"> WT.setLocaleToCurrent();</div>
<br />
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">上記の回避策はここから持ってきた: <a href="http://forums.instantiations.com/topic-5-3938.html" target="_blank" rel="noopener" class="mycode_url">http://forums.instantiations.com/topic-5-3938.html</a> </div>
<br />
<div style="text-align: left;" class="mycode_align">追加情報：<br />
　　enterTextは上記の対策で日本語キーボードに対応でき、かな入力に対応できそうになるが、どうもenterText自体は、文字一つは一つのキーとして入力しようとする為、“プロジェクト“や“日本語”など、入力できません。具体的に、次のコードで再生する時に、Fatal Error が発生し、Eclipseがクラッシュしてしまう：</div>
<br />
<div style="text-align: left;" class="mycode_align"> enterTextWithTempLocale(<br />
</div><div style="text-align: left;" class="mycode_align"> "C:\\Curl マニフェスト名\\myfile.text", </div>"ja",<br />
<div style="text-align: left;" class="mycode_align">"JP");</div>
<div style="text-align: left;" class="mycode_align">また、次のようなコードで再生すると、”:”の問題が解消できたが、その後ろの文字が入力出来なくなってしまった。</div>
<div style="text-align: left;" class="mycode_align"> enterTextWithTempLocale(</div>　　"C:\\temp\\files\\myfile.text", "ja","JP");<br />
<br />
ほかにもたくさんのケースを試した結果、結局解消できない：<br />
<br />
<div style="text-align: left;" class="mycode_align">//<br />
C*\ReadOnlyDirになる（標準APIのデフォルト）<br />
</div>System.out.println("********ui.enterText:");<br />
ui.enterText("C:\\ReadOnlyDir"); <br />
// C:\Ra になる、また、画面上誤動作が引き起こす<br />
// （旧メーカ掲示板情報による対応、ALT+Shortcutキーのような場合発生する、ログによると、e -&gt; e + ALT になる）<br />
<br />
<div style="text-align: left;" class="mycode_align">System.out.println("********LocaleTools.enterTextWithTempLocale(\"C:\\ReadOnlyDir\",\"ja\",\"JP\",ui):");</div>LocaleTools.enterTextWithTempLocale("C:\\ReadOnlyDir","ja","JP",ui);<br />
<div style="text-align: left;" class="mycode_align">System.out.println("********LocaleTools.enterTextWithTempLocale(\"C:\\ReadOnlyDir\",ui):");</div>LocaleTools.enterTextWithTempLocale("C:\\ReadOnlyDir",ui);<span style="font-weight: bold;" class="mycode_b"><br />
<br />
プラットフォーム制限</span><br />
<br />
<div style="text-align: left;" class="mycode_align"> WTは現状次のEclipseバージョンのみ対応している： Eclipse3.4, 3.5, 3.6 Eclipse 3.7の対応ステータスはベータ（検証してません）</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">OS</span><span style="font-weight: bold;" class="mycode_b">の制限</span></div>
<div style="text-align: left;" class="mycode_align"> 特になし、Linux上でも利用可。ただし、ファイルパスなど、OS依存の部分がテストケースにある場合、分岐処理をカスタマイズして対応する必要がある。なお、ロケールの問題もあり、メッセージ・ラベルなど英語・日本語両方対応する必要がある為、同じく分岐処理が必要（OSではなく、OSのデフォルトロケールによって処理を振り分け）。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">利用方法</span></div>
<br />
<div style="text-align: left;" class="mycode_align"> WindowTester Pro User Guide（Eclipseのヘルプ画面）で習得できます。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">記録機能の設定</span></div>[*]記録機能を利用する前に、設定が必要です、ユーザガイドに設定方法が紹介されていますが、本検証中に利用している設定を次の通りに例としてリストする。Record Configurations --- main<br />
<br />
<div style="text-align: left;" class="mycode_align"><img src="http://update.curl.com/images/RecordConfig_main.jpg" alt="[Image: RecordConfig_main.jpg]" class="mycode_img" /></div>
<br />
<div style="text-align: left;" class="mycode_align">
Record Configurations --- Arguments<br />
<br />
 <img src="http://update.curl.com/images/RecordConfig_Arguments.jpg" alt="[Image: RecordConfig_Arguments.jpg]" class="mycode_img" /></div>
<br />
<div style="text-align: left;" class="mycode_align">
Record Configurations --- Plugins<br />
<br />
<img src="http://update.curl.com/images/RecordConfig_Plugins.jpg" alt="[Image: RecordConfig_Plugins.jpg]" class="mycode_img" /></div>
<br />
<div style="text-align: left;" class="mycode_align">
Record Configurations --- Configuration<br />
<br />
 <img src="http://update.curl.com/images/RecordConfig_Configuration.jpg" alt="[Image: RecordConfig_Configuration.jpg]" class="mycode_img" /></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">CDE</span><span style="font-weight: bold;" class="mycode_b">テスト時の注意点</span></div>
[*]Recordする前に、CurlのRTEを終了させる必要がある、CDEのテストを記録する為のEclipseでCDEを起動しない、万が一起動されてしまったら、CurlのRTEを強制でも終了させてください。[*]記録時の環境は英語環境がお勧めです。テストコード・テスト条件・テストケースの作成時に、よく利用するメッセージの特定は英語で確認しやすいためだ。（日本語環境の場合、UIのメッセージ・テキストが日本語になっている為、propritiesファイルが特定のツールを使わないと読めない。　例：　ファイルeclipse\com.curl.eclipse.plugin\src\com\curl\eclipse\ui\CurlUIMessages_ja.properties<br />
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">記録問題</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Curl</span><span style="font-weight: bold;" class="mycode_b">側の記録ができない</span></div>
<br />
<div style="text-align: left;" class="mycode_align">JavaのUIしかレコードできない為、VLEやVLEE、ほかのCurlでできたツールのレコードができない。解決策：なし</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Drag&amp;Drop</span><span style="font-weight: bold;" class="mycode_b">が正しく記録できないケースがある</span></div>
<br />
<div style="text-align: left;" class="mycode_align">（手動で追加できるか、確認する必要がある）全く記録されないか、部分的に記録される、再生に利用できないコードになっている。解決策：手動で記録コードを追加する。例：to be added.</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">記録漏れがある</span></div>
<br />
<div style="text-align: left;" class="mycode_align">記録中に、記録漏れが発生する場合がある。例：ダイアログの表示・非表示解決策：手動で記録コードを追加する。例：ui.wait(new ShellShowingCondition("Curlメディエーターの開始中")); ui.wait(new ShellDisposedCondition("Curlメディエーターの開始中"));</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">ご操作などによって余計な操作を記録される場合がある</span></div>
<br />
<div style="text-align: left;" class="mycode_align">例：Welcome画面の閉じる操作など。解決策：不要なオペレーションが記録された場合に、該当コードをコメントアウトする。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">ロケールの問題</span></div>
<br />
<div style="text-align: left;" class="mycode_align">記録時に、ダイアログやUIのIDは記録した時の言語設定によって、日本語か英語になるが、再生の環境によって、言語設定が記録時と異なる場合がある。解決策：CDE pluginのパッケージをインポートし、CDE pluginのパッケージに定義されているロケール対応の文字列定数を利用して、対応可能。例：ui.wait(new<br />
ShellShowingCondition(InstallHandlerMessages.InstallHandler_Starting_Mediator)); この行のコードにあるInstallHandler_Starting_Mediatorは記録時に、日本語環境の場合、ui.wait(new ShellShowingCondition("Curlメディエーターの開始中"));になるが、パッケージクラスcom.curl.eclipse.InstallHandlerMessagesをインポートすれば、定数を直接利用し、Eclipseのローカライズ機能で対応できる。</div>
<br />
<div style="text-align: left;" class="mycode_align">上記プロパティファイルで対応できるのが、Dialogや、ラベルのメッセージのみで、メイン画面のMenuの場合、plugin.xmlで定義されており、この方法で対応できません。代替案が必要と思われます（制限付きの対応になるなど）</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">記録コードが実行できない場合がある（文法エラー）</span></div>
<br />
<div style="text-align: left;" class="mycode_align">例：Curlのコード行がある行の横のルーラをダブルクリックする処理を記録したコードは次になっているが、文法エラーです。</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"> AnnotationRulerColumn&#36;5.class,<br />
1, new SWTWidgetLocator(</div>
<br />
<div style="text-align: left;" class="mycode_align"> CompositeRuler&#36;CompositeRulerCanvas.class)),<br />
4, 143));</div>
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">CompositeRulerCanvasがパッケージアクセス属性の為、定義されたパッケージ外からアクセスできない！（のに、記録された）</div>
<br />
<div style="text-align: left;" class="mycode_align">また、&#36;5もなぜ記録コードに入っているか不明(インナークラスのようだが。。。）、CompositeRuler&#36;CompositeRulerCanvasにある&#36;もdot(.)にすべき。</div>
<br />
<div style="text-align: left;" class="mycode_align">対策：不明</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">検証条件の追加</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Assertion<br />
Inspector</span><span style="font-weight: bold;" class="mycode_b">の使用</span></div>
<br />
<div style="text-align: left;" class="mycode_align">記録時に記録バーにあるassertion inspector tool(虫眼鏡アイコン)を使えば、記録すると同時に検証条件を追加できる。このツールを起動したら、検証対象のコントロールにマウスホバーをすると、該当対象の検証できる属性が表示されるので、検索条件を記録コードに追加することができる。<img src="http://update.curl.com/images/Assertion_inspector.png" alt="[Image: Assertion_inspector.png]" class="mycode_img" /></div>
<br />
<div style="text-align: left;" class="mycode_align">制限事項：<br />
<br />
1. メニュー・メニューアイテムに対応されてない。<br />
<br />
2. Editorの左側のルーラ(AnnotationRulerColumn)対応できない（&#36;5などが追加される）<br />
<br />
3. CurlEditorのコンテンツの検証ができない（色、下線などのスタイル、選択、クイックメニュー、コード補完）</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">検証の詳細</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">検証条件</span></div>
<br />
<div style="text-align: left;" class="mycode_align">特定の対象のプロパティを条件に満たすか検証する。例：<br />
<br />
ui.assertThat(new ShellShowingCondition("Input Dialog"));<br />
<br />
WTは複数種類の条件を検証できる。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">普通の</span><span style="font-weight: bold;" class="mycode_b">UI</span><span style="font-weight: bold;" class="mycode_b">部品の属性検証</span><span style="font-weight: bold;" class="mycode_b">(</span><span style="font-weight: bold;" class="mycode_b">使用可否・テキスト・選択・可視性・フォーカス</span><span style="font-weight: bold;" class="mycode_b">)</span></div>
<br />
<div style="text-align: left;" class="mycode_align">次の属性条件が用意されている。</div>
<br />
<div style="text-align: left;" class="mycode_align">部品のenabled検証</div>
<br />
<div style="text-align: left;" class="mycode_align">IsEnabledConditionを利用する。IsEnabledインターフェースを実装した LocatorはIsEnabledConditionを使って、enabled属性の検証ができる。</div>
<br />
<div style="text-align: left;" class="mycode_align">部品のテキスト検証</div>
<br />
<div style="text-align: left;" class="mycode_align">HasTextConditionを利用する。HasTextインターフェースを実装した LocatorはHasTextConditionを使って、部品に格納されるテキストの検証ができる。同様に、上記以外に次のような条件も用意されている：</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">IsSelected and IsSelectedCondition</div>
<br />
<div style="text-align: left;" class="mycode_align">IsVisible and IsVisibleCondition</div>
<br />
<div style="text-align: left;" class="mycode_align">HasFocus and HasFocusCondition</div>
検証条件例：<br />
“Finished”ボタンが使用可能の判断条件：<br />
<div style="text-align: left;" class="mycode_align">
ui.assertThat(new IsEnabledCondition(new ButtonLocator("Finished"),<br />
true));</div>
<div style="text-align: left;" class="mycode_align">某ウィザードダイアログのUIにエラーメッセージを含まれているかの判断条件： <br />
<br />
ui.assertThat(new HasTextCondition(new WizardErrorMessageLocator(), "エラーメッセージ"));</div>
<br />
<div style="text-align: left;" class="mycode_align">または、条件に合わない場合検証エラーのメッセージ付きの判断条件は次のように書く：</div>
<div style="text-align: left;" class="mycode_align">
<br />
ui.assertThat("Finish button should be enabled", new<br />
IsEnabledCondition(new ButtonLocator("Finished"), true)); <br />
<br />
ui.assertThat("The error message is wrong", new<br />
HasTextCondition(new WizardErrorMessageLocator(), "some wizard<br />
message"));</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">§ <br />
実際に、実装された条件であれば、どれでも検証可能だ。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">検証用ファクトリ</span></div>
<br />
<div style="text-align: left;" class="mycode_align">便利にコードを書く為、一部のLocatorに条件を生成するファクトリが実装されている。上記の二つの例だと、次のようにも書ける：<br />
<br />
ui.assertThat(new ButtonLocator("Finished").isEnabled());<br />
<br />
ui.assertThat(new WizardErrorMessageLocator().hasText("some wizard<br />
message"));</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">条件確保</span></div>
<br />
<div style="text-align: left;" class="mycode_align">一部の条件で、属性をtrueになっていることを確保（保証）するような書き方もある。それらの条件はcom.windowtester.runtime.condition.IConditionHandler<br />
を実装していて、IUIContext.ensureThat(..)<br />
に渡している。</div>
<br />
<div style="text-align: left;" class="mycode_align">Welcomeページをクローズされていることを確保する実装例：</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">public class BaseTest extends UITestCaseSWT {</div>
<br />
<div style="text-align: left;" class="mycode_align"> protected void setUp() throws Exception<br />
{</div>
<br />
<div style="text-align: left;" class="mycode_align"> closeWelcomePageIfNecessary();</div>
<br />
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">protected void closeWelcomePageIfNecessary() throws Exception {</div>
<br />
<div style="text-align: left;" class="mycode_align"> IWidgetLocator[]<br />
welcomeTab = getUI().findAll(new CTabItemLocator("Welcome"));</div>
<br />
<div style="text-align: left;" class="mycode_align"> if (welcomeTab.length == 0)</div>
<br />
<div style="text-align: left;" class="mycode_align"> return;</div>
<br />
<div style="text-align: left;" class="mycode_align"> getUI().close(welcomeTab[0]);</div>
<br />
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">手動で条件検証を作成する</span></div>
<br />
<div style="text-align: left;" class="mycode_align">既存の条件(ICondition)で検証目的に達成できない場合、独自に実装することも可能。ただし、条件を検証する処理は、テストスレッドで実装してはいけなくて、UIスレッドで実装する必要がある。テストスレッド側で、検証処理をRunnableを経由して呼び出す必要がある。</div>
<br />
<div style="text-align: left;" class="mycode_align">実装例：</div>
<br />
<div style="text-align: left;" class="mycode_align">ツリーアイテムをドラッグして、別のツリーアイテムにドロップし、一つ目のラベルが期待したラベルになる検証。</div>
<br />
<div style="text-align: left;" class="mycode_align">//select a tree item <br />
</div>
<div style="text-align: left;" class="mycode_align">ui.click(new TreeItemLocator("treeItem2"));</div>
<div style="text-align: left;" class="mycode_align">//drag and drop it on another</div>
<div style="text-align: left;" class="mycode_align">ui.dragTo(new XYLocator(new<br />
TreeItemLocator("treeItem2"), 5, 5));</div>
<div style="text-align: left;" class="mycode_align">//perform assertions safely on the UI thread</div>
<div style="text-align: left;" class="mycode_align">Display.getDefault().syncExec( new Runnable() {</div>
<div style="text-align: left;" class="mycode_align"> public void run() { </div>
<div style="text-align: left;" class="mycode_align"> //get<br />
the tree widget</div>
<div style="text-align: left;" class="mycode_align"> Tree<br />
tree = (Tree)((IWidgetReference)ui.find(new<br />
SWTWidgetLocator(Tree.class))).getWidget();</div>
<div style="text-align: left;" class="mycode_align"> //the<br />
first item in the tree should now have the EXPECTED label</div>
<div style="text-align: left;" class="mycode_align"> TestCase.assertEquals(EXPECTED_LABEL,<br />
tree.getItems()[0].getText());</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">});</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">上記の条件検証方法があるが、テストケースのメンテナンス性や、実行時の健全性などを考えると、IConditionで実装し、WTの検証条件の仕組みを利用すべき。次の節も参照してください。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">条件と条件ハンドラー</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">条件</span></div>
<br />
<div style="text-align: left;" class="mycode_align">条件は特定の状態が存在しているかをチェックする為のオブジェクト、ハンドラーは条件がtrueになる場合に起こすべき処理をカプセル化する。条件はテストの実行とテストされているアプリケーションの実行を同調させることができる、あるいはテストで特定のシチュエーションを検証する。</div>
<br />
<div style="text-align: left;" class="mycode_align">例えば、UIスレッドのある処理を待つ為に、Thread.sleep(5000);処理より、条件を使えば、テストスレッドとアプリケーションスレッドの同調の信頼性が高くなる。</div>ui.wait(new ShellShowingCondition("My<br />
<div style="text-align: left;" class="mycode_align">Dialog"));</div>
<div style="text-align: left;" class="mycode_align">ui.wait(new ShellDisposedCondition("My<br />
Dialog"));</div>
<div style="text-align: left;" class="mycode_align">ui.wait(new IsEnabledCondition(new<br />
ButtonLocator("Finish")));</div>
<div style="text-align: left;" class="mycode_align">ui.wait(new FileExistsCondition("MyProject/newFile.txt")),<br />
true);</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">あるいはSwingの場合</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">ui.wait(new WindowShowingCondition("My<br />
Dialog"));</div>
<div style="text-align: left;" class="mycode_align">ui.wait(new WindowDisposedCondition("My<br />
Dialog"));</div>
<div style="text-align: left;" class="mycode_align">ui.wait(new IsEnabledCondition(new<br />
JButtonLocator("Finish")));</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">ほかのICondition, IUIConditionの対応状況は次のAPI Refを参考してください：<br />
<br />
com.windowtester.runtime.condition<br />
<br />
com.windowtester.runtime.swing.condition<br />
<br />
com.windowtester.runtime.swt.condition<br />
<br />
com.windowtester.runtime.swt.condition.eclipse<br />
<br />
com.windowtester.runtime.swt.condition.shell<br />
<br />
com.windowtester.runtime.swing.condition</div>
<br />
<div style="text-align: left;" class="mycode_align">上記以外に、Condition ファクトリを利用することも可能。例<br />
<br />
ui.assertThat(new ButtonLocator("OK").isEnabled());</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">ハンドラー</span></div>
<br />
<div style="text-align: left;" class="mycode_align">条件/ハンドラーはペアでIConditionMonitorまたはIShellMonitorに登録され、予想できないイベントへの対処を頑丈にできる。次のサンプルはテストの過程で稀にライセンスダイアログが表示されるケースがあってもテストが正常に遂行できるようにライセンスダイアログが表示されたら"OK"ボタンをクリックさせる為の条件/Handlerを作成し、モニターに登録する。</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">monitor = (IConditionMonitor)<br />
ui.getAdapter(IConditionMonitor.class);</div>
<div style="text-align: left;" class="mycode_align">monitor.add(new<br />
ShellShowingCondition("License*"), new IHandler() {</div>
<div style="text-align: left;" class="mycode_align"> public handle(IUIContext ui) {</div>
<div style="text-align: left;" class="mycode_align"> ui.click(new ButtonLocator("OK"));<br />
</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">});</div>
条件は常にUIのアクションより先に処理される<br />
<br />
//conditions processed before menu selection<br />
<br />
<div style="text-align: left;" class="mycode_align">ui.click(new MenuItemLocator("New/File"));</div>
<br />
<div style="text-align: left;" class="mycode_align">//conditions processed during wait</div>
<br />
<div style="text-align: left;" class="mycode_align">ui.wait(New ShellShowingCondition("New File"));</div>
<br />
<div style="text-align: left;" class="mycode_align">//conditions processed before click</div>
<br />
<div style="text-align: left;" class="mycode_align">ui.click(new ButtonLocator("Cancel"));</div>
<br />
<div style="text-align: left;" class="mycode_align">//conditions processed during wait</div>
<br />
<div style="text-align: left;" class="mycode_align">ui.wait(new ShellDisposedCondition("New File"));</div>
<br />
<br />
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">Swing Conditionの場合、CDEで利用しない為、省略。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">再生時の問題</span></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Java</span><span style="font-weight: bold;" class="mycode_b">の</span><span style="font-weight: bold;" class="mycode_b">UI</span><span style="font-weight: bold;" class="mycode_b">でも、再生する時に、停止されている場合がある</span></div>
<br />
<div style="text-align: left;" class="mycode_align">対策：ユーザが止まっている個所を確認し、手動でその操作を追加し、その後の再生が継続される。たとえば、New Curl<br />
Projectの選択、再生されない場合がある。それは再生時に、Mediatorの起動に時間がかかり、Curlのビューが選択された後に、CurlのメニューがまだEclipseに作成されてない為、次のステップはCurlの新規Projectを作成する処理で失敗する（該当メニューが見つからない）為だ。</div>
<br />
<div style="text-align: left;" class="mycode_align">この問題の対応は、ui.waitの追加が必要。つまりMediatorにつなぐダイアログの表示・非表示を待たせて、このダイアログが消えたら、次のステップに進むようにテストの記録コードに処理を追加する必要がある。</div>
<br />
<div style="text-align: left;" class="mycode_align">例</div>
<br />
<div style="text-align: left;" class="mycode_align">ui.wait(new ShellShowingCondition(</div>
<br />
<div style="text-align: left;" class="mycode_align">
InstallHandlerMessages.InstallHandler_Starting_Mediator));//"Curlメディエーターの開始中"</div>
<br />
<div style="text-align: left;" class="mycode_align">ui.wait(new ShellDisposedCondition(</div>
<br />
<div style="text-align: left;" class="mycode_align">
InstallHandlerMessages.InstallHandler_Starting_Mediator));//"Curlメディエーターの開始中"</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">記録した入力が記録時と異なるコードが再生されてしまう</span></div>
<br />
<div style="text-align: left;" class="mycode_align">例えば、CurlEditorに手動で入力したコード</div>
<br />
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align"> {define-proc public {test-code<br />
in:String}:void </div>
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">が、再生する時に、次のコードで入力されてしまう：</div>{define-proc public {test-code<br />
<div style="text-align: left;" class="mycode_align">in*String}*void</div>
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">対策：不明</div>
[*]テスト結果[*]テストが失敗する場合に、失敗した時のscreen shotsが自動的に作成される。<br />
[*]その他メモ<br />
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Welcome</span><span style="font-weight: bold;" class="mycode_b">ページのテスト</span></div>
<br />
[*]デフォルトはEclipseのWelcome画面がテストされません、テストする必要になる場合、次のように、セットアップメソッドのカスタマイズなどが必要です。例：<br />
<br />
<div style="text-align: left;" class="mycode_align">public class BaseTest extends UITestCaseSWT {</div>
<div style="text-align: left;" class="mycode_align"> @Override</div>
<div style="text-align: left;" class="mycode_align"> protected<br />
void setUp() throws Exception {</div>
<div style="text-align: left;" class="mycode_align"> closeWelcomePageIfNecessary();</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<div style="text-align: left;" class="mycode_align">//Handling the “Welcome” page involves the following<br />
steps:</div>
<br />
<div style="text-align: left;" class="mycode_align">//Test if it is visible </div>
<div style="text-align: left;" class="mycode_align">//If it is visible, dismiss it </div>
<div style="text-align: left;" class="mycode_align">//The closeWelcomePageIfNecessary() method does just<br />
that:</div>
<br />
<div style="text-align: left;" class="mycode_align">protected void closeWelcomePageIfNecessary() throws<br />
WidgetSearchException {</div>
<div style="text-align: left;" class="mycode_align"> IUIContext<br />
ui = getUI();</div>
<div style="text-align: left;" class="mycode_align"> IWidgetLocator[]<br />
welcomeTab = ui.findAll(new CTabItemLocator("Welcome"));</div>
<div style="text-align: left;" class="mycode_align"> if<br />
(welcomeTab.length == 0)</div>
<div style="text-align: left;" class="mycode_align"> return;</div>
<div style="text-align: left;" class="mycode_align"> ui.close(welcomeTab[0]);</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<br />
テストケースで保存されてないEditorバッファがある場合の対応。未保存のEditorバッファがある場合、テストが終了できない、または終了に時間がかかる（UIの生成がある為）。それを回避するために、コードでバッファを保存するような処理を書く必要がある。<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">例：（SWTテストの例、Pluginテストは同様だと思われる）</div>
<br />
<div style="text-align: left;" class="mycode_align">public class DirtyEditorCondition implements ICondition<br />
{</div>
<div style="text-align: left;" class="mycode_align"> public　boolean test() {</div>
<div style="text-align: left;" class="mycode_align"> final　boolean result[] = new boolean[] { false };</div>
<div style="text-align: left;" class="mycode_align"> Display.getDefault().syncExec(new　Runnable() {</div>
<div style="text-align: left;" class="mycode_align"> public　void run() {</div>
<div style="text-align: left;" class="mycode_align">　　result[0]　= anyUnsavedChanges0();</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> });</div>
<div style="text-align: left;" class="mycode_align"> return　result[0];</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> protected　static boolean anyUnsavedChanges0() {</div>
<div style="text-align: left;" class="mycode_align"> IWorkbenchWindow[]　windows = PlatformUI.getWorkbench().getWorkbenchWindows();</div>
<div style="text-align: left;" class="mycode_align"> for　(int i = 0; i &lt; windows.length; i++) {</div>
<div style="text-align: left;" class="mycode_align"> IWorkbenchPage[]　pages = windows.getPages();</div>
<div style="text-align: left;" class="mycode_align"> for<br />
(int j = 0; j &lt; pages.length; j++) {</div>
<div style="text-align: left;" class="mycode_align"> IEditorReference[]<br />
editorRefs = pages[j].getEditorReferences();</div>
<div style="text-align: left;" class="mycode_align"> for<br />
(int k = 0; k &lt; editorRefs.length; k++) {</div>
<div style="text-align: left;" class="mycode_align"> IEditorReference<br />
each = editorRefs[k];</div>
<div style="text-align: left;" class="mycode_align"> if<br />
(each.isDirty())</div>
<div style="text-align: left;" class="mycode_align"> return<br />
true;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> return<br />
false;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align">//(The details are unsurprising. The one thing to note<br />
is that we need to ensure that </div>
<div style="text-align: left;" class="mycode_align">//we safely access the workbench windows on the UI<br />
thread.)</div>
<br />
<div style="text-align: left;" class="mycode_align">//With our DirtyEditorCondition in hand, we can hook<br />
into teardown like this:</div>
<br />
<div style="text-align: left;" class="mycode_align">public class BaseTest extends UITestCaseSWT {</div>
<div style="text-align: left;" class="mycode_align"> ... same<br />
as above</div>
<div style="text-align: left;" class="mycode_align"> @Override</div>
<div style="text-align: left;" class="mycode_align"> protected<br />
void tearDown() throws Exception {</div>
<div style="text-align: left;" class="mycode_align"> saveAllIfNecessary();</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> protected<br />
void saveAllIfNecessary() throws WidgetSearchException {</div>
<div style="text-align: left;" class="mycode_align"> if<br />
(anyUnsavedChanges())</div>
<div style="text-align: left;" class="mycode_align"> getUI().click(new<br />
MenuItemLocator("File/Save All"));</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> private<br />
boolean anyUnsavedChanges() {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
new DirtyEditorCondition().test();</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">UI</span><span style="font-weight: bold;" class="mycode_b">部品の特定方法</span></div><div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">Matcher</span><span style="font-weight: bold;" class="mycode_b">と</span><span style="font-weight: bold;" class="mycode_b">Locator</span></div>
<div style="text-align: left;" class="mycode_align">WindowTesterでMatcherとLocatorでUI部品を特定する。</div>
<br />
<br />
<br />
<br />
<div style="text-align: left;" class="mycode_align">LocatorはMatcherの子供</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">public interface IWidgetMatcher {</div>
<div style="text-align: left;" class="mycode_align"> boolean<br />
matches(Object widget);</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align">//Widget locators are matchers. </div>
<div style="text-align: left;" class="mycode_align">public interface IWidgetLocator extends IWidgetMatcher { ... }</div><div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">UI</span><span style="font-weight: bold;" class="mycode_b">部品の検索範囲</span></div>
<div style="text-align: left;" class="mycode_align">部品の検索はWindowTester の実行環境がwidget　finderに代理され、アクティブになっているアプリケーション画面のみ、検索対象にする。テストされているアプリが画面(Window)を持ってない場合、例外がfinderにスローされる。検索は外から中へ、上から下へ、左から上への順で探す、次のイメージ：(button-&gt; label -&gt; text -&gt; the second composite -&gt; the last text widget)<img src="http://update.curl.com/images/WidgetSearch.jpg" alt="[Image: WidgetSearch.jpg]" class="mycode_img" /></div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">UI</span><span style="font-weight: bold;" class="mycode_b">の階層構造の調査</span></div>
<br />
<div style="text-align: left;" class="mycode_align">SWTDebugHelperでUIの階層構造を標準コンソールに出力することが可能。</div>
<br />
<div style="text-align: left;" class="mycode_align">例: EclipseのAboutダイアログのUI階層をコンソールに出力するサンプル</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">public void testSpelunkAboutWindow() throws Exception {</div>
<div style="text-align: left;" class="mycode_align"> IUIContext<br />
ui = getUI();</div>
<div style="text-align: left;" class="mycode_align"> ui.click(new<br />
MenuItemLocator("Help/About Eclipse SDK"));</div>
<div style="text-align: left;" class="mycode_align"> ui.wait(new<br />
ShellShowingCondition("About Eclipse SDK"));</div>
<div style="text-align: left;" class="mycode_align"> new<br />
DebugHelper().printWidgets();</div>
<div style="text-align: left;" class="mycode_align"> ui.click(new<br />
ButtonLocator("OK"));</div>
<div style="text-align: left;" class="mycode_align"> ui.wait(new<br />
ShellDisposedCondition("About Eclipse SDK"));</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">部品の特定</span></div>
<br />
<div style="text-align: left;" class="mycode_align">§ <br />
部品を特定する簡易的な方法は2つある：</div>
<br />
<div style="text-align: center;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">IUIContext.find(..) </span><span style="font-weight: bold;" class="mycode_b">または IUIContext.findAll(..))</span></div>
<br />
<div style="text-align: left;" class="mycode_align">IUIContext.find(ILocator)</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">一つ以上の部品を条件に合った場合、<br />
MultipleWidgetsFoundException がスローされる。注意：IUIContext.click(ILocator) がIUIContext.find(ILocator)に代表されるのでILocatorが一つ以上存在する場合、同じようにMultipleWidgetsFoundException<br />
がスローされる。</div>
<br />
<div style="text-align: left;" class="mycode_align">IUIContext.findAll(ILocator)</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">マッチしたすべての部品がアレイにセットされ返却される。</div>
<br />
<div style="text-align: left;" class="mycode_align">幾つか例を見よう。</div>
<br />
<div style="text-align: left;" class="mycode_align">例えば、“OK”ボタンを探すために、ui.find(new<br />
ButtonLocator("OK"));を使えばいい（もちろん、見つからない、または二つ以上見つかった場合に、例外がスローされる）。</div>
<br />
<div style="text-align: left;" class="mycode_align">対照的にui.findAll(new ButtonLocator("OK"));を使うと、見つかった“OK”ボタンがすべてアレイにセットされる（空かもしれないが）</div>
<br />
<div style="text-align: left;" class="mycode_align">一般的に、“OK”ボタンが同じ画面上に一個しかないのが普通ですが、複数ある場合に、取得したいボタンの場所、UIの階層情報を利用して、特定できる。</div>
<br />
<div style="text-align: left;" class="mycode_align">例：new ButtonLocator("OK", new<br />
SWTWidgetLocator(Composite.class)) このコードは、Compositeの中に入っているボタンを取得する（ほかの“OK”ボタンがこのCompositeに入ってない場合）。</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">§ <br />
確実に部品を特定する方法は部品にタグを付けさせることで、テストケースの開発段階で該当UIにユニークな名前を付けると特定しやすくなる。例：widget.setData("name", "widgetName"); </div>
<div style="text-align: left;" class="mycode_align">テストケースで呼び出す時に次のように利用できる：</div>
<br />
<div style="text-align: left;" class="mycode_align">NamedWidgetLocator widgetLocator = new<br />
NamedWidgetLocator("widgetName");</div>
<div style="text-align: left;" class="mycode_align">IWidgetReference widgetRef = (IWidgetReference)ui.find(widgetLocator);</div>
<div style="text-align: left;" class="mycode_align">assertNotNull(widgetRef);</div>
<div style="text-align: left;" class="mycode_align">ui.click(widgetLocator); //if you want to click the<br />
widget</div>
<br />
[*]対象外部品の特定<br />
<br />
<div style="text-align: left;" class="mycode_align">既存Locatorの動作を変えたい場合や、対象外の部品を特定する為に、Locatorをカスタマイズする必要がある。</div>
<br />
<div style="text-align: left;" class="mycode_align">§ <br />
動作を変えたい場合、IWidgetMatcherを継承し実装する。SWTの場合、SWTWidgetLocator.buildMatcher() で該当Matcherを呼び出す。</div>
<br />
<div style="text-align: left;" class="mycode_align">例（選択されたボタンを特定する）</div>
<br />
<div style="text-align: left;" class="mycode_align">class SelectedButtonMatcher implements IWidgetMatcher {</div>
<br />
<div style="text-align: left;" class="mycode_align"> private<br />
final IWidgetMatcher defaultMatcher;</div>
<br />
<div style="text-align: left;" class="mycode_align"> SelectedButtonMatcher(IWidgetMatcher<br />
defaultMatcher) {</div>
<div style="text-align: left;" class="mycode_align"> this.defaultMatcher<br />
= defaultMatcher;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
boolean matches(Object widget) {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
isSelected(widget) &amp;&amp; matchesDefaultCriteria(widget);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> private<br />
boolean matchesDefaultCriteria(Object widget) {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
defaultMatcher.matches(widget);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> private<br />
boolean isSelected(Object widget) {</div>
<div style="text-align: left;" class="mycode_align"> if<br />
(!(widget instanceof Button))</div>
<div style="text-align: left;" class="mycode_align"> return<br />
false;</div>
<div style="text-align: left;" class="mycode_align"> final<br />
Button button = (Button)widget;</div>
<div style="text-align: left;" class="mycode_align"> final<br />
boolean[] result = new boolean[1];</div>
<div style="text-align: left;" class="mycode_align"> Display.getDefault().syncExec(</div>
<div style="text-align: left;" class="mycode_align"> new<br />
Runnable() {</div>
<div style="text-align: left;" class="mycode_align"> public<br />
void run() {</div>
<div style="text-align: left;" class="mycode_align"> result[0]<br />
= button.getSelection();</div>
<div style="text-align: left;" class="mycode_align">
} </div>
<div style="text-align: left;" class="mycode_align"> });</div>
<div style="text-align: left;" class="mycode_align"> return<br />
result[0];</div>
<div style="text-align: left;" class="mycode_align"> } </div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align">//(Note that here we are decorating the default<br />
matcher. A simpler implementation would </div>
<div style="text-align: left;" class="mycode_align">//forego a reference to the default matcher.)</div>
<br />
<div style="text-align: left;" class="mycode_align">//With this matcher defined a SelectedButtonLocator<br />
could be defined like this:</div>
<br />
<div style="text-align: left;" class="mycode_align">public class SelectedButtonLocator extends<br />
ButtonLocator {</div>
<div style="text-align: left;" class="mycode_align"> private static final long<br />
serialVersionUID = 1L;</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
SelectedButtonLocator(String label) {</div>
<div style="text-align: left;" class="mycode_align"> super(label);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> @Override</div>
<div style="text-align: left;" class="mycode_align"> protected<br />
IWidgetMatcher buildMatcher() {</div>
<div style="text-align: left;" class="mycode_align"> IWidgetMatcher<br />
defaultMatcher = super.buildMatcher();</div>
<div style="text-align: left;" class="mycode_align"> return<br />
new SelectedButtonMatcher(defaultMatcher);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align">//Using this locator looks just like using the standard<br />
button locator:</div>
<br />
<div style="text-align: left;" class="mycode_align">ui.click(new ButtonLocator("OK")); //standard</div>
<div style="text-align: left;" class="mycode_align">ui.click(new SelectedButtonLocator(".*"));<br />
//custom</div>
<br />
<div style="text-align: left;" class="mycode_align">//(Notice that you can use a wildcard just like the<br />
standard locator since we are </div>
<div style="text-align: left;" class="mycode_align">// decorating the default matching criteria. The custom<br />
locator reference reads: </div>
<div style="text-align: left;" class="mycode_align">// "click the selected button with any<br />
text".)</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">対象外部品の対応</span></div>
<br />
<div style="text-align: left;" class="mycode_align">対象外の部品を対応する為に、新しいLocatorを作成する必要がある。作成方法について、一番単純なものはSWTWidgetLocator を継承するだけで対応可能。例えば、次の例で、EclipseのSection（org.eclipse.ui.forms.widgets.Section）部品の検出に役立つLocatorが作成されている。</div>
<br />
<div style="text-align: left;" class="mycode_align">public class SectionLocator extends SWTWidgetLocator {</div>
<br />
<div style="text-align: left;" class="mycode_align"> private<br />
static final long serialVersionUID = 621335057837701982L;</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
SectionLocator(String text) {</div>
<div style="text-align: left;" class="mycode_align"> super(Section.class,<br />
text);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
SectionLocator(String text, SWTWidgetLocator parent) {</div>
<div style="text-align: left;" class="mycode_align"> super(Section.class,<br />
text, parent);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
SectionLocator(String text, int index, SWTWidgetLocator parent) {</div>
<div style="text-align: left;" class="mycode_align"> super(Section.class,<br />
text, index, parent);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align">上記の実装は、SWTWidgetLocatorのデフォルト機能を利用している。ただ、より複雑なロジックについて、例えばツリーの項目選択の制御など、まだドキュメントされてない。【2011/10/25現在】</div>
<br />
<div style="text-align: left;" class="mycode_align">理解を深める為に、より複雑な対象外部品<br />
org.eclipse.swt.browser.Browser の対応例もWTのヘルプに載っている。部品BrowserにはHTMLのコンテンツが入っており、このサンプルの実装で、次のようなテストケースが作成できる：<br />
<br />
ui.assertThat(new BrowserLocator().htmlContains(EXPECTED_URL));</div>
<div style="text-align: left;" class="mycode_align">本対応のコツは、Browserインスタンスの為にIWidgetReference をカスタマイズして、特殊なBrowserReferenceを作成する。 <br />
<br />
また、ほかのサンプルについて、次のリンクを参照してみてください：<a href="http://code.google.com/p/wt-commons/wiki/WTSnippets" target="_blank" rel="noopener" class="mycode_url"><span style="color: blue;" class="mycode_color">http://code.google.com/p/wt-commons/wiki/WTSnippets</span></a> <br />
<br />
BrowserLocatorの実装例</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">public class BrowserLocator extends SWTWidgetLocator {</div>
<br />
<div style="text-align: left;" class="mycode_align"> private<br />
static final long serialVersionUID = 1L;</div>
<div style="text-align: left;" class="mycode_align"> public<br />
BrowserLocator() {</div>
<div style="text-align: left;" class="mycode_align"> super(Browser.class);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> @Override</div>
<div style="text-align: left;" class="mycode_align"> public<br />
IWidgetLocator[] findAll(IUIContext ui) {</div>
<div style="text-align: left;" class="mycode_align"> IWidgetLocator[]<br />
refs = super.findAll(ui);</div>
<div style="text-align: left;" class="mycode_align"> BrowserReference[]<br />
browsers = new BrowserReference[refs.length];</div>
<div style="text-align: left;" class="mycode_align"> for<br />
(int i = 0; i &lt; browsers.length; i++) {</div>
<div style="text-align: left;" class="mycode_align"> browsers<br />
= new BrowserReference((IWidgetReference)refs);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> return<br />
browsers;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align">BrowerReferenceの実装例：</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align">public class BrowserReference implements<br />
IWidgetReference {</div>
<br />
<div style="text-align: left;" class="mycode_align"> private class<br />
HtmlContainsCondition implements ICondition {</div>
<br />
<div style="text-align: left;" class="mycode_align"> String<br />
expectedText;</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
HtmlContainsCondition(String expectedText) {</div>
<div style="text-align: left;" class="mycode_align">
this.expectedText = expectedText;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
boolean test() {</div>
<div style="text-align: left;" class="mycode_align">
String html = getHTML();</div>
<div style="text-align: left;" class="mycode_align"> if (html == null)</div>
<div style="text-align: left;" class="mycode_align">
return false;</div>
<div style="text-align: left;" class="mycode_align">
return html.contains(expectedText);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<br />
<div style="text-align: left;" class="mycode_align"> private final<br />
IWidgetReference browserWidget;</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
BrowserReference(IWidgetReference browserWidget) {</div>
<div style="text-align: left;" class="mycode_align">
this.browserWidget = browserWidget;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public Object<br />
getWidget() {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
browserWidget.getWidget();</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> /**</div>
<div style="text-align: left;" class="mycode_align"> * @since<br />
Eclipse 3.4 where Browser.getText() is introduced</div>
<div style="text-align: left;" class="mycode_align"> */</div>
<div style="text-align: left;" class="mycode_align"> public String<br />
getHTML() {</div>
<div style="text-align: left;" class="mycode_align"> final<br />
String text[] = new String[1];</div>
<div style="text-align: left;" class="mycode_align">
Display.getDefault().syncExec(new Runnable() {</div>
<div style="text-align: left;" class="mycode_align">
public void run() {</div>
<div style="text-align: left;" class="mycode_align">
text[0] = getText(getBrowser());</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> });</div>
<div style="text-align: left;" class="mycode_align"> return<br />
text[0];</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> private<br />
static String getText(Browser browser) {</div>
<div style="text-align: left;" class="mycode_align"> if<br />
(browser == null)</div>
<div style="text-align: left;" class="mycode_align">
return null;</div>
<br />
<div style="text-align: left;" class="mycode_align"> try {</div>
<div style="text-align: left;" class="mycode_align">
Method m = browser.getClass().getMethod("getText", (Class[])<br />
null);</div>
<div style="text-align: left;" class="mycode_align">
m.setAccessible(true);</div>
<div style="text-align: left;" class="mycode_align">
return (String) m.invoke(browser, (Object[]) null);</div>
<div style="text-align: left;" class="mycode_align"> } catch<br />
(SecurityException e) {</div>
<div style="text-align: left;" class="mycode_align"> } catch<br />
(NoSuchMethodException e) {</div>
<div style="text-align: left;" class="mycode_align"> } catch<br />
(IllegalArgumentException e) {</div>
<div style="text-align: left;" class="mycode_align"> } catch<br />
(IllegalAccessException e) {</div>
<div style="text-align: left;" class="mycode_align"> } catch<br />
(InvocationTargetException e) {</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> return<br />
null;</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public void<br />
execute(final String script) {</div>
<div style="text-align: left;" class="mycode_align">
Display.getDefault().syncExec(new Runnable() {</div>
<div style="text-align: left;" class="mycode_align">
public void run() {</div>
<div style="text-align: left;" class="mycode_align">
getBrowser().execute(script);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> });</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> public void<br />
setURL(final String url) {</div>
<div style="text-align: left;" class="mycode_align">
Display.getDefault().syncExec(new Runnable() {</div>
<div style="text-align: left;" class="mycode_align">
public void run() {</div>
<div style="text-align: left;" class="mycode_align">
getBrowser().setUrl(url);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align"> });</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
ICondition htmlContains(String expectedText) {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
new HtmlContainsCondition(expectedText);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> public<br />
Browser getBrowser() {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
(Browser)getWidget();</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> /*<br />
(non-Javadoc)</div>
<div style="text-align: left;" class="mycode_align"> * @see<br />
com.windowtester.runtime.locator.IWidgetLocator#findAll</div>
<div style="text-align: left;" class="mycode_align"> * (com.windowtester.runtime.IUIContext)</div>
<div style="text-align: left;" class="mycode_align"> */</div>
<div style="text-align: left;" class="mycode_align"> public<br />
IWidgetLocator[] findAll(IUIContext ui) {</div>
<div style="text-align: left;" class="mycode_align"> return<br />
browserWidget.findAll(ui);</div>
<div style="text-align: left;" class="mycode_align"> }</div>
<br />
<div style="text-align: left;" class="mycode_align"> /*<br />
(non-Javadoc)</div>
<div style="text-align: left;" class="mycode_align"> * @see<br />
com.windowtester.runtime.locator.IWidgetMatcher#matches</div>
<div style="text-align: left;" class="mycode_align"> * (java.lang.Object)</div>
<div style="text-align: left;" class="mycode_align"> */</div>
<div style="text-align: left;" class="mycode_align"> public boolean matches(Object widget) {</div><div style="text-align: left;" class="mycode_align"> return browserWidget.matches(widget);</div><div style="text-align: left;" class="mycode_align"> }</div>
<div style="text-align: left;" class="mycode_align">}</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">RCP/SWT</span><span style="font-weight: bold;" class="mycode_b">に組み込まれた</span><span style="font-weight: bold;" class="mycode_b">Swing </span><span style="font-weight: bold;" class="mycode_b">部品のテストについて</span></div><div style="text-align: left;" class="mycode_align">Eclipse上のWTのヘルプを参照してください（"Embedded Swing Components"で検索)。</div>
<br />
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">GEF<br />
(Graphical Editing Framework)</span><span style="font-weight: bold;" class="mycode_b">について</span></div>
<div style="text-align: left;" class="mycode_align">GEFはCDEに利用されてない為、GEF関係のガイドを省略する。</div>
<div style="text-align: left;" class="mycode_align"><span style="font-weight: bold;" class="mycode_b">ほかに重要な参照情報</span></div>
<div style="text-align: left;" class="mycode_align">API Ref: WindowTester Pro User<br />
Guide &gt; Reference</div>
<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[About Getting Started Plus - Getting Started+とは？ -]]></title>
			<link>https://communities.curl.com/showthread.php?tid=430</link>
			<pubDate>Tue, 13 Mar 2012 07:01:40 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=430</guid>
			<description><![CDATA[[<span style="font-weight: bold;" class="mycode_b">en</span>] - "Getting Started Plus" is a page to introduce some other products investigated by Curl and Caede engineers during developing our product. Once this page is updated, it will be posted to <a href="http://communities.curl.com/%5Bhttp://www.facebook.com/CurlPlatform" target="_blank" rel="noopener" class="mycode_url">the wall on Curl Facebook page</a> at the same time.<br />
<br />
[<span style="font-weight: bold;" class="mycode_b">ja</span>] - 「Getting Started plus」では、CurlやCaedeなどの製品を開発していった際に、調査した製品を簡単に紹介などをしていくページです。<br />
ここの情報が追加されましたら、同時に<a href="http://www.facebook.com/CurlPlatform" target="_blank" rel="noopener" class="mycode_url">CurlのFacebookページ上のウォール</a> にポストされます。 <br />
<br />
<span style="font-weight: bold;" class="mycode_b">QR code</span> <br />
<img src="attachment.php?aid=254 width="100" height="100" alt="Curl Facebook page" " /> <br />
[<a href="http://www.facebook.com/CurlPlatform" target="_blank" rel="noopener" class="mycode_url">http://www.facebook.com/CurlPlatform</a>] <br />
]]></description>
			<content:encoded><![CDATA[[<span style="font-weight: bold;" class="mycode_b">en</span>] - "Getting Started Plus" is a page to introduce some other products investigated by Curl and Caede engineers during developing our product. Once this page is updated, it will be posted to <a href="http://communities.curl.com/%5Bhttp://www.facebook.com/CurlPlatform" target="_blank" rel="noopener" class="mycode_url">the wall on Curl Facebook page</a> at the same time.<br />
<br />
[<span style="font-weight: bold;" class="mycode_b">ja</span>] - 「Getting Started plus」では、CurlやCaedeなどの製品を開発していった際に、調査した製品を簡単に紹介などをしていくページです。<br />
ここの情報が追加されましたら、同時に<a href="http://www.facebook.com/CurlPlatform" target="_blank" rel="noopener" class="mycode_url">CurlのFacebookページ上のウォール</a> にポストされます。 <br />
<br />
<span style="font-weight: bold;" class="mycode_b">QR code</span> <br />
<img src="attachment.php?aid=254 width="100" height="100" alt="Curl Facebook page" " /> <br />
[<a href="http://www.facebook.com/CurlPlatform" target="_blank" rel="noopener" class="mycode_url">http://www.facebook.com/CurlPlatform</a>] <br />
]]></content:encoded>
		</item>
	</channel>
</rss>