[Android] Using Espresso to click view inside RecyclerView item

Joseph Wang
3 min readAug 16, 2019

--

我們在用 Espresso 寫 UI Test 可能會需要點擊 RecyclerView 內的 item 的功能,這篇會教大家怎麼用比較簡單的方式來響應 RecyclerView 內 item 的 click event,。

導入依賴

首先需要導入espresso-contrib 這套 Library,版本號建議和專案內建espresso-core 一樣就行了。

androidTestImplementation 'androidx.test.espresso:espresso-contrib:{ESPRESSO_VERSION}'

基礎使用

下方的程式碼代表著是要點擊的 RecyclerView 內的第 0 項 item。

@Test
fun test() {
val position = 0
onView(withId(R.id.recyclerView))
.perform(
actionOnItemAtPosition<RecyclerView.ViewHolder>(position, click()))
// verify
}

延伸使用

不過 item 內可能有多個 view ,且其 click 行為都不一樣,所以如果要執行指定 view 的 click 事件,我們就必須重寫 ViewAction,並且把 view find 出來執行 performClick 方法。

fun clickRecyclerViewItem(position: Int, id: Int? = null): ViewAction {
return actionOnItemAtPosition<RecyclerView.ViewHolder>(position,
// 有帶id就代表要點擊指定的view,沒有的話代表點擊整個item
id?.let {
object : ViewAction {
override fun getConstraints() = null override fun getDescription() = "Click on an item view with specified id." override fun perform(uiController: UiController?, view: View?) {
// 找不到指定的id就報Exception,方便debug
val itemView = view?.findViewById<View>(id)
?: throw Exception("Item view is not found")
itemView.performClick()
}
}
} ?: click())
}

這樣使用上就變得非常簡便了,當然如果要處理其它的元件事件可以延伸研究一下囉,方向都差不多的!

@Test
fun test() {
val position = 0
onView(withId(R.id.recyclerView))
.perform(clickRecyclerViewItem(position,R.id.title))
// verify
}

--

--

No responses yet