使用带有自定义 EditText 的 espresso

Joh*_*hnA 4 android android-edittext android-espresso

这是我的布局的一部分:

<com.rey.material.widget.EditText
            android:id="@+id/tagEditorSettings"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:layout_marginStart="10dp"
            android:layout_toEndOf="@+id/circularProgressbar"
            android:hint="@string/tag_name_tag_settings"
            android:inputType="text"
            android:textSize="18sp"
            app:et_dividerColor="@color/my_primary"
            app:et_dividerHeight="1dp"
            app:et_inputId="@+id/name_input"
            app:et_labelEnable="true"
            app:et_labelTextSize="14sp"
            app:et_supportLines="1" />
Run Code Online (Sandbox Code Playgroud)

和我的测试代码:

onView(withId(R.id.tagEditorSettings))
                .perform(click()).perform(clearText());
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,我收到这样的错误:

引起:java.lang.RuntimeException:由于目标视图不匹配以下一项或多项约束,将不会执行操作:(在屏幕上显示给用户并且可从类:class android.widget.EditText )

据我所知,问题出在“可从类中分配:类 android.widget.EditText”,但有人可以请教,我如何修复它并在我的情况下使用?

Pav*_*ngh 8

问题com.rey.material.widget.EditText扩展自FramelayoutclearText使用ReplaceTextAction作为

  public static ViewAction clearText() {
      return actionWithAssertions(new ReplaceTextAction(""));
  }
Run Code Online (Sandbox Code Playgroud)

其中ReplaceTextAction强制执行view,一种类型EditText

allOf(isDisplayed(), isAssignableFrom(EditText.class));
//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

由于rey...EdiText不是EditText因此错误的子类


解决方案:创建自己ViewAction

public static ViewAction clearTextInCustomView(){
            return new ViewAction() {
                @SuppressWarnings("unchecked")
                @Override
                public Matcher<View> getConstraints() {
                    return allOf(isDisplayed(), isAssignableFrom(com.rey.material.widget.EditText.class));
//                                            ^^^^^^^^^^^^^^^^^^^ 
// To check that the found view is type of com.rey.material.widget.EditText or it's subclass
                }

                @Override
                public void perform(UiController uiController, View view) {
                    ((com.rey.material.widget.EditText) view).setText("");
                }

                @Override
                public String getDescription() {
                    return "clear text";
                }
            };
    }
Run Code Online (Sandbox Code Playgroud)

然后你可以做

onView(withId(R.id.tagEditorSettings))
                .perform(click()).perform(clearTextInCustomView());
Run Code Online (Sandbox Code Playgroud)