单击带有Espresso的主页图标

时间:2014-06-01 22:30:22

标签: android testing android-espresso

我试图通过以下方式点击一些Espresso测试中的主页图标:

onView(withId(android.R.id.home)).perform(click());

这适用于Android> 3.0 - 但旧版本失败,因为appcompat似乎没有使用此ID作为此元素。做我想做的事情的好方法是什么?

14 个答案:

答案 0 :(得分:65)

要不依赖于应用语言环境,您可以使用来自Matt Logan的代码,将“向上导航”替换为R.string.abc_action_bar_up_description:

onView(withContentDescription(R.string.abc_action_bar_up_description)).perform(click());

这对我帮助很大,因为我有一个超过5种语言的应用程序,我必须这样做。

答案 1 :(得分:24)

使用withContentDescription() Matcher

onView(withContentDescription("Navigate up")).perform(click());

答案 2 :(得分:17)

我无法从一个Activity导航到另一个Activity,但后来我找到了顶级操作:

Espresso.pressBack();

答案 3 :(得分:13)

我找到了解决这个问题的真正方法。通过使用hierarchyviewer我发现工具栏看起来像这样: hierarchyviewer screenshot

这意味着我们可以匹配汉堡包图标(不是后退按钮),如下所示:

onView(withContentDescription("Open navigation")).perform(click());

但更好的解决方案是找出汉堡图标是唯一的ImageButton和v7工具栏的直接子视图。所以我写了一个辅助方法来匹配它:

public static Matcher<View> androidHomeMatcher() {
    return allOf(
        withParent(withClassName(is(Toolbar.class.getName()))),
        withClassName(anyOf(
            is(ImageButton.class.getName()),
            is(AppCompatImageButton.class.getName())
    )));
}

@Test
public void clickHamburgerIcon() throws Exception {
    onView(androidHomeMatcher()).perform(click());
    // ...
}

此解决方案更好,因为无论您在测试中使用哪种语言环境,它都应与视图匹配。 : - )

编辑:请注意,工具栏可能是android.support.v7.widget.Toolbar或android.widget.Toolbar - 具体取决于您的使用情况!

编辑:支持lib版本24.2.0使用AppCompatImageButton而不是ImageButton,所以我也添加了它。

编辑:您必须导入正确的方法才能使其正常工作。以下是使用的进口商品:

import static android.support.test.espresso.matcher.ViewMatchers.withClassName;
import static android.support.test.espresso.matcher.ViewMatchers.withParent;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.is;

答案 4 :(得分:5)

我在模拟器中遇到“导航”问题,这对我有用:

onView(isRoot()).perform(ViewActions.pressMenuKey());

答案 5 :(得分:4)

Espresso.pressBack();

onView(withContentDescription("Navigate up")).perform(click());

答案 6 :(得分:2)

按回查看:

onView(isRoot()).perform(pressBack());

答案 7 :(得分:2)

public static Matcher<View> navigationIconMatcher() {
    return allOf(
            isAssignableFrom(ImageButton.class),
            withParent(isAssignableFrom(Toolbar.class)));
}

@Test
public void clickHamburgerIcon() throws Exception {
onView(navigationIconMatcher()).perform(click());
// ...
}

总是有效!

答案 8 :(得分:0)

//click on the navigation up button to go back to the list
onView(withContentDescription(getToolbarNavigationContentDescription())).perform(click());

方法:

private String getToolbarNavigationContentDescription() {
    return TestUtils.getToolbarNavigationContentDescription(
            activityTestRule.getActivity(), R.id.toolbar);
}

public static String getToolbarNavigationContentDescription(
        @NonNull Activity activity, @IdRes int toolbarId) {
    Toolbar toolbar = activity.findViewById(toolbarId);
    if (toolbar != null) {
        return (String) toolbar.getNavigationContentDescription();
    } else {
        throw new RuntimeException("No toolbar found.");
    }
}

答案 9 :(得分:0)

如果您打算打开/关闭抽屉,我建议使用Espresso contrib库:

onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());

答案 10 :(得分:0)

onView(withContentDescription(“打开导航抽屉”))。perform(click())

这对我有帮助

答案 11 :(得分:0)

更新: 我找不到R.string.abc_action_bar_up_description,也许与androidx有关。我对此不太确定。 相反,我使用了R.string.nav_app_bar_navigate_up_description 代码如下:

onView(withContentDescription(R.string.nav_app_bar_navigate_up_description)).perform(click())

答案 12 :(得分:-1)

也许你可以致电:

pressKey(KeyEvent.KEYCODE_HOME);

答案 13 :(得分:-2)

在您的活动中添加onbackpress,并使用:

onView(withContentDescription("Navigate up")).perform(click());