Android Espresso(三)——ListView
ListView是平时使用频率较高的一个组件,所以先来看下AdapterView的Espresso操作,以ListView为例。
代码UI示例可以在android/testing-samples找到。
为方便独立运行程序并测试,我将ListView相关UI代码提取到一个新project中,简化操作。
运行页面
列表中有100条数据,每个item上有一个text,一个button。
点击Item测试
先看下简单的点击测试,代码如下(含代码注释)。
@RunWith(AndroidJUnit4.class)
public class ListViewTest {
private static final String TAG = "ListViewTest";
@Rule
public ActivityTestRule<LongListActivity> activityRule = new ActivityTestRule<>(LongListActivity.class);
@Before
public void setup() {
Log.i(TAG, "start~~~");
}
@Test
public void testListItemPositionClick() {
onData(instanceOf(Map.class)).inAdapterView(withId(R.id.list)).atPosition(20).perform(click());
onView(withId(R.id.selection_row_value)).check(matches(withText("20")));
}
@After
public void tearDown() {
Log.i(TAG, "end~~~");
}
}
运行效果。
运行说明: 运行效果可以看到test程序运行后,ListView先滚动到position等于20的item位置,然后执行了click点击事件。在顶部 "Clicked on row " 的值发生了变化 “Clicked on row 20”,结束。
注意:若position的值大于可加在数据的总量,会抛出 android.support.test.espresso.PerformException: Error performing ‘load adapter data’ on view 'Animations or transitions are enabled on the target device.
点击Item内ToggleButton
代码及注释如下:
@RunWith(AndroidJUnit4.class)
public class ListViewTest {
@Rule
public ActivityTestRule<LongListActivity> activityRule = new ActivityTestRule<>(LongListActivity.class);
@Test
public void testListItemPositionClick() {
onData(instanceOf(Map.class)).atPosition(50)
.onChildView(withId(R.id.rowToggleButton)).perform(click()).check(matches(withText("ON")));
onData(allOf(is(instanceOf(Map.class)), hasEntry("ROW_TEXT", "item: 88"))).
onChildView(withId(R.id.rowToggleButton)).perform(click()).check(matches(withText("ON")));
}
}
运行操作是:1. 在位置50的 toggle button 上,执行点击操作。
? 2. 找到文本值是 “item: 88” 的item上,找到 toggle button,执行点击操作。
这是对ListView最基本的两种操作。
其他操作
@RunWith(AndroidJUnit4.class)
public class ListViewTest {
@Rule
public ActivityTestRule<LongListActivity> activityRule = new ActivityTestRule<>(LongListActivity.class);
@Test
public void checkDisplayed() {
onData(hasEntry(equalTo("ROW_TEXT"), is("item: 99"))).check(matches(isCompletelyDisplayed()));
}
}
|