可以在 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());
然后你就可以输入了。
有两种方式:
通过搜索自动完成id,即public
onView(withId(android.support.design.R.id.search_src_text)).perform(typeText("something"));
通过使用事实,它是 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))
我正在 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());
然后你就可以输入了。
有两种方式:
通过搜索自动完成id,即public
onView(withId(android.support.design.R.id.search_src_text)).perform(typeText("something"));
通过使用事实,它是
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))