2013-10-30 2 views
6

Mit Espresso möchte ich in der Lage sein, auf ein bestimmtes Kind einer ExpandableListView (namens CustomExpandableView) klicken. Die Listenansicht erstellt eine Reihe von RelativeLayouts (namens MyContainer).Klicken auf ein bestimmtes Kind einer ListView in Espresso

Idealerweise möchte ich in CustomExpandableView auf einen bestimmten MyContainer klicken. Aber ich kann mit dem ersten Klick leben.

Die MyContainer-Objekte haben keine eindeutigen IDs, auf die ich verweisen kann, aber ihre untergeordneten Elemente tun dies, z. - "text = Beispieltext hier 1"

Ich habe ein paar verschiedene Varianten der Verwendung von onData beim Übergeben des Klassentyps versucht und versucht, ein Kind an einer bestimmten Position zu bekommen, aber es funktioniert einfach nicht. Und ich wollte vermeiden, das Objekt zu bekommen und darüber zu iterieren, bis ich das richtige Kind gefunden habe. Hier

ist der Teil der Ansichtshierarchie als Referenz (I unwichtige Informationen von der Hierarchie entfernt):

 
+----->CustomExpandableView{} 
| 
+------>LinearLayout{} 
| 
+------->TextView{} 
| 
+------->FrameLayout{} 
| 
+-------->BreadCrumbView{} 
| 
+--------->ImageButton{} 
| 
+--------->TextView{} 
| 
+------>LinearLayout{} 
| 
+------->MyContainer{} 
| 
+-------->ImageView{res-name=thumb, } 
| 
+-------->ImageView{res-name=divider} 
| 
+-------->TextView{res-name=label, text=Sample Text Here 1, input-type=0, ime-target=false} 
| 
+------->MyContainer{} 
| 
+-------->ImageView{res-name=thumb} 
| 
+-------->ImageView{res-name=divider} 
| 
+-------->TextView{res-name=label text=Sample Text Here 2, input-type=0, ime-target=false} 
| 

Antwort

0

Versuchen der instanceOf gekoppelt mit einem hasSibling Matcher z.B.

onView(allOf(is(instanceOf(MyContainer.class)), hasSibling(withText("Sample Text Here 1")))) 
+0

Dies gibt einen Fehler zurück. OnView erfordert Matcher und das ist Matcher zurückgeben. Sie haben in OnView kein View-Objekt angegeben. – Khushboo

+0

@ Khushboo, also schalte es auf onData. –

0

Sie können folgen direkt von Google hier EspressoSamples zur Verfügung gestellt.
Sie müssen onData() als z.

onData(allOf(is(instanceOf(Map.class)), hasEntry(equalTo("STR"), is("item: 50"))) 
    .perform(click()); 
0

Wenn Sie versuchen, onData zu verwenden, versucht Espresso nicht von einigen params sehen zu finden, aber für Daten in diesem Adapter Adapter von ListView und suchen Sie erhalten (von Adapter#getItem Aufruf).

Aber im Fall von ExpandableListView ist es nicht offensichtlich, welche Daten zu bekommen. Und für diesen Zweck stellte Espresso onData...().usingAdapterViewProtocol(AdapterViewProtocol) zur Verfügung. Diese Methode javadoc sagt:

/** * Use a different AdapterViewProtocol if the Adapter implementation does not * satisfy the AdapterView contract like (@code ExpandableListView) */

Diese AdapterViewProtocol Schnittstelle wie folgt aussieht: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/com/google/android/apps/common/testing/ui/espresso/action/AdapterViewProtocol.java.

Beispiele für AdapterViewProtocol Umsetzung: https://stackoverflow.com/a/40282991/1282732

Nachdem sie richtig definiert, wird onData Artikel finden sehen Sie gesucht haben. Danach müssen Sie eine Aktion ausführen oder das Kind überprüfen. Sie sollten nur onData#onChildView.