获取 espresso 中的一个项目
Get an item of an item in espresso
我是 Espresso 的初学者。我有这个 menu.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/configuration"
android:icon="@drawable/ic_settings"
android:title="Configuration"
app:showAsAction="ifRoom">
<menu>
<item
android:id="@+id/add_sound"
android:title="Add a sound"
app:showAsAction="ifRoom" />
<item
android:id="@+id/takeof_sound"
android:enabled="false"
android:title="Take of the sound"
app:showAsAction="ifRoom" />
<item
android:id="@+id/add_image"
android:title="Add an image"
app:showAsAction="ifRoom" />
<item
android:id="@+id/takeof_image"
android:enabled="false"
android:title="Take of the image"
app:showAsAction="ifRoom" />
</menu>
</item>
<item
android:id="@+id/add"
android:icon="@drawable/ic_add"
android:title="Add"
app:showAsAction="ifRoom" />
</menu>
我想点击 ID 为 configuration
的项目,然后点击 ID 为 add_sound
的子项目。所以,我输入了这段代码:
public void menuConfigurationTest()
{
onView(withId(R.id.configuration)).perform(click());
onView(withId(R.id.add_sound)).perform(click());
}
但是我得到这个错误:
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: com.example.adrien.smartalarm:id/add_sound
If the target view is not part of the view hierarchy, you may need to use Espresso.onData to load it from one of the following AdapterViews:android.support.v7.widget.MenuPopupWindow$MenuDropDownListView{5a0c4d8 VFED.VC.. .F...... 0,0-686,672}
我做的有什么问题吗?
问题是子菜单显示在 PopupWindow 中,它不是 activity 视图层次结构的一部分。因此你必须添加:
.inRoot(RootMatchers.isPlatformPopup())
接下来是项目显示在名为 MenuDropDownListView 的特殊 ListView 中。所以onView()在这里不起作用,你必须使用onData()。
因此完整的表达式是:
onData(CoreMatchers.anything())
.inRoot(RootMatchers.isPlatformPopup()) // isPlatformPopup() == is in PopupWindow
.inAdapterView(CoreMatchers.<View>instanceOf(MenuPopupWindow.MenuDropDownListView.class))
.atPosition(0) // for the first submenu item, here: add_sound
.perform(click());
我是 Espresso 的初学者。我有这个 menu.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/configuration"
android:icon="@drawable/ic_settings"
android:title="Configuration"
app:showAsAction="ifRoom">
<menu>
<item
android:id="@+id/add_sound"
android:title="Add a sound"
app:showAsAction="ifRoom" />
<item
android:id="@+id/takeof_sound"
android:enabled="false"
android:title="Take of the sound"
app:showAsAction="ifRoom" />
<item
android:id="@+id/add_image"
android:title="Add an image"
app:showAsAction="ifRoom" />
<item
android:id="@+id/takeof_image"
android:enabled="false"
android:title="Take of the image"
app:showAsAction="ifRoom" />
</menu>
</item>
<item
android:id="@+id/add"
android:icon="@drawable/ic_add"
android:title="Add"
app:showAsAction="ifRoom" />
</menu>
我想点击 ID 为 configuration
的项目,然后点击 ID 为 add_sound
的子项目。所以,我输入了这段代码:
public void menuConfigurationTest()
{
onView(withId(R.id.configuration)).perform(click());
onView(withId(R.id.add_sound)).perform(click());
}
但是我得到这个错误:
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: com.example.adrien.smartalarm:id/add_sound
If the target view is not part of the view hierarchy, you may need to use Espresso.onData to load it from one of the following AdapterViews:android.support.v7.widget.MenuPopupWindow$MenuDropDownListView{5a0c4d8 VFED.VC.. .F...... 0,0-686,672}
我做的有什么问题吗?
问题是子菜单显示在 PopupWindow 中,它不是 activity 视图层次结构的一部分。因此你必须添加:
.inRoot(RootMatchers.isPlatformPopup())
接下来是项目显示在名为 MenuDropDownListView 的特殊 ListView 中。所以onView()在这里不起作用,你必须使用onData()。
因此完整的表达式是:
onData(CoreMatchers.anything())
.inRoot(RootMatchers.isPlatformPopup()) // isPlatformPopup() == is in PopupWindow
.inAdapterView(CoreMatchers.<View>instanceOf(MenuPopupWindow.MenuDropDownListView.class))
.atPosition(0) // for the first submenu item, here: add_sound
.perform(click());