やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

uiautomatorで端末の回転とスクリーンショット撮影 #android_tec

uiautomatorによるテストで、端末の回転と、スクリーンショットを撮影する方法です。
uiautomatorの設定と基本的なテストの書き方は先の記事 uiautomatorを試してみた を参照してください。

要件

uiautomator自体はAPI Level 16以上(Android 4.1)で動作しますが、端末の回転とスクリーンショット撮影には、
API Level 17以上(Android 4.2)
が必要です。

端末の回転

// 横向きにしてみる(同時に、端末のセンサによる回転が抑止されます)
getUiDevice().setOrientationLeft();

// 回転されるのを待つ
Thread.sleep(1000);

// 横向きでのテスト
(snip)

// 端末の回転抑止を解除
getUiDevice().unfreezeRotation();

回転方向には、上記のLeftのほか、Right、Naturalがあります。Nexus7ではNaturalが縦方向(Portrait)でしたが、Naturalが横方向の端末も出てくるのかも知れません。(テストを書く立場からすると誰得な仕様に思えますが)

回転の完了をThread#sleep()で待っていますが、通常の画面遷移とことなるのでUiObjectのメソッドで判断できず、とりあえずこうしてみました。

最後に#unfreezeRotation()メソッドを呼んでいますが、これを呼ばずにテストを終わるとセンサーが抑止されたままになります。
【11/27追記】これはtearDown()で呼ぶほうがいいですね。

スクリーンショットの撮影

File storePath = new File("/mnt/sdcard/Pictures/test.png");
getUiDevice().takeScreenshot(storePath);

これで指定したパスにスクリーンショット画像が保存されます。uiautomationは端末側で動作しますので、端末内のパスを指定しなければなりません。
他に、scale, quorityを指定できるオーバーロードメソッドもあります。

撮影したスクリーンショットは、adb pullコマンドで取り出せます。

$ adb pull /mnt/sdcard/Pictures/test.png test.png