Espresso中通过索引选择Spinner项后,如何获取文本并与页面结果对比?
解决Spinner选中项文本获取及对比问题
直接解决:正确获取选中项文本并对比
不用自定义匹配器也能快速搞定,步骤如下:
- 选择Spinner指定索引项
用Espresso的SpinnerActions完成选择操作:
onView(withId(R.id.your_spinner_id)) .perform(SpinnerActions.selectItemAtPosition(your_index));
- 获取选中项的文本
通过ViewAssertion直接从Spinner实例中提取选中项内容:
String selectedText = ""; onView(withId(R.id.your_spinner_id)) .check(new ViewAssertion() { @Override public void check(View view, NoMatchingViewException noViewFoundException) { Spinner spinner = (Spinner) view; selectedText = spinner.getSelectedItem().toString(); } });
- 与页面结果对比
假设页面结果显示在R.id.result_text的TextView中,直接断言文本匹配:
onView(withId(R.id.result_text)) .check(matches(withText(selectedText)));
自定义匹配器抛PerformException的原因
大概率是你混淆了**操作(ViewAction)和断言(ViewAssertion)**的逻辑:
- PerformException一般出现在执行ViewAction时出错,如果你把获取文本的逻辑写在了自定义ViewAction里,就会触发这个异常——因为获取文本属于断言行为,不是可执行的操作
- 另外可能是操作时机不对:比如Spinner还没完成选择动画、数据未加载完成就去获取文本
若坚持用自定义匹配器(断言型)
正确的写法是自定义ViewAssertion而非ViewAction:
// 自定义断言:校验Spinner选中项文本是否符合预期 public static ViewAssertion spinnerHasSelectedText(final String expectedText) { return new ViewAssertion() { @Override public void check(View view, NoMatchingViewException noViewFoundException) { // 先验证当前View是Spinner类型 assertThat(view, instanceOf(Spinner.class)); Spinner spinner = (Spinner) view; String actualText = spinner.getSelectedItem().toString(); // 对比文本内容 assertThat(actualText, equalTo(expectedText)); } }; }
使用时直接链式调用:
onView(withId(R.id.your_spinner_id)) .perform(SpinnerActions.selectItemAtPosition(your_index)) .check(spinnerHasSelectedText("预期文本"));
额外注意事项
- 如果Spinner是异步加载数据,需先等待数据加载完成(可配合IdlingResource实现)
- 操作前可添加
Espresso.onIdle()等待UI线程空闲,避免动画未完成导致的异常
内容的提问来源于stack exchange,提问作者MiniV
相关产品推荐
相关产品推荐

