【问题标题】:Can one test Support v7 SearchView with Espresso on Android可以在 Android 上使用 Espresso 测试 Support v7 SearchView
【发布时间】:2017-03-02 16:49:59
【问题描述】:

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

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

有什么方法可以用 Espresso 测试这样的SearchView

【问题讨论】:

    标签: android android-support-library searchview android-espresso


    【解决方案1】:

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

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

    然后你就可以输入了。

    有两种方式:

    1. 通过搜索自动完成 id,它是公开的

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

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

    【讨论】:

    • 在溢出菜单里面吗?
    • 不,它本身就在顶部。
    • 不只是search_view
    • 请查看 typeText 的文档:“将 \n 附加到字符串的末尾会转换为 ENTER 键事件”
    • 如果您的布局中有一个 SearchView 作为小部件,您需要先单击搜索按钮来测试输入。 onView(withId(android.support.design.R.id.search_button)).perform(click());
    【解决方案2】:

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

    我用 kotlin 编写的 searchViews 这个表达式的扩展:

     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 并为提交参数设置 true,它会立即触发搜索。

    用法:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-29
        • 2017-05-11
        • 1970-01-01
        • 2016-04-23
        • 1970-01-01
        相关资源
        最近更新 更多