この問題が発表されてからしばらく経ちましたが、ビューが存在することを確認する方法を検索するときに Google で最もヒットしたものの 1 つであるため、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
}
}
これにより、 gettrue
またはfalse
fromonView(withId(id)).exists()
を取得するか、RuntimeException を安全にキャッチして return を返しfalse
ます。
通常は単純なチェック.exists()
で十分ですが、場合によっては、ListView アイテムがなくなるまで削除する場合など、最後のアイテムが削除されると、ListView が存在しなくなり、しようとすると例外がスローされます。存在するかどうかを確認します。
RuntimeException
3: 上記の実装では、バックグラウンドで適切に処理されるため、ビューが存在するかどうかを確認しても安全です。
if(viewExists(R.id.something)) {
//do something
}
//do something else