Issue
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>
Solution
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());
Answered By - Vishu
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.