在 TextInputLayout 中输入一些文本时出现 Espresso 错误

Espresso error typing some text into TextInputLayout

我想测试我的登录 UI,其中包含一些 TextInputLayout 字段,我已经为 运行 设置了一些代码,但它崩溃并抛出错误,任何人都可以解决这个问题,我提前欣赏

    @Test
    fun testCaseSimulateLoginOnButtonClick(){
        onView(withId(R.id.loginEmail)).perform(typeText("xxxxxxxx@gmail.com"))
        onView(withId(R.id.loginPassword)).perform(typeText("123456"))
        onView(withId(R.id.loginBtn)).perform(click())
        onView(withId(R.id.drawer)).check(matches(isDisplayed()))
    }
Error performing 'type text(xxxxxxxx@gmail.com)' on view 'view.getId() is <2131362123/com.example.app:id/loginEmail>'.

您不能在 TextInputLayout 视图中键入文本,那只是一个容器。 TextInputLayout 有一个 FrameLayout 作为直接子视图,在那个 FrameLayout 中,第一个子视图是 EditText(您可以在其中键入)

您可以使用一些额外的匹配器在 Espresso 中获得 EditText(找到一个视图,该视图是基本 R.id.text_layout 布局的后代,并且具有以 class 结尾的名称 EditText).

onView(
    allOf(
        isDescendantOfA(withId(R.id.text_layout)),
        withClassName(endsWith("EditText"))
    )
).perform(
    typeText("Hello world")
)

如果很多地方都必须这样做,可以写一个辅助函数

fun isEditTextInLayout(parentViewId: Int): Matcher<View> {
    return allOf(
        isDescendantOfA(withId(parentViewId)),
        withClassName(endsWith("EditText"))
    )
}

并将其用作

onView(isEditTextInLayout(R.id.text_layout)).perform(typeText("Hello world"))

XML 看起来像

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/text_layout"
    style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Type words here"
    android:layout_margin="16dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" >

    <androidx.appcompat.widget.AppCompatEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</com.google.android.material.textfield.TextInputLayout>

为此工作所需的一些导入是

import androidx.test.espresso.matcher.ViewMatchers.*
import org.hamcrest.Matcher
import org.hamcrest.Matchers.allOf
import org.hamcrest.Matchers.endsWith

当然,您也可以只为 EditText 添加一个 android:id,这样也可以得到它...