Java и эспрессо - невозможно ввести, необходимо поддерживать методы ввода или назначается из класса: class SearchView - PullRequest
3 голосов
/ 01 августа 2020

Я пытаюсь использовать Espresso для тестирования приложения с этим xml:

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/tvLogin"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:hint="myHint"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <com.google.android.material.textfield.TextInputEditText
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:imeOptions="flagNoExtractUi|actionNext"
        android:inputType="text" />

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

И это тест, который я пытался запустить:

onView(withId(R.id.tvLogin)).check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
onView(withId(R.id.tvLogin)).perform(typeText("test"));

Я получаю эта ошибка:

Caused by: java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints:
((is displayed on the screen to the user) and (supports input methods or is assignable from class: class android.widget.SearchView))
Target view: "TextInputLayout{id=2131362315, res-name=tvLogin, visibility=VISIBLE, width=831, height=144, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=androidx.constraintlayout.widget.ConstraintLayout$LayoutParams@8241b55, tag=null, root-is-layout-requested=false, has-input-connection=false, x=39.0, y=39.0, child-count=2}"

1 Ответ

2 голосов
/ 05 августа 2020

Ваш tvLogin - это TextInputLayout, который также является LinearLayout, поэтому вы получаете ошибку при выполнении typeText() на нем. Поскольку typeText() работает только с редактируемым полем, а TextInputEditText является потомком tvLogin, вы можете переписать тест, чтобы использовать один из удобных сопоставителей ViewMatchers.supportInputMethods () из Espresso:

onView(allOf(supportsInputMethods(), isDescendantOfA(withId(R.id.tvLogin))))
    .perform(typeText("test"))

В качестве альтернативы вы можете указать идентификатор для TextInputEditText:

<com.google.android.material.textfield.TextInputEditText
    android:id="@+id/tvLoginEditText"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:imeOptions="flagNoExtractUi|actionNext"
    android:inputType="text" />

А затем вместо этого ввести typeText() в редактируемом поле:

onView(withId(R.id.tvLoginEditText))
    .perform(typeText("test"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...