用浓咖啡点击主页图标

我想通过以下方式在一些Espressotesting中点击主页图标:

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

这适用于Android 3.0以上的版本,但是对于旧版本appcompat失败,因为appcompat似乎没有为此元素使用此ID。 什么是做我想做的一个好方法?

Solutions Collecting From Web of "用浓咖啡点击主页图标"

为了不依赖应用程序语言环境,可以使用来自Matt Logan的代码,用R.string.abc_action_bar_up_descriptionreplace“导航”

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

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

使用withContentDescription() Matcher

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

我从一个Activity导航回到另一个时遇到了困难,但是后来我发现了一些顶级的操作:

 Espresso.pressBack(); 

我find了一个真正的解决这个问题。 通过使用hierarchyviewer,我发现工具栏看起来像这样: hierarchyviewer截图

这意味着我们可以像这样匹配汉堡包图标(不是后退button):

 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()); // ... } 

这个解决scheme更好,因为无论您在testing中使用哪种语言环境,它都应与视图匹配。 🙂

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

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

编辑:你必须导入正确的方法来获得这个工作。 这里是使用的import:

 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; 

我在模拟器中遇到了“导航”的问题,这为我工作:

 onView(isRoot()).perform(ViewActions.pressMenuKey()); 
 public static Matcher<View> navigationIconMatcher() { return allOf( isAssignableFrom(ImageButton.class), withParent(isAssignableFrom(Toolbar.class))); } @Test public void clickHamburgerIcon() throws Exception { onView(navigationIconMatcher()).perform(click()); // ... } 

这工作总是!

按回来查看:

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

要么

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

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

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

也许你可以打电话给:

 pressKey(KeyEvent.KEYCODE_HOME);