Прошло некоторое время с тех пор, как эта проблема была заявлена, но, поскольку она является одной из самых популярных в Google при поиске способов убедиться, что представление присутствует, прежде чем выполнять какие-либо действия с ним в 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 до тех пор, пока не останется не-> когда последний элемент удаляется, ListView может больше не присутствовать, тогда при попытке возникает исключение. чтобы проверить, существует ли он.
3: С приведенной выше реализацией безопасно проверить, существует ли какое-либо представление, поскольку RuntimeException
хорошо обрабатывается за сценой:
if(viewExists(R.id.something)) {
//do something
}
//do something else
person
Morten Løvborg
schedule
30.01.2019