2013-10-30 16 views
6

Sử dụng Espresso, tôi muốn có thể nhấp vào một con cụ thể của một ExpandableListView (có tên là CustomExpandableView). Listview tạo một tập hợp các RelativeLayouts (có tên là MyContainer).Nhấp vào con cụ thể của một ListView trong Espresso

Lý tưởng nhất, tôi muốn nhấp vào một MyContainer cụ thể trong CustomExpandableView. Nhưng, tôi có thể sống chỉ bằng cách nhấp vào cái đầu tiên.

Các đối tượng MyContainer không có ID duy nhất mà tôi có thể tham chiếu, nhưng con cái của họ thực hiện, ví dụ: - "text = Sample Text Here 1"

Tôi đã thử một vài biến thể khác nhau khi sử dụng onData chuyển loại lớp và cố gắng để có được một đứa trẻ ở một vị trí cụ thể, nhưng nó không hoạt động. Và, tôi muốn tránh nhận đồ vật và lặp lại nó cho đến khi tôi tìm được đứa trẻ đúng.

Đây là một phần của hệ thống phân cấp xem để tham khảo (Tôi đã gỡ bỏ thông tin không quan trọng từ hệ thống phân cấp):

 
+----->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} 
| 

Trả lời

0

Thử instanceof kết hợp với một khớp hasSibling ví dụ

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

Đây là lỗi trả lại. OnView yêu cầu Matcher và điều này sẽ trả về Matcher . Bạn chưa chỉ định bất kỳ đối tượng chế độ xem nào trong OnView. – Khushboo

+0

@Khushboo, vì vậy hãy chuyển nó thành onData. –

0

Bạn có thể theo dõi trực tiếp bởi Google tại đây EspressoSamples.
Bạn phải sử dụng onData() như ví dụ:

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

Khi bạn cố gắng sử dụng onData, Espresso cố gắng tìm không xem bởi một số params, nhưng có được Adapter của ListView và tìm kiếm dữ liệu trong bộ chuyển đổi này (bằng cách gọi Adapter#getItem).

Nhưng trong trường hợp ExpandableListView, không rõ dữ liệu nào cần nhận. Và vì mục đích này, Espresso cung cấp onData...().usingAdapterViewProtocol(AdapterViewProtocol). phương pháp javadoc này nói:

giao diện

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

AdapterViewProtocol này trông giống như: 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.

Ví dụ về AdapterViewProtocol thực hiện: https://stackoverflow.com/a/40282991/1282732

Sau khi xác định một cách chính xác nó, onData sẽ tìm thấy mục xem bạn tìm kiếm. Sau đó, nếu bạn cần thực hiện một hành động hoặc kiểm tra đứa trẻ. Bạn chỉ nên onData#onChildView.

Các vấn đề liên quan