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

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


person Nick Dong    schedule 30.04.2014    source источник
comment
Да, Эспрессо может это сделать, если хакерским способом. Но в большинстве случаев вам не нужно этого делать, потому что в тестах вы обычно хотите сравнить текст в текстовом представлении с заданным текстом или проверить какое-то его свойство. Имея более подробную информацию о том, что вы на самом деле пытаетесь сделать в своем тесте, легче дать полезный ответ.   -  person haffax    schedule 03.05.2014
comment
Ну, а что такое хакерский способ? Как это сделать? Мне нужно получить этот текст для вставки в отчет. Спасибо за внимание, @haffax   -  person Nick Dong    schedule 05.05.2014
comment
@haffax, например, ваше приложение может вызвать веб-службу с непредсказуемыми результатами. вы хотите проверить некоторый текст, чтобы определить, какую логику выполнять, поскольку ожидаемое поведение зависит от ответа, полученного приложением от веб-службы. такого рода вещи не могут быть решены только с помощью утверждения, вам нужно получить текст, затем запустить свою логику, чтобы определить ожидание, и только после этого вы можете делать утверждения.   -  person Adam Burley    schedule 01.02.2021


Ответы (2)


Основная идея состоит в том, чтобы использовать метод с внутренним 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, потому что только там гарантируется, что взаимодействие безопасно, так как оно запускается из потока пользовательского интерфейса, и перед выполнением проверяется, что никакие другие взаимодействия не вмешиваются.

person haffax    schedule 05.05.2014
comment
Не могли бы вы привести пример использования вашего кода? Я не вижу, как использовать ваше решение. Спасибо - person Loebre; 27.02.2017
comment
@Loebre, ты можешь использовать это так getText(withId(viewId)); - person CROSP; 03.04.2017
comment
@haffax Но что, если вы проверяете, отсортирован ли список строк во внешнем интерфейсе? Тогда getText очень нужен. Если не будет такой реализации, как Селенум getText()? - person Rakib; 22.02.2019
comment
@MohammadRakibAmin Не знаю вашего конкретного случая, но в целом: фиксированный сценарий решит эту проблему без такой логики. Например. если ваш тестовый db возвращает фрукты клубника, яблоки, бананы, то подтверждение того, что первый показанный фрукт - яблоко, следующий - банан, а последний - клубника, является самым сильным тестом для сценария. Просто проверка того, что все, что показывалось, находится в алфавитном порядке, не имеет большого значения и может привести к ложноотрицательным результатам. - person haffax; 03.03.2019

Если вы хотите проверить текстовое значение другим текстом, вы можете создать 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");
        }
    };
}
person emaleavil    schedule 05.01.2016
comment
это помогает только в том случае, если вы хотите сделать утверждение против возвращаемого значения, а не когда вы хотите просто получить значение, не делая против него утверждение. например, ваше приложение может вызывать веб-службу с непредсказуемыми результатами. вы хотите проверить некоторый текст, чтобы определить, какую логику выполнять, поскольку ожидаемое поведение зависит от ответа, полученного приложением от веб-службы. такого рода вещи не могут быть решены только с помощью утверждения, вам нужно получить текст, затем запустить свою логику, чтобы определить ожидание, и только после этого вы можете делать утверждения. - person Adam Burley; 01.02.2021
comment
Вы можете прочитать в моем ответе, что я имею в виду проверку (утверждение). Я думаю, что если вы хотите получить значение, лучший ответ - использовать ответ с наибольшим количеством голосов. - person emaleavil; 05.02.2021