web-dev-qa-db-ja.com

エスプレッソクリックメニュー項目

アクションバーに作成したメニューがあります:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    menu.add(Menu.NONE, 98,Menu.NONE,R.string.filter).setIcon(R.drawable.ic_filter_list_white_48dp).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    menu.add(Menu.NONE, 99,Menu.NONE,R.string.add).setIcon(R.drawable.ic_add_white_48dp).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);


    getMenuInflater().inflate(R.menu.menu_main, menu);

    return true;
}

menu_main.xmlは次のようになります。

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    tools:context=".MainActivity">
    <item
        Android:id="@+id/action_settings"
        Android:title="@string/action_settings"
        Android:orderInCategory="100"
        app:showAsAction="never"
        Android:icon="@drawable/ic_settings_white_48dp"/>
</menu>

Espressoでテストする場合、「追加」アイコン(menuId 99)をクリックします。私は試した

@Test
public void testAdd() {
openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());
    onView(withText(R.string.add)).perform(click());
}

しかし、これはNoMatchingViewExceptionで失敗します。 (xmlで直接定義されている設定項目は、同じコードでクリックできます。)

これは、targetSdkVersion 23とAppCompatActivityの場合です。ツールバーに関連する行は次のとおりです。

Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);
if( getSupportActionBar() != null ) {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

そして、tool_bar.xmlは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar     xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:theme="@style/ThemeOverlay.AppCompat.Dark"
    Android:background="@color/ColorPrimary"
    Android:elevation="4dp"
    tools:ignore="UnusedAttribute">
</Android.support.v7.widget.Toolbar>
21
user1583209

Update:行の最後が表示されず、以前の応答を無視し、すばやく修正しようとしましたが、間違っていました。私は本当に答えを知りませんでした。

...setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)

あなたの質問はエスプレッソチームによって こちら で説明されています:

一致する表示アイコン:

  // Click on the icon - we can find it by the r.Id.
  onView(withId(R.id.action_save))
    .perform(click());

一部のデバイスにはハードウェアオーバーフローメニューボタンがあり(オプションメニューでオーバーフローするアイテムが開きます)、一部のデバイスにはソフトウェアオーバーフローメニューボタンがあります(開く)通常のオーバーフローメニュー)。幸いなことに、エスプレッソがそれを処理してくれます。

  // Open the overflow menu OR open the options menu,
  // depending on if the device has a hardware or software overflow menu button.
  openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());

  // Click the item.
  onView(withText("World"))
    .perform(click());

したがって、どちらの選択肢も正しいが、特定のケースに依存することを理解しています。ボタンをテストすると、通常、その時点でボタンが表示されているかどうかがわかります。

あなたの場合、ボタンはスペースがあるので見えるので、 here のようなwithIdを使用するのが正しいです。

import static Android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu;

@Test
public void testClickInsertItem() {
    openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());
    onView(withId(R.id.action_insert)).perform(click());
}

しかし、 this オーバーフロー項目についても正しい:

はい、これがエスプレッソの仕組みです。ここでの問題は、Androidでは、メニュー項目を表すビューにメニュー項目のIDがないことです。そのため、onView(withId(X))はビューの検索に失敗します。 withText()を使用する以上の推奨事項はありません。同じテキストを持つ複数のビューがある場合、区別に階層を使用すると機能します。

さて、私の質問は、さまざまなデバイスでテストするときに何をすべきかであり、アイテムをいつ入れるかがわからないということです。私は応答を知りません、おそらく両方のソリューションを組み合わせます。

37
albodelu

このメソッドを使用して、メニュー項目をクリックできます。このコードを使用して最初にメニューボタンをクリックします

openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());

次に、テキストに基づいてメニュー項目をクリックします。メニュー項目名を「MenuItemName」に置き換えます

onView(withText("MenuItemName")).perform(click());
3
Ishan Fernando

これは、ハードウェアメニューボタン、オーバーフローメニュー、アイコンのみの3つの状況すべてをカバーする私のソリューションです。

    try {
        openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());
    } catch (Exception e) {
        //This is normal. Maybe we dont have overflow menu.
    }
    onView(anyOf(withText(R.string.<your label for the menu item>), withId(R.id.<id of the menu item>))).perform(click());
3
guni

それほど苦しむ必要はありません。しましょう単純化

onView(withId(98)).perform(click());

これは、追加をクリックするのに役立ちます

1
Manish
_Espresso.openContextualActionModeOverflowMenu() 
_

サムスン注3で機能した唯一のオプションでした。このopenActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());はエラーなしで試行および失敗します

1
gorbysbm

これを使用して、メニュー項目の説明テキストを照合します。

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

その場合、(存在しない)IDや描画可能アイコンで一致する必要はありません。

また、メニューが展開されていることを確認する必要がある場合は、 Espressoドキュメント からこのコードスニペットを使用することを忘れないでください。

// Open the overflow menu OR open the options menu,
// depending on if the device has a hardware or software overflow menu button.
openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());
1
Eirik W

ツールバーはactionBarではなく、呼び出しの必要はありません:

openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());

そして、それを行うと、アイテムがそこに見つからず(ActionBarにない)、ToolBarが「通常のビュー」に属することは確実です。