java - 使用 espresso 在回收站视图中单击孩子的按钮
问题描述
在一个活动中,我有一个自定义回收器视图,其中包含 2 个文本视图和 2 个按钮,如下所示。
回收站图标按钮的 id 是 deleteButton。我想在浓缩咖啡测试中访问这个按钮,以便我可以模拟点击。
我尝试过但失败的两种方法如下所示:
onView(withId(R.id.basket))
.perform(actionOnItemAtPosition(4, click() ));
onView(withText("Cherry"))
.perform(
RecyclerViewActions.actionOnItem(
hasDescendant(withId(R.id.deleteButton)),
ViewActions.click()
)
);
感谢您提前提供任何帮助。
解决方案
单击RecyclerView
项目视图中的视图的一种方法是创建自定义视图操作:
public static ViewAction actionOnItemView(Matcher<View> matcher, ViewAction action) {
return new ViewAction() {
@Override public String getDescription() {
return String.format("performing ViewAction: %s on item matching: %s", action.getDescription(), StringDescription.asString(matcher));
}
@Override public Matcher<View> getConstraints() {
return allOf(withParent(isAssignableFrom(RecyclerView.class)), isDisplayed());
}
@Override public void perform(UiController uiController, View view) {
List<View> results = new ArrayList<>();
for (View v : TreeIterables.breadthFirstViewTraversal(view)) {
if (matcher.matches(v)) results.add(v);
}
if (results.isEmpty()) {
throw new RuntimeException(String.format("No view found %s", StringDescription.asString(matcher)));
} else if (results.size() > 1) {
throw new RuntimeException(String.format("Ambiguous views found %s", StringDescription.asString(matcher)));
}
action.perform(uiController, results.get(0));
}
};
}
然后在您的 上使用RecyclerViewActionsRecyclerView
之一,如果成功,则actionOnItemView
作为项目视图的后续操作:
ViewAction itemViewAction = actionOnItemView(withId(R.id.deleteButton), click());
onView(withId(your_recycler_view)).perform(actionOnItemAtPosition(4, itemViewAction));
推荐阅读
- firebase - 如何构建 Firebase FCM 令牌存储以进行扩展?
- python - 在numpy中选择一个元素
- c# - 只将数据添加到 DbContext 一次
- php - 无法使用 php Curl 将文件发送到第三方服务器
- sqlite - SQLITE3:恒定时间行寻址
- javascript - 为什么 JavaScript 中 0700/100 等于 4.48 而 0900/100 等于 9?
- kotlin - 用 mockk 模拟常量值
- javascript - 带有日期时间轴的 AmCharts 在 2PM 之后显示 12PM
- android - 在操作栏中单击后退箭头时无法返回
- python - 对 uint16 图像的重新缩放/归一化感到困惑?