Ошибка PerformException при выполнении одного клика Работает с полем 5dp - PullRequest
0 голосов
/ 19 октября 2019

Я пишу тестирование инструментовки и не могу щелкнуть мой вид. Вот мой взгляд

<ConstraintLayout......>
 <ImageView
        android:id="@+id/go_to_next"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:background="@drawable/rounded_bg"
        android:rotation="180"
        android:scaleType="centerInside"
        android:src="@drawable/ic_back"
        app:layout_constraintBottom_toBottomOf="@+id/mobile_number_edittext"
        app:layout_constraintEnd_toEndOf="parent" />
</ConstraintLayout/>

У моего constraintLayout есть запас 30dp слева и справа. Мой тестовый пример выглядит следующим образом -

 @Test
fun useAppContext() {
    // Context of the app under test.
    val appContext = InstrumentationRegistry.getInstrumentation().targetContext
    assertEquals("com.test", appContext.packageName)
    onView(withId(R.id.go_to_next)).check(matches(isDisplayingAtLeast(90)))
    onView(withId(R.id.go_to_next)).perform(click())
}

Он не срабатывает при щелчке () и получает ошибку как Error performing 'single click - At Coordinates: 1457, 1213 and precision: 16, 16' on view 'with id: com.test:id/go_to_next'.

Это работает, если я добавлю поле для моего ImageView как 5dp, но это не такт работать без наценки. Как я могу это исправить? Мой вид полностью виден на макете, он просто выровнен по крайнему правому краю. К вашему сведению, все анимации отключены

1 Ответ

0 голосов
/ 21 октября 2019

Похоже, что вычисление координат могло быть нарушено на setRotation вызове представления. Вы можете либо попытаться повернуть файл физически, либо создать собственное действие по щелчку, чтобы вместо этого принудительно щелкнуть по нему:

public static ViewAction forceClick() {
    return new ViewAction() {
        @Override public Matcher<View> getConstraints() {
            return allOf(isClickable(), isEnabled(), isDisplayed());
        }

        @Override public String getDescription() {
            return "force click";
        }

        @Override public void perform(UiController uiController, View view) {
            view.performClick(); // perform click without checking view coordinates.
            uiController.loopMainThreadUntilIdle();
        }
    };
}

Затем использовать его для кнопки или любого представления, которое имеет прослушиватель щелчков прикреплено к нему:

onView(withId(R.id.go_to_next)).perform(forceClick());
...