web-dev-qa-db-ja.com

EspressoでViewPagerをテストします。アイテムのボタンにアクションを実行する方法は?

写真とボタンのみを含む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のアイテムにアクセスしてテストする方法

27
damson

FirstVal、ViewPagerAdapterViewではなく、ViewGroupから直接拡張されます。したがって、メソッドonData()ViewPagerで使用できません

1.解決策

ViewGroupであるため、各アイテムはViewPagerの直接の子です。したがって、プロセスは、カスタムマッチャー(このような firstChildOf() )を使用して最初のビューの子を参照し、 hasDescendant() で遊んでいます。および isDescendantOfA() は、ターゲットビューにアクセスし、そのビューに対してアクションを実行します。

_ onView(allOf(withId(R.id.button), isDescendantOfA(firstChildOf(withId(R.id.viewpager)))))
            .perform(click());
_

2.ソリューション(da best)

ViewPagerの特殊性は、それを構成する各アイテム(#1ソリューションの子ビュー)を1つずつ表示することです(ページごとのスタイル)。そのため、アイテムが同じIDで同じレイアウトを使用している場合でも、1つだけが表示されます。そのため、IDでターゲットビューを参照し、制約 isDisplayed() を追加できます。現在表示されているビューのみに一致します。

_onView(allOf(withId(R.id.button), isDisplayed())).perform(click());
_

それと同じくらい簡単。

また、別のアイテムが必要な場合は、ViewPagerswipe() を実行して、表示されているアイテムを変更できます。

_onView(withId(R.id.viewpager)).perform(swipeLeft());
_
86
damson