我正在尝试使用Espresso
测试一个已经包含一些文本的EditText
。问题在于,当我使用typeText()
时,光标会被放置在文本中的任意位置。我尝试在使用typeTextIntoFocusedView
之前执行click()
,但是光标有时会被放置在EditText
的开头。我想知道是否可能在输入文本之前将光标设置在EditText
的末尾?
我正在尝试使用Espresso
测试一个已经包含一些文本的EditText
。问题在于,当我使用typeText()
时,光标会被放置在文本中的任意位置。我尝试在使用typeTextIntoFocusedView
之前执行click()
,但是光标有时会被放置在EditText
的开头。我想知道是否可能在输入文本之前将光标设置在EditText
的末尾?
class SetEditTextSelectionAction(private val selection: Int) : ViewAction {
override fun getConstraints(): Matcher<View> {
return allOf(isDisplayed(), isAssignableFrom(EditText::class.java))
}
override fun getDescription(): String {
return "set selection to $selection"
}
override fun perform(uiController: UiController, view: View) {
(view as EditText).setSelection(selection)
}
}
使用示例:
onView(withId(R.id.my_text_view).perform(SetEditTextSelectionAction(selection))
< p > 与手动执行 findViewById() 相比,另一个额外的优势是您可以将其与匹配器(如 withSubString("my text"))相结合,如果您没有视图的ID。< /p >
< p > 顺便说一下:要将其更改为在文本末尾设置选择,只需删除 selection: Int 构造函数参数并将 setSelection(selection) 更改为 setSelection(view.text.lastIndex)。 < /p >
EditText
本身的引用,然后使用EditText#setSelection()
。例如,将光标移动到当前文本的末尾: val activity = activityRule.activity
val tv = activity.findViewById<EditText>(R.id.edittext)
activity.runOnUiThread { tv.setSelection(tv.text.length) }
.runOnUiThread{}
很糟糕。 (Espresso也是如此-尽可能使用@UiThreadTest
运行测试用例。)但是,如果您必须在与UI不同的线程中运行测试用例,请使用InstrumentationRegistry.getInstrumentation().runOnMainSync{}
,以便您阻塞直到UI事件完成并且您的用例可以安全地恢复。 - Phlip我想把我的答案发出来,因为我刚遇到了这个问题,其他答案都无法解决我的问题。
我使用了GeneralClickAction在编辑文本的右侧点击,将光标放置在EditText的末尾位置。之后,我使用TypeTextAction并通过构造函数传入false来禁用了tapToFocus行为:
onView(withId(R.id.edit_text))
.perform(
new GeneralClickAction(Tap.SINGLE, GeneralLocation.CENTER_RIGHT, Press.FINGER, 0, 0, null),
new TypeTextAction(text, false)
);
我通过插入“Home”和“End”的KeyCode
成功了。它们的功能就像您桌面键盘上的一样,可以将光标移动到EditText
的开头或结尾。例如:
onView(withId(R.id.myView))
.perform(pressKey(KeyEvent.KEYCODE_MOVE_HOME))
要移动到末尾,您可以使用KeyEvent.KEYCODE_MOVE_END
,并且您可以使用KeyEvent.KEYCODE_DPAD_LEFT
和KeyEvent.KEYCODE_DPAD_RIGHT
向左或向右移动。