Android Espresso GridView滚动到每个项目并执行单击它们

时间:2016-02-16 12:42:19

标签: android gridview android-espresso

我有一个GridView加载数据,网格中的一些项目是“组”项 包含不同的数据集。如果存在,GridView可以滚动 很多数据。

在某些设备上,GridView有三列,而在其他设备上,根据设备屏幕宽度,只有两列。

我需要测试的是滚动到网格中的特定(带文本)项目,打开它然后关闭它(后退按钮= simpleClick)。然后滚动到具有特定文本的第二个项目并打开然后将其关闭(后退按钮= simpleClick)。

我尝试了一些滑动方法,然后执行点击 在他们身上,但这种方法失败了,因为你需要确切知道多少 在我可以单击以打开项目组之前执行滑动/滚动 - 特定于设备的是坏的。同时执行太多滚动比到达屏幕底部所需的滚动似乎减慢了测试!!相当!!一点点。

   private void scrollDown() {
        Log.d(TAG, "scrollDown: ");
        onView(withId(R.id.main_grid))
                .perform(swipeUp());
    }

    private void scrollUp() {
        Log.d(TAG, "scrollUp: ");
        onView(withId(R.id.main_grid))
                .perform(swipeDown());

    }

private void clickOn(final String text) {

    onView(withText(new Matcher<String>() {
            @Override
            public boolean matches(Object item) {

                if (item instanceof String) {
                    if (((String) item).contains(text))
                        return true;
                    else
                        return false;
                }
                return false;
            }

            @Override
            public void describeMismatch(Object item, Description mismatchDescription) {

            }

            @Override
            public void _dont_implement_Matcher___instead_extend_BaseMatcher_() {

            }

            @Override
            public void describeTo(Description description) {

            }
    }))
        .perform(click());
}

我也试过这个,但焦点设置为每个项目 但是当它到达屏幕的末尾时,需要手动滚动 在设备上 - 它不会滚动屏幕。

for (int i = 0 ; i < 20; i++) {
               onData(anything())
                       .inAdapterView(allOf(withId(R.id.main_grid), isDisplayed()))
                       .atPosition(i)
                       .check(matches(isDisplayed()));
}

我也尝试过使用onData,但是我无法成功(编译/构建), 因为我正在使用CursorLoader和ResourceCursorAdapter。

解决我的测试用例的任何示例都很棒。

1 个答案:

答案 0 :(得分:0)

是的,你应该使用onData语句来避免在GridView中滚动的问题。您可以在此处查看示例 - http://droidtestlab.com/adapterView.html

但在你的情况下,你将android.database.Cursor接口作为onData的参数。像这样的东西(在这里你指定你想在GridView中等待第一列相等的数据&#34; VALUE&#34;然后点击此记录):

onData(allOf(is(new BoundedMatcher<Object, Cursor>(Cursor.class) {
    @Override
    public void describeTo(Description description) {
    }
    @Override
    protected boolean matchesSafely(Cursor cursor) {
        return cursor.getString(0).equals("VALUE");
    }
}))).inAdapterView(withId(<ADAPTER_ID>)).perform(click());