2016-02-16 29 views
0

我有一个GridView加载数据,并且网格中的一些项目是包含不同数据集的“组”项目 。如果有大量数据,GridView可以滚动。Android Espresso 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())); 
} 

我也使用了昂达我不能获得成功(编译/编译), 因为我使用的是CursorLoader和ResourceCursorAdapter尝试。

任何解决我的测试案例的例子都会很棒。

回答

0

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

但在你的情况下,你会有android.database.Cursor接口作为onData的参数。像这样的东西(这里您指定要等待GridView中第一列等于“VALUE”的数据,然后单击此记录):

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()); 
相关问题