はじめに
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を使わせていただきました。
興味がありましたら使ってみてください。コメント歓迎です!