Espresso点击菜单项 [英] Espresso click menu item

查看:639
本文介绍了Espresso点击菜单项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在操作栏中有一个菜单,我通过创建:

I have a menu in the actionbar which I create through:

@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如下所示:

and menu_main.xml looks like:

<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中测试时,我想点击添加图标我尝试了

When testing in Espresso I would like to click on the "add" icon (menuId 99). I tried

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

但是这会失败并显示NoMatchingViewException。 (设置项,这是在xml中直接定义的,我可以用相同的代码点击。)

but this fails with a NoMatchingViewException. ( The settings item, which is defined in the xml directly I can click with the same code. )

这是targetSdkVersion 23和AppCompatActivity。工具栏的相关行如下:

That's for targetSdkVersion 23 and AppCompatActivity. The relevant lines for the tool bar are:

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

和tool_bar.xml如下所示:

and tool_bar.xml looks like:

<?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>


推荐答案

更新:I didn看到最后的行,忽略我以前的回应,我试图修复它,我做错了。我真的不知道答案。

Update: I didn't see the final of the line, ignore my previous responses, I tried to fix it fast and I did wrong. I really didn't know the answer.

...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());




点击溢出菜单中的项目有点棘手b $ b正常操作栏,因为一些设备有一个硬件溢出菜单按钮
(他们将打开一个选项菜单中的溢出项)和一些
设备有一个软件溢出菜单按钮(他们将打开一个正常
溢出菜单)。幸运的是,Espresso为我们处理了。

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());

所以我明白两个选择都是正确的,但取决于你的具体情况。如果你测试一个按钮,你通常知道它是否可见或在那一刻。

So I understand that both alternatives are correct but depend on your specific case. If you test a button you normally know if it's visible or not at that moment.

在您的情况下,按钮是可见的,因为有空间,正确使用 withId 这里

In your case the button is visible because there is room, and it's correct to use withId like here:

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 it's correct too for overflow items:


是的,这是它在Espresso中的工作原理。这里的问题是,在
Android中,代表菜单项的视图没有菜单项的
的ID。所以onView(withId(X))只是无法找到一个视图。我不
有一个更好的建议,而不仅仅是使用withtext()。如果你有
多个视图与相同的文本,使用层次结构以区分
工作。

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.

是当你在不同的设备上测试,你不知道什么时候会有一个项目的空间做什么。我不知道答案,或许结合这两种解决方案。

Now my question is what to do when you test on different devices and you don't know when will be room for an item. I don't know the response, perhaps combine both solutions.

这篇关于Espresso点击菜单项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆