Подтвердить что ты не робот

Как получить текст из textview с помощью эспрессо

Я хочу получить текстовую строку, показанную в текстовом виде в LinearLayout. может ли эспрессо это сделать? Если нет, есть ли другой способ сделать это или я могу использовать android api в тестовом случае espresso? Я использую API 17 18 или новее, espresso 1.1 (он должен быть последним.). Я понятия не имею об этом. Спасибо.

4b9b3361

Ответ 1

Основная идея - использовать метод с внутренним ViewAction, который извлекает текст в его методе выполнения. Анонимные классы могут получить доступ только к конечным полям, поэтому мы не можем просто позволить ему установить локальную переменную getText(), но вместо этого массив String используется для извлечения строки из 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];
}

Примечание. Этот вид ресиверов данных должен использоваться с осторожностью. Если вы постоянно обнаруживаете, что пишете такие методы, есть хороший шанс, вы делаете что-то не так с самого начала. Также никогда не обращайтесь к виду за пределами ViewAssertion или ViewAction, потому что только там он уверен, что взаимодействие безопасно, поскольку оно запускается из потока пользовательского интерфейса, а перед его выполнением проверяется, что никакие другие взаимодействий.

Ответ 2

Если вы хотите проверить текстовое значение с помощью другого текста, вы можете создать Matcher. Вы можете увидеть мой код, чтобы создать свой собственный метод:

 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");
        }
    };
}