android - Android Espresso - 检查 RecyclerView 中是否不存在文本
问题描述
我有代码检查带有文本“产品”的行是否存在于RecyclerView
:
onView(withId(R.id.rv_list)).perform(scrollTo(hasDescendant(withText("Product"))));
onView(withItemText("Product")).check(matches(isDisplayed()));
public static Matcher<View> withItemText(final String itemText) {
checkArgument(!TextUtils.isEmpty(itemText), "itemText cannot be null or empty");
return new TypeSafeMatcher<View>() {
@Override
public boolean matchesSafely(View item) {
return allOf(
isDescendantOfA(isAssignableFrom(RecyclerView.class)),
withText(itemText)).matches(item);
}
@Override
public void describeTo(Description description) {
description.appendText("is isDescendantOfA RV with text " + itemText);
}
};
}
如何检查所有列表中是否没有提供文本的行RecylerView
?
解决方案
您可以尝试创建一个自定义匹配器来迭代RecyclerView
项目:
public static Matcher<View> hasItem(Matcher<View> matcher) {
return new BoundedMatcher<View, RecyclerView>(RecyclerView.class) {
@Override public void describeTo(Description description) {
description.appendText("has item: ");
matcher.describeTo(description);
}
@Override protected boolean matchesSafely(RecyclerView view) {
RecyclerView.Adapter adapter = view.getAdapter();
for (int position = 0; position < adapter.getItemCount(); position++) {
int type = adapter.getItemViewType(position);
RecyclerView.ViewHolder holder = adapter.createViewHolder(view, type);
adapter.onBindViewHolder(holder, position);
if (matcher.matches(holder.itemView)) {
return true;
}
}
return false;
}
};
}
如果您想检查是否没有包含特定文本的行,您可以执行以下操作:
onView(withId(R.id.rv_list)).check(matches(not(hasItem(hasDescendant(withText("Product"))))));
推荐阅读
- nlp - 用 SpaCy 中的标签替换实体
- node.js - 使用 Joi 进行多重验证
- r - 使用 R 生成适合某些条件的随机数据集
- matlab - 使用需要输入的匿名函数时,如何在 Matlab 中访问向量
- windows - Pip,Easy_Install 由于子流程模块引发的错误而无法正常工作?
- java - Maven:在 Java 项目中包含 utils
- c++ - 使用向量和迭代器的向量的奇怪分段错误
- azure - 导入数据库 bacpac 防火墙问题
- python - 使用 pip 在 Windows 10 上安装 Jupyter 时出错
- dataframe - 如何将数据框转换为变量