@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; }
而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>
解决方法
...setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
您的问题由Espresso团队here解释:
Matching visible icons:
// Click on the icon - we can find it by the r.Id. onView(withId(R.id.action_save)) .perform(click());
Clicking on items in the overflow menu is a bit trickier for the@H_404_38@ normal action bar as some devices have a hardware overflow menu button@H_404_38@ (they will open the overflowing items in an options menu) and some@H_404_38@ devices have a software overflow menu button (they will open a normal@H_404_38@ overflow menu). Luckily,Espresso handles that for us.
// 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());
所以我明白,两种选择都是正确的,但取决于你的具体情况.如果您测试一个按钮,通常知道它是否可见.
在你的情况下,按钮是可见的,因为有空间,使用withId像here是正确的:
import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu; @Test public void testClickInsertItem() { openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext()); onView(withId(R.id.action_insert)).perform(click()); }
但this溢出物品也是正确的:
Yes,this is how it works in Espresso. The problem here is,that in@H_404_38@ Android,the View representing the menu item doesn’t have the ID of@H_404_38@ the menu item. So onView(withId(X)) just fails to find a View. I don’t@H_404_38@ have a better recommendation than just using withText(). If you have@H_404_38@ multiple views with the same text,using hierarchy for distinction@H_404_38@ works.
现在我的问题是,当您在不同的设备上测试时,该怎么办,而且您不知道什么时候会有一个项目的空间.我不知道回应,也许结合了两个解决方案.