自从这个问题被提出以来已经有一段时间了,但由于它是谷歌在搜索确保视图存在的方法时最热门的问题之一,因此在对 Espresso 进行任何操作之前,我想分享我的非常基本的处理这个的方式。
1:首先编写一个扩展名ViewInteraction
:
fun ViewInteraction.exists(): Boolean {
val viewExists = AtomicReference<Boolean>()
this.perform(object : ViewAction {
override fun perform(uiController: UiController?, view: View?) {
viewExists.set(view != null)
}
override fun getConstraints(): Matcher<View>? {
return Matchers.allOf(ViewMatchers.withEffectiveVisibility(
ViewMatchers.Visibility.VISIBLE),
ViewMatchers.isAssignableFrom(View::class.java))
}
override fun getDescription(): String {
return "check if view exists"
}
})
return viewExists.get()
}
2:在您的基类中创建一个简单的帮助方法(用于所有测试类):
fun viewExists(id: Int): Boolean {
return try {
onView(withId(id)).exists()
} catch (e: RuntimeException) {
false
}
}
有了这个,您可以获取true
或false
来自onView(withId(id)).exists()
,或者安全地捕获 RuntimeException 并返回false
。
通常一个简单的检查.exists()
就足够了,但在某些情况下,比如当您删除 ListView 项目直到 non 离开时 -> 当最后一个项目被删除时,ListView 可能不再存在,然后在尝试检查它是否存在。
3:通过上述实现,检查是否存在任何视图是安全的,因为在RuntimeException
幕后处理得很好:
if(viewExists(R.id.something)) {
//do something
}
//do something else