2

I'm testinig code I've written for android, I'm using JUnit4 and android.support.test.espresso.Espresso.*. It happens if I call twice onview on a previous called android object like an EditText, TexView, Button or else, I get an exception, I don't know if I'm missing something or it is a bug, how to fix that?

onView(withId(R.id.name))
        .perform(typeText(NAME), closeSoftKeyboard());
onView(withId(R.id.surname))
        .perform(typeText(SURNAME), closeSoftKeyboard());
onView(withId(R.id.name))
        .perform(replaceText(NAME), closeSoftKeyboard());

Error log:

android.support.test.espresso.PerformException: Error performing 'replace text' on view 'with id: com.myapp:id/name'.
    at android.support.test.espresso.PerformException$Builder.build(PerformExceptio 
 n.java:84)

    at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:81)
    at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:52)
    at android.support.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:312)
    at android.support.test.espresso.ViewInteraction.desugaredPerform(ViewInteraction.java:167)
    at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:110)
    at com...
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 is assignable from class: class android.widget.EditText)

Layout xml:

   <ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="68dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <GridLayout
        android:id="@+id/gridLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:columnCount="2"
        android:orientation="horizontal"
        android:rowCount="9">
   <TextView
            android:id="@+id/nameLabel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/nomeLabel" />

        <EditText
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPersonName" />

        <TextView
            android:id="@+id/surnameLabel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/cognomeLabelVal" />

        <EditText
            android:id="@+id/surname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPersonName" />

        <Button
            android:id="@+id/saveId"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:enabled="false"
            android:onClick="save"
            android:text="@string/saveName" />
    </GridLayout>

</ScrollView>
blob
  • 439
  • 8
  • 21

1 Answers1

1

as per the log the view name is not assignable from EditText. See documentation of ViewActions.replaceText()

You need to write your own ViewAction for this. From another post this and this Create your own ViewAction like below.

public static ViewAction setTextInTextView(final String value){
    return new ViewAction() {
        @SuppressWarnings("unchecked")
        @Override
        public Matcher<View> getConstraints() {
            return allOf(isDisplayed(), isAssignableFrom(TextView.class));
            //                                            ^^^^^^^^^^^^^^^^^^^
            // To check that the found view is TextView or it's subclass like EditText
            // so it will work for TextView and it's descendants
        }

        @Override
        public void perform(UiController uiController, View view) {
            ((TextView) view).setText(value);
        }

        @Override
        public String getDescription() {
            return "replace text";
        }
    };
}

Then Replace your code like this

 onView(withId(R.id.name))
            .perform(setTextInTextView(NAME), closeSoftKeyboard());
 onView(withId(R.id.surname))
            .perform(setTextInTextView(SURNAME), closeSoftKeyboard());
 onView(withId(R.id.name))
            .perform(setTextInTextView(NAME), closeSoftKeyboard());
Vishu
  • 326
  • 2
  • 11
  • 1
    It works but if performs click get an exception. "Caused by: java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints: at least 90 percent of the view's area is displayed to the user." – blob Mar 21 '18 at 08:09
  • there is no save button in layout you posted. Can you update the layout? – Vishu Mar 21 '18 at 08:27