如何使用Espresso匹配此表格单元格?

时间:2014-09-22 13:39:09

标签: android android-layout android-testing hamcrest android-espresso

我需要匹配由红色矩形突出显示的视图。我应该为它写出哪种Espresso表达式?

enter image description here

这是一个表格布局,所有单元格都是TextView的实例。单元格视图没有唯一的ID。感兴趣的视图可能包含也可能没有文本。我所知道的是,这种观点总是位于" Food Group"细胞

欢迎任何线索。

1 个答案:

答案 0 :(得分:6)

这是我在你的案例中写的测试。

public void testCellBelowFoodGroup() {
    getActivity();
    onView(
        allOf(
            isDescendantOfA(isAssignableFrom(TableLayout.class)),
            isInRowBelow(withText("Food Group")),
            hasChildPosition(0)
            )
    ).check(matches(withText("TEXT TO BE FOUND")));
}

因此,我们正在寻找一个给定TableLayout内的视图,该视图位于" Food Group"文本,这是该行的最左边元素。然后,我们可以使用该视图执行任何操作,例如检查它的文字。

Espresso不提供

isInRowBelowhasChildPosition,它们是自定义方法,与使用Espresso进行测试时一样:建议您创建自己的视图断言并查看匹配器。

这是实施。

static Matcher<View> isInRowBelow(final Matcher<View> viewInRowAbove) {
    checkNotNull(viewInRowAbove);
    return new TypeSafeMatcher<View>(){

        @Override
        public void describeTo(Description description) {
            description.appendText("is below a: ");
            viewInRowAbove.describeTo(description);
        }

        @Override
        public boolean matchesSafely(View view) {
            // Find the current row
            ViewParent viewParent = view.getParent();
            if (!(viewParent instanceof TableRow)) {
                return false;
            }
            TableRow currentRow = (TableRow) viewParent;
            // Find the row above
            TableLayout table = (TableLayout) currentRow.getParent();
            int currentRowIndex = table.indexOfChild(currentRow);
            if (currentRowIndex < 1) {
                return false;
            }
            TableRow rowAbove = (TableRow) table.getChildAt(currentRowIndex - 1);
            // Does the row above contains at least one view that matches viewInRowAbove?
            for(int i = 0 ; i < rowAbove.getChildCount() ; i++) {
                if (viewInRowAbove.matches(rowAbove.getChildAt(i))) {
                    return true;
                }
            }
            return false;
        }};
}

static Matcher<View> hasChildPosition(final int i) {
    return new TypeSafeMatcher<View>(){

        @Override
        public void describeTo(Description description) {
            description.appendText("is child #" + i);
        }

        @Override
        public boolean matchesSafely(View view) {
            ViewParent viewParent = view.getParent();
            if (!(viewParent instanceof ViewGroup)) {
                return false;
            }
            ViewGroup viewGroup = (ViewGroup) viewParent;
            return (viewGroup.indexOfChild(view) == i);
        }};
}

完整的源代码可以从https://github.com/acontal/android-stackoverflow-espresso-match_table_cell

下载