Подождите, пока просмотр анимации пейджера с эспрессо?

Попытка выполнить некоторые тесты с помощью ViewPager.

Я хочу прокручивать между вкладками, и я не хочу продолжать, пока салфетка не будет завершена. Но, похоже, нет способа отключить анимацию для пейджера представления (все анимации под опциями разработчика отключены).

Таким образом, это всегда приводит к сбою теста, поскольку пейджер представления не завершил его анимацию, и поэтому представление еще не полностью показывается:

// swipe left
onView(withId(R.id.viewpager)).check(matches(isDisplayed())).perform(swipeLeft());

// check to ensure that the next tab is completely visible.
onView(withId(R.id.next_tab)).check(matches(isCompletelyDisplayed()));

Есть ли элегантный или, возможно, даже рекомендуемый способ сделать это, или я застрял в том, чтобы там было какое-то время ожидания?

Ответы

Ответ 1

IdlingResource @Simas предлагает на самом деле довольно просто реализовать:

public class ViewPagerIdlingResource implements IdlingResource {

    private final String mName;

    private boolean mIdle = true; // Default to idle since we can't query the scroll state.

    private ResourceCallback mResourceCallback;

    public ViewPagerIdlingResource(ViewPager viewPager, String name) {
        viewPager.addOnPageChangeListener(new ViewPagerListener());
        mName = name;
    }

    @Override
    public String getName() {
        return mName;
    }

    @Override
    public boolean isIdleNow() {
        return mIdle;
    }

    @Override
    public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
        mResourceCallback = resourceCallback;
    }

    private class ViewPagerListener extends ViewPager.SimpleOnPageChangeListener {

        @Override
        public void onPageScrollStateChanged(int state) {
            mIdle = (state == ViewPager.SCROLL_STATE_IDLE
                    // Treat dragging as idle, or Espresso will block itself when swiping.
                    || state == ViewPager.SCROLL_STATE_DRAGGING);
            if (mIdle && mResourceCallback != null) {
                mResourceCallback.onTransitionToIdle();
            }
        }
    }
}

Ответ 2

Попробуйте это,

    onView(withId(R.id.pager)).perform(pagerSwipeRight()).perform(pagerSwipeLeft());

    private GeneralSwipeAction pagerSwipeRight(){
        return new GeneralSwipeAction(Swipe.SLOW, GeneralLocation.CENTER_LEFT,
                GeneralLocation.CENTER_RIGHT, Press.FINGER);
    }

    private GeneralSwipeAction pagerSwipeLeft(){
        return new GeneralSwipeAction(Swipe.SLOW, GeneralLocation.CENTER_RIGHT,
                GeneralLocation.CENTER_LEFT, Press.FINGER);
    }

Ответ 3

Вы можете выполнить большую работу и использовать IdlingResource для реализации OnPageChangeListener

или просто:

SystemClock.sleep(500);