android.support.test.espresso.AmbiguousViewMatcherException

Android
Espresso

フラグメントやリストなど、何かと繰り返すコンテンツってありますよね?
Androidのテスト用サポートライブラリ、Espressoですが、同じ名前やIDなのに複数存在する要素をテストしようとすると、下記のエラーが出ます。

android.support.test.espresso.AmbiguousViewMatcherException: ‘with id: jp.onlineconsultant.hogehoge:id/take_over_text’ matches multiple views in the hierarchy.
Problem views are marked with ‘****MATCHES****’ below.

 //ビューのxmlレイアウトファイル
    <TableRow
        android:layout_marginLeft="1dp"
        android:layout_marginRight="1dp"
        android:layout_marginTop="1dp"
        android:background="#FFFFFF"
        android:padding="3dp"
        android:id="@+id/sender_take_over_text">
 
        <TextView
            android:id="@+id/take_over_text"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:text="@string/take_over" />
 
        <TextView
            android:id="@+id/take_over"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"></TextView>
    </TableRow>
    <TableRow
        android:layout_marginLeft="1dp"
        android:layout_marginRight="1dp"
        android:layout_marginTop="1dp"
        android:background="#FFFFFF"
        android:padding="3dp"
        android:id="@+id/sender_take_over_text">
 
        <TextView
            android:id="@+id/take_over_text"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:text="@string/take_over" />
 
        <TextView
            android:id="@+id/take_over"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"></TextView>
    </TableRow>
 //テストコード
 onView(withId(R.id.take_over_text)).check(matches(withText(R.string.take_over)));

そういう時は、allOfを使って、親要素のIDなどを取得してどちらがどちらか、という判定を作ります。

 onView(allOf(withId(R.id.take_over_text), withParent(withId(R.id.sender_take_over_text))))
  .check(matches(withText(R.string.take_over)));

これでOKです!

withParentだと、直上の親の要素を指定することがあるので、おじいちゃん/おばあちゃんの要素を取りたい場合は

 isDescendantOfA

を使えばOKです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です