Espresso - 获取元素的文本
Espresso - get text of element
如果我有一个可以通过以下方式访问的 "AppCompatTextView" 元素:
onView(withId(R.id.allergies_text))
来自布局检查器:
有什么方法可以访问 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
您应该创建一个匹配器来访问该元素值。
例如,您可以检查它的文本是否具有某些值:
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)));
或者您可以将此匹配器编辑为 return,无论文本是否为空:
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()));
我遇到了类似的问题,这就是最终对我有用的问题:
如果您有 activity 规则
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
我认为这可能更符合原始发布者所寻找的内容。
您可以通过以下函数获取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)
当你真的想要文本而不只是将它与另一个值匹配或为空时,我 post Java 中的完整最终工作解决方案(不是 Kotlin)基于算法@Mesut GUNES
public class TextHelpers {
public static String getText(ViewInteraction matcher){
final String[] text = new String[1];
ViewAction va = new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return isAssignableFrom(TextView.class);
}
@Override
public String getDescription(){
return "Text of the view";
}
@Override
public void perform(UiController uiController,View view) {
TextView tv = (TextView) view;
text[0] = tv.getText().toString();
}
};
matcher.perform(va);
return text[0];
}
}
所以,在你的测试中你可以这样称呼它:
TextHelpers.getText(Espresso.onView(withId(R.id.element)));
它适用于所有扩展 TextView 的控件,所以它也适用于 EditText。
如果我有一个可以通过以下方式访问的 "AppCompatTextView" 元素:
onView(withId(R.id.allergies_text))
来自布局检查器:
有什么方法可以访问 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
您应该创建一个匹配器来访问该元素值。
例如,您可以检查它的文本是否具有某些值:
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)));
或者您可以将此匹配器编辑为 return,无论文本是否为空:
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()));
我遇到了类似的问题,这就是最终对我有用的问题:
如果您有 activity 规则
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
我认为这可能更符合原始发布者所寻找的内容。
您可以通过以下函数获取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)
当你真的想要文本而不只是将它与另一个值匹配或为空时,我 post Java 中的完整最终工作解决方案(不是 Kotlin)基于算法@Mesut GUNES
public class TextHelpers {
public static String getText(ViewInteraction matcher){
final String[] text = new String[1];
ViewAction va = new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return isAssignableFrom(TextView.class);
}
@Override
public String getDescription(){
return "Text of the view";
}
@Override
public void perform(UiController uiController,View view) {
TextView tv = (TextView) view;
text[0] = tv.getText().toString();
}
};
matcher.perform(va);
return text[0];
}
}
所以,在你的测试中你可以这样称呼它:
TextHelpers.getText(Espresso.onView(withId(R.id.element)));
它适用于所有扩展 TextView 的控件,所以它也适用于 EditText。