読者です 読者をやめる 読者になる 読者になる

sumioの技術メモ

Androidについての記事が多くなると思います。

Uiautomatorで日本語を入力する

はじめに

Android 4.1から使えるようになった、GUIの自動テストツールであるuiautomatorですが、以下のような特徴があり、とても便利です。

  • MonkeyRunnerのように、自分が書いたアプリ以外も操作することができる。
  • MonkeyRunnerと異なり、タップ位置を絶対座標で指定する必要がないため、画面サイズの異なる端末でも同一シナリオが適用できる。

ただ、EditTextへの文字入力に多少難があります。
Uiautomatorには、UiObject.setText(String)という、EditTextに文字列を設定するメソッドがあるのですが、ここに

UiObject editText = ...;
editText.setText("こんにちは");

のように書いても、何も入力されないのです。

このようになってしまう理由は、Uiautomatorが、ハードウェアキーボードのキーイベントを擬似的に発生させることで、文字入力を実現しているからのようです。
そのため、逆に、日本語IMEが有効な状態で

UiObject editText = ...;
editText.setText("aiueo");

とすると、ローマ字入力が有効になってしまい、「あいうえお」と入力されてしまいます…。

これを解決するために、ASCII図形文字だけで、任意のUnicode文字が入力できるようなIMEを実装してみました。これを使えば、EditTextへの文字入力は思いのままです!
GitHubに公開しましたので、テストのお供にご利用ください。

使い方

README.mdをご覧ください。

このIMEを有効にした状態で、以下のように書くと、「こんにちは!UiAutomatorで入力しています。」と入力することができます。

UiObject editText = ...;
// 「こんにちは!UiAutomatorで入力しています。」を修正UTF-7でエンコードしたもの
String e = "&MFMwkzBrMGEwb,8B-UiAutomator&MGdRZVKbMFcwZjBEMH4wWTAC-";
editText.setText(e);

もちろん、このままでは使いにくいので、以下のように書けるヘルパーライブラリもあわせて公開しています。

UiObject editText = ...;
editText.setText(Utf7ImeHelper.e("こんにちは!UiAutomatorで入力しています。"));

動作確認について

  • Nexus7 (2013) で動作確認しています。
  • Android4.2.2のエミュレータでも動作しますが、サンプルは動作しません。UiObjectの検索条件を書き換えれば動作します。

さいごに

Uiautomatorで日本語を入力するためのツールを作りました。

IMEとしては、ASCII文字の範囲で任意のUnicodeが表現できれば良いため、BASE64やQuoted-Printableなど、色々な変換方式が考えられたのですが、できるだけASCII文字はそのまま入力できるようにしたかったため、修正UTF-7 (RFC 3501)を採用しました。
修正UTF-7では、&以外のASCII文字であれば、ASCIIそのままの文字を使うことができます。

修正UTF-7をサポートするライブラリには、jutf7を使わせていただきました。

興味がありましたら使ってみてください。コメント歓迎です!