IosNativeDriver driver = new IosNativeDriver();


// 入力言語を選択

driver.findElement(By.text("English")).click();

driver.findElement(By.text("Detect language")).click();


// 出力言語を選択

driver.findElement(By.text("French")).click();

driver.findElement(By.text("English")).click();


// 入力ボックスをタップし、入力画面を開く

driver.findElement(By.className("UITextView")).click();


// キー入力

WebElement textView =

driver.findElement(By.className("UITextView"));

textView.clear();

textView.sendKeys("こんにちは");

textView.submit();




[iPhone 向けアプリケーション(Google 翻訳)のテストの様子。
なお、CCマークを押すと、字幕が表示されます。]

また、iOS NativeDriver では WebView のサポートが追加されており、WebView 内部の DOM ツリーを NativeDriver を通してテストできます。この機能は Android 版では未対応ですが、iPhone 向けアプリケーション内での WebView の利用頻度が高いため、iOS 版で先行して実装されました。WebView 内の要素を操作する場合もネイティブ要素と同様に findElement で要素を検索し、click や sendKeys でタップ、キー入力を行います。

iOS NativeDriver のチュートリアルは Google Code サイト内の Wiki ページ(GettingStartedIOSIOSMakeAnAppTestable)で公開しています。また、メーリングリストは Android 向けと共通で nativedriver-users と nativedriver-devs です。スマートフォンアプリケーション開発者のみなさんのフィードバックをお待ちしています。


[Android の実機でテストを実行している様子]

このテストケースを見ると、アプリケーションの起動に startActivity メソッドを使っている点と、NativeDriver の初期化に Builder を使っている点以外は、WebDriver のテストケースとまったく同じであることがわかります。

Android NativeDriver は、アプリケーションを操作するために内部的に Instrumentation を利用します。Instrumentation は Android の標準機能ですが、課題もあります。例えば、Instrumentation では同時に 1 つのプロセスしか操作することができません。これは、Instrumentation がデバイス内部で動作することに起因します。アプリケーションが他のプロセスを操作できてしまうと悪意のあるアプリケーションに不正にデバイスを操作される危険性があるため、そのようなふるまいは禁止されているのです。そこで、Android NativeDriver は、Instrumentation だけでなく必要に応じて Android Debug Bridge (ADB) 接続も利用できるようにしました。ADB はデバイス外部からの接続であり、特定のプロセスに依存せずにイベントを送信できます。これにより、アプリケーションが他のアプリケーションに処理を委譲するような場合でも処理を継続できるようになっています。また、スクリーンショットを撮る機能でも ADB 接続を利用しています。Instrumentation と ADB 接続をシームレスに使い分けられる点も、Android NativeDriver を利用するメリットのひとつです。

Google Code サイトでは、Android NativeDriver のチュートリアルを公開しています。また、利用者向け/コントリビュータ向けのメーリングリストを用意しています。Android 向けアプリケーションの開発者の方はぜひ試してみてください。