使用Hint进行Android Espresso测试不起作用



我目前正在尝试将Espresso UI测试添加到我的Android应用程序中,我希望能够通过其提示字段定位TextInputEditText,然后单击它并输入一些文本。(我知道以 ID 为目标更好,但在这种情况下我需要定位提示(

以下是我尝试这样做的方法:

Espresso.onView(Matchers.allOf(Matchers.instanceOf(TextInputEditText::class.java),
ViewMatchers.withHint("My Hint"))).
perform(ViewActions.click(), ViewActions.typeText("type this"))

但是,当尝试执行此操作时,我收到以下错误:

android.support.test.espresso.NoMatchingViewException:层次结构中找不到匹配的视图:(android.support.design.widget.TextInputEditText的一个实例,并带有提示:是"旧密码"(

即使输出显示层次结构实际上确实持有此视图,如下所示:

TextInputEditText{id=2131820762, res-name=input_data, visibility=VISIBLE, width=1328, height=168, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=true, is-focusable=true, is-layout-request=false, is-selected=false,

root-is-layout-request=false, has-input-connection=true, editor-info=[inputType=0x80091 imeOptions=0x8000005 privateImeOptions=null actionLabel=null actionId=0initialSelStart=0 initialSelEnd=0 initialCapsMode=0x0 hintText=My Hintlabel=null packageName=null fieldId=0 fieldName=null extras=null hintLocales=null contentMimeTypes=null ], x=0.0, y=0.0, text=, input-type=524433, ime-target=true, has-links=false}

ViewMatchers.withHint 方法在 Espresso 中是否损坏,或者是否有特定的方法来使用它?为什么它找不到视图,然后在输出中实际显示它在层次结构中?

已经有一个错误。请参阅:https://issuetracker.google.com/issues/37139118

我遇到了同样的问题,并且在堆栈溢出上找不到解决方案。我的假设是提示是与预期字符串不匹配CharSequence。因此,我认为在匹配之前需要将提示转换为字符串。使用hasToString对我有用。

onView(allOf(
instanceOf(TextInputEditText::class.java),
withHint(hasToString("My Hint"))
)).perform(click(), typeText("type this"))

Logcat 中的打印可能会产生误导。如果启用了提示的TextInputEditTextTextInputLayout的子视图,则TextInputLayout将通过 TextInputLayout.setHint 在自身内部设置相同的提示,然后将TextInputEditText上的提示设置为 null。

您需要创建自定义匹配器来匹配TextInputEditText提示作为解决方法:

fun withHint(title: String): Matcher<View> = withHint(equalTo(title))
fun withHint(matcher: Matcher<String>): Matcher<View> = object : BoundedMatcher<View, TextInputEditText>(TextInputEditText::class.java) {
override fun describeTo(description: Description) {
description.appendText("with hint: ")
matcher.describeTo(description)
}
override fun matchesSafely(item: TextInputEditText): Boolean {
val parent = item.parent.parent
return if (parent is TextInputLayout) matcher.matches(parent.hint) else matcher.matches(item.hint)
}
}

只需将您的ViewMatchers.withHint("My Hint")更换为TextInputEditTextCustomMatchers.withHint("My Hint").

相关内容

  • 没有找到相关文章

最新更新