UI Automatorを初めて暫くしたら、UiScrollableの存在に気付いたのですが、取得方法が分からなかったので一応纏めておきます。
正直、Androidをやってきたエンジニアからすると、ちょっと戸惑いました。

やり方としては、意外にも以下のような感じになります。

試験対象のレイアウト(アプリIDは"jp.eq_inc.test_application"として記載します):
<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/lvRoot"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</ListView>

UiScrollable取得コード:
UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
UiSelector uiSelector = new UiSelector().resourceId("jp.eq_inc.test_application:id/lvRoot");
UiObject listViewObject = device.findObject(uiSelector);
if((listViewObject != null) && listViewObject.isScrollable()){  // 本当はUiObjectNotFoundExceptionをcatchする必要がありますが、省略
    UiScrollable listViewScrollable = new UiScrollable(uiSelector);  // ★
}
結局のところ、そのままインスタンスを生成して、そのときに対象のUiObjectを一意に判断できるようにUiSelectorで指定すればよいだけでした。
てっきりListViewなどをUiDevice.findObjectで取得するとUiScrollableが返却されているのかと思っていましたが、そうではなく、自分でインスタンス生成が必要なようです。
ちなみに自分で生成したインスタンスを使用して、無事UiScrollable.scrollXXXメソッドが動作しました。

コメントの投稿