Java – espresso click menu item
I have a menu in the actionbar I created:
@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,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;
}
And menu_ main. The XML is as follows:
<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>
When testing in espresso, I want to click the "add" icon (menuid 99) I tried
@Test
public void testAdd() {
openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());
onView(withText(R.string.add)).perform(click());
}
But if nomatchingviewexception fails (setting item, which is defined directly in XML, I can click with the same code.)
This is for targetsdkversion 23 and appcompatactivity Toolbar related behaviors:
Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);
if( getSupportActionBar() != null ) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
And tool_ bar. The XML is as follows:
<?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>
Solution
Update: I didn't see the last line, ignored my previous reply, I tried to fix it, I made a mistake I really don't know the answer
...setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
Your question is explained here by the espresso team:
// 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());
So I understand that both options are correct, but it depends on your specific situation If you test a button, you usually know whether it is visible
In your case, the button is visible because there is space. Use withid like @ L_ 403_ 1 @ is correct:
import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu;
@Test
public void testClickInsertItem() {
openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());
onView(withId(R.id.action_insert)).perform(click());
}
But this overflow is also correct:
Now my question is, what should you do when you test on different devices, and you don't know when there will be a project space I don't know the response, maybe a combination of two solutions
