2017-08-23 3 views
0

Je veux être en mesure de tester mon viewpager qui a dynamique (le nombre de pages n'est pas connu à l'avance) ensemble de pages, exécuter quelques asserts et être en mesure de prendre une capture d'écran.Balayez à travers ViewPager et prendre des captures d'écran

Étant donné que le viewpager a un ensemble dynamique de pages, je ne peux pas dire à l'avance combien de fois je veux swipeLeft().

Alors, je l'ai écrit une contrainte personnalisée:

/** 
* Moves to the left by one page. 
*/ 
public static ViewAction scrollLeftUntilEnd() { 
    return new ViewAction() { 
     @Override 
     public Matcher<View> getConstraints() { 
      return isDisplayingAtLeast(90); 
     } 
     @Override 
     public String getDescription() { 
      return "ViewPager scroll one page to the left"; 
     } 
     @Override 
     public void perform(final UiController uiController, final View view) { 
      uiController.loopMainThreadUntilIdle(); 
      final ViewPager viewPager = (ViewPager) view; 
      final int current = viewPager.getCurrentItem(); 

      final int size = viewPager.getAdapter().getCount(); 
      for (int i = 0; i < size; i++) { 
       viewPager.setCurrentItem(i + 1, true); 
       takeScreenshot("ViewPager_Cards"); 
      } 
      uiController.loopMainThreadUntilIdle(); 
     } 
    }; 
} 

que j'appelle comme ceci:

onView(withId(R.id.myViewPager)).perform(scrollLeftUntilEnd()); 

mais la page se déplace vers la gauche une seule fois.

Est-ce parce que le ViewAction retourné par scrollLeftUntilEnd() peut seulement effectuer une fois et pas dans une boucle?

Je ne pouvais pas utiliser repeatedlyUntil(swipeLeft(), ...); car j'ai besoin de prendre des captures d'écran à chaque page.

Répondre

0

Il est peut-être parce que vous avez

viewPager.setCurrentItem(current + 1, true); 

current ne change jamais.

Faut-il

viewPager.setCurrentItem(i + 1, true); 

à la place?

+0

Bonne prise. Cependant, même avec ce changement je ne peux pas obtenir une capture d'écran pour chaque page, je vois seulement des captures d'écran pour la première et la dernière page. J'ai besoin de faire une pause à chaque écran, d'obtenir une capture d'écran, puis de faire glisser à nouveau. –

0

j'ai pu contourner mon problème suivant l'approche Jing Li's et voici l'extrait:

CountHelper public class {

private static int count; 

public static int getCountFromListUsingTypeSafeMatcher(@IdRes int listViewId) { 
    count = 0; 

    Matcher matcher = new TypeSafeMatcher<View>() { 
     @Override 
     protected boolean matchesSafely(View item) { 
      count = ((ListView) item).getCount(); 
      return true; 
     } 

     @Override 
     public void describeTo(Description description) { 
     } 
    }; 

    onView(withId(listViewId)).check(matches(matcher)); 

    int result = count; 
    count = 0; 
    return result; 
} 

public static int getCountFromListUsingBoundedMatcher(@IdRes int listViewId) { 
    count = 0; 

    Matcher<Object> matcher = new BoundedMatcher<Object, String>(String.class) { 
     @Override 
     protected boolean matchesSafely(String item) { 
      count += 1; 
      return true; 
     } 

     @Override 
     public void describeTo(Description description) { 
     } 
    }; 

    try { 
     // do a nonsense operation with no impact 
     // because ViewMatchers would only start matching when action is performed on DataInteraction 
     onData(matcher).inAdapterView(withId(listViewId)).perform(typeText("")); 
    } catch (Exception e) { 
    } 

    int result = count; 
    count = 0; 
    return result; 
} 

}

et je demande ceci dans ma classe comme ça:

final int count = getCountFromListUsingTypeSafeMatcher(R.id.myViewPager); 
    for (int i = 1; i < count; i++) { 
     onView(R.id.myViewPager).perform(swipeLeft()); 
     ... 
     takeScreenshot("ViewPager_Cards"); 
    }