一个测试可以在Android上支持带有浓缩咖啡的v7 SearchView吗

一个测试可以在Android上支持带有浓缩咖啡的v7 SearchView吗,android,android-support-library,searchview,android-espresso,Android,Android Support Library,Searchview,Android Espresso,我正在安卓系统中对我的应用程序进行测试,但遇到了麻烦。我有一个来自android v7支持库的SearchView,我想以某种方式对此进行测试。我想它不是直接点击的,因为我用传统的方式尝试过,比如: onView(withId(R.id.search_view)).perform(click()) 有没有办法用浓缩咖啡测试这种SearchView?解决方案取决于SearchView的初始状态。如果它已折叠,您必须首先打开它: onView(withId(R.id.your_search_men

我正在安卓系统中对我的应用程序进行测试,但遇到了麻烦。我有一个来自android v7支持库的SearchView,我想以某种方式对此进行测试。我想它不是直接点击的,因为我用传统的方式尝试过,比如:

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

有没有办法用浓缩咖啡测试这种
SearchView

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

onView(withId(R.id.your_search_menu_id)).perform(click());
然后你可以把它打进去

有两种方法:

  • 按搜索自动完成id,它是公共的

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

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

  • 由于某种原因,
    click()
    对我不起作用

    我对SearchView使用了这个表达式的扩展,用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)
                    }
                }
            }
        }
    }
    
    对于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))
    

    它在溢出菜单内吗?不,它本身就在上面。不,它只是一个搜索视图。请查看文档:“在字符串末尾添加一个\n将转换为一个回车键事件”。如果您的布局中有一个作为小部件的搜索视图,您需要先单击搜索按钮来测试输入<代码>打开视图(withId(android.support.design.R.id.search_按钮)).perform(单击())
    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))