web-dev-qa-db-fra.com

comment obtenir du texte à partir de textview en utilisant expresso

Je veux que la chaîne de texte soit affichée dans une vue de texte dans LinearLayout. l'espresso peut-il faire ça? Sinon, existe-t-il une autre façon de le faire ou puis-je utiliser Android api dans le cas de test expresso? J'utilise API 17 18 ou plus récent, espresso 1.1 (Ce devrait être le dernier.) Je n'en ai aucune idée. Merci.

20
Nick Dong

L'idée de base est d'utiliser une méthode avec une ViewAction interne qui récupère le texte dans sa méthode perform. Les classes anonymes ne peuvent accéder qu'aux champs finaux, nous ne pouvons donc pas simplement la laisser définir une variable locale de getText (), mais à la place un tableau de String est utilisé pour extraire la chaîne de ViewAction.

String getText(final Matcher<View> matcher) {
    final String[] stringHolder = { null };
    onView(matcher).perform(new ViewAction() {
        @Override
        public Matcher<View> getConstraints() {
            return isAssignableFrom(TextView.class);
        }

        @Override
        public String getDescription() {
            return "getting text from a TextView";
        }

        @Override
        public void perform(UiController uiController, View view) {
            TextView tv = (TextView)view; //Save, because of check in getConstraints()
            stringHolder[0] = tv.getText().toString();
        }
    });
    return stringHolder[0];
}

Remarque: Ce type de récupérateurs de données de vue doit être utilisé avec précaution. Si vous vous retrouvez constamment à écrire ce type de méthodes, il y a de fortes chances que vous fassiez quelque chose de mal dès le départ. De plus, n'accédez jamais à la vue en dehors d'un ViewAssertion ou ViewAction, car seulement là, il est vérifié que cette interaction est sûre, car elle est exécutée à partir du thread d'interface utilisateur et avant l'exécution est vérifiée, qu'aucune autre interaction ne se mêle.

40
haffax

Si vous souhaitez vérifier la valeur du texte avec un autre texte, vous pouvez créer Matcher. Vous pouvez voir mon code pour créer votre propre méthode:

 public static Matcher<View> checkConversion(final float value){
    return new TypeSafeMatcher<View>() {

        @Override
        protected boolean matchesSafely(View item) {
            if(!(item instanceof TextView)) return false;

            float convertedValue = Float.valueOf(((TextView) item).getText().toString());
            float delta = Math.abs(convertedValue - value);

            return delta < 0.005f;
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("Value expected is wrong");
        }
    };
}
6
emaleavil