設計上、完全には表示されないカスタムImageButton
があるため、クリックアクションを実行するとこのエラーが発生します。
Android.support.test.espresso.PerformException: Error performing 'single click' on view 'with id: test.com.myproject.app:id/navigationButtonProfile'.
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.
at Android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.Java:138)
at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:422)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:237)
at Android.os.Handler.handleCallback(Handler.Java:733)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:157)
at Android.app.ActivityThread.main(ActivityThread.Java:5356)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1265)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1081)
at dalvik.system.NativeStart.main(Native Method)
ボタンのごく一部は画面の外側にあります(つまり、上部でトリミングされています)。ボタンの12%が画面の外側にある可能性があります。これは仕様によるものであり、スクロールしたり表示アクションを実行して表示することはできません。この90%の制約を乗り越える方法を知っている人はいますか?
解決策:提案されたとおりに独自のクリックアクションを作成し、完全に機能しました。 Google Espresso からクラスをコピーし、このメソッドで90から75に変更しました。
@Override
@SuppressWarnings("unchecked")
public Matcher<View> getConstraints() {
Matcher<View> standardConstraint = isDisplayingAtLeast(75);
if (rollbackAction.isPresent()) {
return allOf(standardConstraint, rollbackAction.get().getConstraints());
} else {
return standardConstraint;
}
}
これに対する簡単でエレガントな解決策はないと思います。 90%の制約はGeneralClickAction
にハードコーディングされており、クラスはfinalであるため、getConstraints
をオーバーライドできません。
GeneralClickAction
's code に基づいて独自のViewActionを記述し、isDisplayingAtLeast
チェックをスキップします。
上記のどれも私にとってはうまくいきませんでした。以下は、その制約を完全に削除し、ビューをクリックできるカスタムマッチャーです。
onView(withId(yourID)).check(matches(allOf( isEnabled(), isClickable()))).perform(
new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return ViewMatchers.isEnabled(); // no constraints, they are checked above
}
@Override
public String getDescription() {
return "click plus button";
}
@Override
public void perform(UiController uiController, View view) {
view.performClick();
}
}
);
次の前にボタンまでスクロールする必要があります。
onView(withId(R.id.button_id)).perform(scrollTo(), click());
これは、テストの実行中にボタンの可視性を解決するのに役立ちました
public static ViewAction handleConstraints(final ViewAction action, final Matcher<View> constraints)
{
return new ViewAction()
{
@Override
public Matcher<View> getConstraints()
{
return constraints;
}
@Override
public String getDescription()
{
return action.getDescription();
}
@Override
public void perform(UiController uiController, View view)
{
action.perform(uiController, view);
}
};
}
public void clickbutton()
{
onView(withId(r.id.button)).perform(handleConstraints(click(), isDisplayingAtLeast(65)));
}
Espressoのデフォルトのクリックでは、ビュー_> 90%
_の可視性が必要です。独自のclick
ViewActionの作成についてどう思いますか?このような...
_public final class MyViewActions {
public static ViewAction click() {
return new GeneralClickAction(SafeTap.SINGLE, GeneralLocation.CENTER, Press.FINGER);
}
}
_
このクリックは、ビューの中央をクリックします。
次に、次のようにクリックを実行できます:onView(withId(....)).perform(MyViewActions.click());
うまくいくことを願っています。
テキストビューで同じエラーが発生したため、上記の回答と他のSOの質問が非常に役立ちました。私はscrollTo
メソッドを試しましたが、何らかの理由でエラーが解決しませんでした。
onView(allOf(withId(R.id.recycler_view), isDisplayed())).perform(RecyclerViewActions
.actionOnItem(hasDescendant(withText("my text")), click()));