Android 如何在浓缩咖啡中关注页面元素?
我正在尝试使用以下方法选中/取消选中浓缩咖啡测试中的复选框:Android 如何在浓缩咖啡中关注页面元素?,android,android-espresso,hamcrest,Android,Android Espresso,Hamcrest,我正在尝试使用以下方法选中/取消选中浓缩咖啡测试中的复选框: termsAndConditionsCheckbox.check(matches(isChecked())); termsAndConditionsCheckbox.perform(scrollTo()).perform(click()); termsAndConditionsCheckbox.check(matches(isNotChecked())); 但是得到错误: Error performing 'scroll to
termsAndConditionsCheckbox.check(matches(isChecked()));
termsAndConditionsCheckbox.perform(scrollTo()).perform(click());
termsAndConditionsCheckbox.check(matches(isNotChecked()));
但是得到错误:
Error performing 'scroll to' on view
Caused by: java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints:
(view has effective visibility=VISIBLE and is descendant of a: (is assignable from class: class android.widget.ScrollView or is assignable from class: class android.widget.HorizontalScrollView))
Target view: "AppCompatCheckBox{id=2131689839, res-name=tnc_checkbox, visibility=VISIBLE, width=96, height=96, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-conn
已尝试删除scrollTo并仅使用click()。但仍无法执行单击。出现的错误消息指出,
复选框必须是可见的,并且是滚动视图
或水平滚动视图
的子项。您的复选框
确实可见
,但不是滚动视图
的子项。因此,如果您有如下布局:
<LinearLayout ...>
<TextView android:id="@+id/lbl_license_text" ... />
<CheckBox android:id="@+id/chk_accept" ... />
</LinearLayout>
(显然用该元素的android:
属性替换..
的实例)
这将允许Espresso在运行测试时向下滚动到
复选框。我可以通过实现自定义ViewAction功能来解决此问题(在stackoverflow的一个答案中看到)
取消选中并传递true以选中复选框。是滚动视图中的复选框
?否,但我尝试了几个选项,如scrollTo()scrollTo()
期望目标元素是滚动视图
的子元素,因此,如果您的视图太大,无法显示在屏幕上,则需要将其包装在布局XML中的滚动视图中。我很快就会写出完整的答案。
<ScrollView ...>
<LinearLayout ...>
<TextView android:id="@+id/lbl_license_text" ... />
<CheckBox android:id="@+id/chk_accept" ... />
</LinearLayout>
</ScrollView>
public static ViewAction setChecked(final boolean checked) {
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return new Matcher<View>() {
@Override
public boolean matches(Object item) {
return isA(Checkable.class).matches(item);
}
@Override
public void describeMismatch(Object item, Description mismatchDescription) {}
@Override
public void _dont_implement_Matcher___instead_extend_BaseMatcher_() {}
@Override
public void describeTo(Description description) {}
};
}
@Override
public String getDescription() {
return null;
}
@Override
public void perform(UiController uiController, View view) {
Checkable checkableView = (Checkable) view;
checkableView.setChecked(checked);
}
};
}
termsAndConditionsCheckbox.perform(Helper.setChecked(false));