UI Automatorでスクロール可能なViewGroup内の特定の子要素をクリックなどする場合についてです。

実はこれが結構面倒でした。
UI Automatorでclickなどの操作を行うには、基本的にその操作対象のViewが画面に表示されている必要があります。
なので、ViewGroupまたはAdapterViewには存在しているけど、画面に未だ表示されていないものはclickなどの選択ができません(※)。そのため、特定のViewを画面に表示させてから実施する必要があります。
※ UiObject.clickなどをコールするとUiObjectNotFoundExceptionがスローされます。

そうなると、ViewGroupやAdapterViewをスクロールさせる必要が出てきますが、スクロールさせるためのメソッドとして、以下のものが用意されています。

メソッド名称概要
UiDevice.swipe座標を指定したスクロール(スワイプ)が可能
UiObject.swipeUp/Down/Left/Rightsteps指定によりスクロール(スワイプ)が可能
UiScrollable.scrollToBegining/Endsteps指定によりスクロール(スワイプ)が可能
UiScrollable.scrollForward/Backwardsteps指定によりスクロール(スワイプ)が可能
UiScrollable.scrollIntoView見つけたいViewへのUiObjectまたはUiSelectorを指定し、それを探してくれる
UiScrollable.scrollTextIntoView見つけたいテキストが記載されたViewを探してくれる

使ってみて分かったこととしては、以下の点でした。
  1. UiDevice.swipeはスクロール対象のViewに対するUiObjectが特定できていないときでも利用できる
  2. UiDevice.swipeはスクロールしたい量が分かっているときは、直観的で使いやすい
  3. UiObject.swipeUp/Down/Left/RightやUiScrollable.scrollToBegining/EndやUiScrollable.scrollForward/Backwardは約1ページ分スクロールし、stepsによってスクロール速度が変わる
  4. UiObject.swipeDownをandroid.support.v4.widget.DrawerLayoutに対して実施するとステータス領域が表示される(詳細はこちらを参照)
  5. UiScrollable.scrollIntoViewやUiScrollable.scrollTextIntoViewは探したいViewの特徴(表示している文字列や設定されている一意のリソースID)が明確なら使いやすい
  6. UiScrollable.scrollIntoViewやUiScrollable.scrollTextIntoViewは一旦リストの先頭に移動してから探し始めるので、少し重たい

上記のメソッドにて、スクロールさせて対象のViewが表示された状態にした後に、UiObject.findObjectなどで子要素のUiObjectを取得すると操作可能なUiObjectを取得することができます。
UiScrollableの取得方法についてはこちらを参照してください。

コメントの投稿