Espresso 處理頁面滑動

前言

Listview 和 Recyclerview 都是可以上下滑動的頁面。差異在 Listview 是一次性把所有的 view 建好,當要呈現的資料量過大時會吃掉大量的記憶體和儲存空間,可能導致 App 運行緩慢或當機。Recyclerview 則是建立適當數量的 view,再根據情況對未使用的 view 回收再利用。

如下圖顯示,當畫面往上滑動而底部無 view 可顯示時,最上方已被滑出螢幕的 view 會被回收並更新內容後再遞補為最後一張。

1_yVuye_4Sx2Y24pVOp0By5A

RecyclerView

可以利用 RecyclerViewActions 與其互動,可依據 ViewMatcher 和位置這兩種方式做處理,常用的用法有以下兩種:

1.位置

如我們要對點擊位置在 10 的 view (如下圖),可以用以下方式處理。就算 view 不再可視範圍內,也會自動被滑至螢幕視野內並執行點擊的動作。所以運行結果會是 – 將頁面滑到位置 10 的 view 並點擊它。

onView(RecyclerView).perform(RecyclerViewActions.actionOnItemAtPosition(10, click());
2. ViewMatcher

如果 view 有唯一值則可以透過 ViewMatcher 處理,畢竟使用位置為參數的程式碼並不是那麼直覺,有時會讓人無法理解數字所代表的意圖。

public static Matcher<View> uniqueView = withId(R.id.unique);

onView(RecyclerView).perform(RecyclerViewActions.actionOnItem(uniqueView, click());

螢幕快照 2018-01-02 上午11.51.29

ListView

如要點擊某一個有唯一值的 view,常見的用法是搭配滑動和點擊的行為來完成(如下圖):

public static Matcher<View> uniqueView = withId(R.id.unique);

onView(uniqueView).perform(scrollTo(), click());
AdapterView

一種型態較特殊的元件,它可以動態的透過 Adapter 讀取資料,且支援 onData() 的使用。Adapter 可視為 view 與資料之間的橋樑,除了負責存取資料外也負責為數據中的每個項目建立畫面。

最常見的一種 AdapterView 就是 ListView。所以可使用 onData() 處理與 ListView 的互動。例如:目標元件的文案是字串型態,我們可以透過檢查該物件的文案是否等於 “News" 來做匹配,而且 onData() 會自動處理掉滑動的部分。

onData(allOf(is(instanceOf(String.class), is("News"))).perform(click());

搭配使用 hasToString() 則可以改寫成如下:

onData(hasToString("News")).perform(click());

螢幕快照 2018-01-02 上午11.49.54

延伸閱讀

發表留言