写真とボタンのみを含むViewPager
アイテムがあります。
表示されている画像を除き、ViewPager
のすべてのアイテムを(UIの観点から)区別するものがないため、アイテム(ページ)のUIと正常に対話できません。
私は位置を持つアイテムを1つだけ選択しようとしました:
onData(is(instanceOf(ItemClass.class)))
.atPosition(0)
.onChildView(withId(R.id.button))
.perform(click());
原因:
NoMatchingViewException:階層に一致するビューが見つかりません:クラスから割り当て可能:クラスAndroid.widget.AdapterView
EspressoでViewPager
のアイテムにアクセスしてテストする方法
FirstVal、ViewPager
はAdapterView
ではなく、ViewGroup
から直接拡張されます。したがって、メソッドonData()
はViewPager
で使用できません。
ViewGroup
であるため、各アイテムはViewPager
の直接の子です。したがって、プロセスは、カスタムマッチャー(このような firstChildOf()
)を使用して最初のビューの子を参照し、 hasDescendant()
で遊んでいます。および isDescendantOfA()
は、ターゲットビューにアクセスし、そのビューに対してアクションを実行します。
_ onView(allOf(withId(R.id.button), isDescendantOfA(firstChildOf(withId(R.id.viewpager)))))
.perform(click());
_
ViewPager
の特殊性は、それを構成する各アイテム(#1ソリューションの子ビュー)を1つずつ表示することです(ページごとのスタイル)。そのため、アイテムが同じIDで同じレイアウトを使用している場合でも、1つだけが表示されます。そのため、IDでターゲットビューを参照し、制約 isDisplayed()
を追加できます。現在表示されているビューのみに一致します。
_onView(allOf(withId(R.id.button), isDisplayed())).perform(click());
_
それと同じくらい簡単。
また、別のアイテムが必要な場合は、ViewPager
で swipe()
を実行して、表示されているアイテムを変更できます。
_onView(withId(R.id.viewpager)).perform(swipeLeft());
_