浓咖啡 - 获取元素的文本

时间:2017-08-09 17:22:15

标签: android android-espresso android-espresso-recorder

如果我有一个" AppCompatTextView"我可以访问的元素:

onView(withId(R.id.allergies_text))

来自布局检查器:

enter image description here

有没有办法可以访问Android Studio中的元素文本? (访问那里的任何文本......不检查元素中是否存在某些文本)

我试着这样做:

val tv = onView(withId(R.id.medical_summary_text_view)) as TextView
val text = text.text.toString()
print(text)

但我收到错误:

android.support.test.espresso.ViewInteraction无法强制转换为android.widget.TextView

4 个答案:

答案 0 :(得分:6)

您应该创建一个匹配器来访问该元素值。

例如,您可以检查它的文字是否有某些值:

Matcher<View> hasValueEqualTo(final String content) {

    return new TypeSafeMatcher<View>() {

        @Override
        public void describeTo(Description description) {
            description.appendText("Has EditText/TextView the value:  " + content);
        }

        @Override
        public boolean matchesSafely(View view) {
            if (!(view instanceof TextView) && !(view instanceof EditText)) {
                    return false;
            }
            if (view != null) {
                String text;
                if (view instanceof TextView) {
                    text = ((TextView) view).getText().toString();
                } else {
                    text = ((EditText) view).getText().toString();
                }

                return (text.equalsIgnoreCase(content));
            }
            return false;
        }
    };
}

并以这种方式称呼它:

onView(withId(R.id.medical_summary_text_view))
    .check(matches(hasValueEqualTo(value)));

或者您可以编辑此匹配器以返回文本是否为空:

Matcher<View> textViewHasValue() {

    return new TypeSafeMatcher<View>() {

        @Override
        public void describeTo(Description description) {
            description.appendText("The TextView/EditText has value");
        }

        @Override
        public boolean matchesSafely(View view) {
            if (!(view instanceof TextView) && !(view instanceof EditText)) {
                    return false;
            }
            if (view != null) {
                String text;
                if (view instanceof TextView) {
                    text = ((TextView) view).getText().toString();
                } else {
                    text = ((EditText) view).getText().toString();
                }

                return (!TextUtils.isEmpty(text));
            }
            return false;
        }
    };
}

并以这种方式称呼它:

onView(withId(R.id.medical_summary_text_view))
    .check(matches(textViewHasValue()));

答案 1 :(得分:1)

我遇到了类似的问题,这最终对我有用:

如果您有活动规则

var activityRule = ActivityTestRule(MainActivity::class.java, true, false)

然后您可以执行以下操作:

activityRule.launchActivity(null)
val textView: TextView = activityRule.activity.findViewById(R.id.some_text_view)
val text = textView.text

我认为这可能更符合原始海报的要求。

答案 2 :(得分:1)

您可以通过以下功能获取ViewInteraction的文本:

fun getText(matcher: ViewInteraction): String {
    var text = String()
    matcher.perform(object : ViewAction {
        override fun getConstraints(): Matcher<View> {
            return isAssignableFrom(TextView::class.java)
        }

        override fun getDescription(): String {
            return "Text of the view"
        }

        override fun perform(uiController: UiController, view: View) {
            val tv = view as TextView
            text = tv.text.toString()
        }
    })

    return text
}
val numberResult: ViewInteraction = onView(withId(R.id.txNumberResult))
var searchText = getText(numberResult)

答案 3 :(得分:0)

当您真的想要文本并且不仅要与另一个值匹配或为空时,我会根据@Mesut GUNES的算法在Java(不是Kotlin)中发布完整的最终工作解决方案

Visibility

}

因此,在测试中,您可以这样称呼它:

Visibility={Binding Visibility, ElementName=EnableUserControl}

它适用于扩展TextView的所有控件,因此也适用于EditText。