在 TextInputLayout 中输入一些文本时出现 Espresso 错误
Espresso error typing some text into TextInputLayout
我想测试我的登录 UI,其中包含一些 TextInputLayout 字段,我已经为 运行 设置了一些代码,但它崩溃并抛出错误,任何人都可以解决这个问题,我提前欣赏
- 我只想在 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
,这样也可以得到它...
我想测试我的登录 UI,其中包含一些 TextInputLayout 字段,我已经为 运行 设置了一些代码,但它崩溃并抛出错误,任何人都可以解决这个问题,我提前欣赏
- 我只想在 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
,这样也可以得到它...