Я хочу получить текстовую строку, показанную в текстовом виде в LinearLayout. может ли эспрессо это сделать? Если нет, есть ли другой способ сделать это или я могу использовать android api в тестовом случае espresso? Я использую API 17 18 или новее, espresso 1.1 (он должен быть последним.). Я понятия не имею об этом. Спасибо.
Как получить текст из textview с помощью эспрессо
Ответ 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");
}
};
}