可以在 Android 上用 Espresso 测试 Support v7 SearchView

Can one test Support v7 SearchView with Espresso on Android

我正在 Android 对我的应用程序进行一些仪器测试,但遇到了困难。我有一个来自 android 的 v7 支持库的 SearchView,我想以某种方式测试它。我猜它不能直接点击,因为我用传统的方式尝试过,比如:

onView(withId(R.id.search_view)).perform(click())

有什么方法可以用 Espresso 测试这种 SearchView 吗?

解决方案取决于 SearchView 的初始状态。如果折叠,则必须先打开它:

onView(withId(R.id.your_search_menu_id)).perform(click());

然后你就可以输入了。

有两种方式:

  1. 通过搜索自动完成id,即public

    onView(withId(android.support.design.R.id.search_src_text)).perform(typeText("something"));
    
  2. 通过使用事实,它是 AutoCompleteTextView

    onView(isAssignableFrom(AutoCompleteTextView.class)).perform(typeText("something"));
    

出于某种原因 click() 对我不起作用。

我将这个表达式扩展用于 searchViews,用 kotlin 编写:

 class SearchViewActionExtension {

    companion object {
        fun submitText(text: String): ViewAction {
            return object : ViewAction {
                override fun getConstraints(): Matcher<View> {
                    return allOf(isDisplayed(), isAssignableFrom(SearchView::class.java))
                }

                override fun getDescription(): String {
                    return "Set text and submit"
                }

                override fun perform(uiController: UiController, view: View) {
                    (view as SearchView).setQuery(text, true) //submit=true will fire search
                }
            }
        }
        fun typeText(text: String): ViewAction {
            return object : ViewAction {
                override fun getConstraints(): Matcher<View> {
                    return allOf(isDisplayed(), isAssignableFrom(SearchView::class.java))
                }

                override fun getDescription(): String {
                    return "Set text"
                }

                override fun perform(uiController: UiController, view: View) {
                    (view as SearchView).setQuery(text, false)
                }
            }
        }
    }
}

通过为提交参数调用 setQuery,它会立即触发搜索。

用法:

onView(withId(R.id.search_box))
            .perform(SearchViewActionExtension.submitText("search text"))

AndroidX

您可以使用 Resource#getSystem 获取视图

Resources.getSystem().getIdentifier("search_src_text",
    "id", "android")


onView(withId(Resources.getSystem().getIdentifier("search_src_text",
"id", "android"))).perform(clearText(),typeText("enter the text"))
.perform(pressKey(KeyEvent.KEYCODE_ENTER))