私はいくつかのエスプレッソテストでホームアイコンをクリックしようとしています:
onView(withId(Android.R.id.home)).perform(click());
これはAndroid> 3.0に対しては正常に動作します-しかし、appcompat
はこの要素に対してこのIDを使用していないように見えるため、古いバージョンでは失敗します。やってみたいです?
アプリのロケールに依存しないようにするには、「Navigate up」をR.string.abc_action_bar_up_descriptionに置き換えることで Matt Logan のコードを使用できます。
onView(withContentDescription(R.string.abc_action_bar_up_description)).perform(click());
私は5つ以上の言語でアプリを持っているので、このように行動しなければならなかったので、これは私を大いに助けました。
withContentDescription()
Matcher
を使用します。
onView(withContentDescription("Navigate up")).perform(click());
あるアクティビティから別のアクティビティに戻るのに問題がありましたが、トップレベルのアクションが見つかりました:
Espresso.pressBack();
この問題の本当の解決策を見つけました。階層ビューアを使用して、ツールバーが次のようになっていることがわかりました。
これは、次のようにハンバーガーアイコン(戻るボタンではない)を一致させることができることを意味します。
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はImageButtonの代わりにAppCompatImageButtonを使用するので、私もそれを追加しました。
編集:これを機能させるには、正しいメソッドをインポートする必要があります。使用されるインポートは次のとおりです。
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;
エミュレータで「Navigate up」で問題が発生していましたが、これでうまくいきました。
onView(isRoot()).perform(ViewActions.pressMenuKey());
Espresso.pressBack();
または
onView(withContentDescription("Navigate up")).perform(click());
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());
//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.");
}
}
引き出しを開閉する場合は、Espresso contribライブラリを使用することをお勧めします。
onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());