java – Espresso单击菜单项

我在我创建的actionbar中有一个菜单
@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
normal action bar as some devices have a hardware overflow menu button
(they will open the overflowing items in an options menu) and some
devices have a software overflow menu button (they will open a normal
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
Android,the View representing the menu item doesn’t have the ID of
the menu item. So onView(withId(X)) just fails to find a View. I don’t
have a better recommendation than just using withText(). If you have
multiple views with the same text,using hierarchy for distinction
works.

现在我的问题是,当您在不同的设备上测试时,该怎么办,而且您不知道什么时候会有一个项目的空间.我不知道回应,也许结合了两个解决方案.

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...