Android Espresso Recycle使用和一些坑

2016-09-07  本文已影响919人  挨踢小能手

Android Espresso基本使用中讲了基本的使用方法,下面讲列表的使用

要对Recycle进行操作,先要修改bulid.gradle引入一些包

dependencies {
    androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0') {
        exclude group: 'com.android.support', module: 'appcompat'
        exclude group: 'com.android.support', module: 'support-v4'
        exclude module: 'recyclerview-v7'
    }
}

下面看看怎么使用

onView(allOf(withId(R.id.recycleview),isDisplayed())).perform(RecyclerViewActions.actionOnItemAtPosition(0,click()));

前面与普通的View一样没区别,perform时,要引入RecyclerViewActions.class 这个类的方法对RecycleView进行操作,RecyclerViewActions.actionOnItemAtPosition根据其名字,可能你已经猜到,这个点击第0位置的item。

还有其他用法,如要找到RecycleView里面文字为Hello的item

onView(withId(R.id.recyclerView)) .perform(RecyclerViewActions.actionOnItem( hasDescendant(withText("Hello ")), click()));    

下面说说遇到的一些坑

1.如果ViewPager结合RecycleView,而RecycleView的ID相同,如果直接使用

onView(allOf(withId(R.id.recycleview))); 

去找这个RecycleView,那么会报AmbiguousViewMatcherException这个错,因为这个页面有多个相同的ID,解决方面也比较简单如下

onView(allOf(withId(R.id.recycleview),isDisplayed()));

加一个约束条件,要正在显示的即可。

2.如何模拟退出Activity的返回操作?
Espresso.pressBack();

3.是否可以判断这个View存不存在,返回一个boolen

老外解答如下:http://stackoverflow.com/questions/20807131/espresso-return-boolean-if-view-exists/20811193#20811193 Espresso不推荐在测试使用条件逻辑,找不到而不想直接报错只能try catch

 try {
        onView(withText("my button")).check(matches(isDisplayed()));
        //view is displayed logic
    } catch (NoMatchingViewException e) {
        //view not displayed logic
    }

4.有2个一样文字View,怎么只使用第一次找到的这个View
需要自定义一个Matcher使用如下

    public static  <T> Matcher<T> firstFindView(final Matcher<T> matcher) {
        return new BaseMatcher<T>() {
            boolean isFirst = true;

            @Override
            public boolean matches(final Object item) {
                if (isFirst && matcher.matches(item)) {
                    isFirst = false;
                    return true;
                }
                return false;
            }

            @Override
            public void describeTo(final Description description) {
                description.appendText("should return first matching item");
            }
        };
    }

然后这样使用:

onView(allOf(isDisplayed(),firstFindView(withText("Hello"))));

目前就这些,还有其他坑以后再补上

上一篇下一篇

猜你喜欢

热点阅读