如何在android测试中获取没有id的视图的子节点

时间:2015-10-01 08:31:50

标签: android testing android-espresso

我想在测试期间点击汉堡菜单icon打开导航抽屉。

目前,操作栏的层次结构如下:

...
Toolbar (@id/action_bar)
  TextView (no-id)
  ImageButton (no-id) <-- this is the hamburger menu
  ...
...

使用Espresso只有withIdwithText等的匹配器,这不符合我的目的。

2 个答案:

答案 0 :(得分:1)

好的,结果使用自定义ViewMatcher可以解决问题:

这里匹配器必须匹配一个父ID为action_bar并且是ImageView的视图。

onView(childOf(withId(android.support.v7.appcompat.R.id.action_bar),
            withClassName(is(ImageButton.class.getName()))))
            .perform(click());

方法childOf如下:

Matcher<View> childOf(Matcher<View> parentMatcher,
        Matcher<View> childMatcher) {
    return new TypeSafeMatcher<View>() {
        @Override
        public void describeTo(Description description) {
             // creation of description left as an exercise
        }

        @Override
        protected boolean matchesSafely(View view) {
            if (view.getParent() instanceof ViewGroup) {
                ViewGroup parent = (ViewGroup) view.getParent();
                return parentMatcher.matches(parent) && childMatcher
                        .matches(view);
            }
            return false;
        }
    };
}

该方法允许使用各种子ViewMatcher,因此您可以在需要时使用自定义视图匹配器。

参考文献:

  1. espresso custom-matcher sample

答案 1 :(得分:1)

您可以合并allOfwithParent来查明该视图:

onView(
    allOf(
      withClassName(is(ImageButton.class.getName())),
      withParent(withId(android.support.v7.appcompat.R.id.action_bar)))
  .perform(click());

更多信息:http://blog.sqisland.com/2015/05/espresso-match-toolbar-title.html