我有onView(withId(R.id.check_box)).perform(click())
,但我只想這樣做,如果複選框尚未被選中。我如何在濃咖啡中做到這一點?Android Espresso - 點擊複選框,如果沒有選中
回答
我也想切換一個複選框/開關取決於它的以前的狀態。起初,我想這要開啓一個複選框,爲OFF:
onView(withId(R.id.checkbox)).check(matches(isNotChecked())).perform(scrollTo(), click());
...這切換OFF一個複選框,爲ON:
onView(withId(R.id.checkbox)).check(matches(isChecked())).perform(scrollTo(), click());
然而,這不起作用,因爲Espresso會在執行動作之前尋找特定的切換狀態。有時候,你不知道事先是打開還是關閉。
我的解決方案是使用自定義的ViewAction來關閉/打開任何不依賴於以前狀態的可檢查對象(開關,複選框等)。所以,如果它已經打開,它將保持開啓。如果它關閉,它會打開。這裏的ViewAction這一:
public static ViewAction setChecked(final boolean checked) {
return new ViewAction() {
@Override
public BaseMatcher<View> getConstraints() {
return new BaseMatcher<View>() {
@Override
public boolean matches(Object item) {
return isA(Checkable.class).matches(item);
}
@Override
public void describeMismatch(Object item, Description mismatchDescription) {}
@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);
}
};
}
這裏是你如何使用它(在這個例子中,當你想切換到ON):不建議
onView(withId(R.id.toggle)).perform(scrollTo(), setChecked(true));
你有這樣的事情在你的代碼:
@Rule
public ActivityTestRule<ActivityMain> ActivityMainRule = new ActivityTestRule<>(ActivityMain.class);
嘗試
if (!ActivityMainRule.getActivity().findViewById(R.id.check_box).isChecked()) {
onView(withId(R.id.check_box)).perform(click())
}
根據谷歌它違背瞭如何咖啡作品並且是非常危險的https://youtu.be/isihPOY2vS4?t=4m12s –
這似乎是你測試的一部分,該複選框需要檢查。
您可以通過檢查:
onView(withId(R.id.checkbox)).check(matches(not(isChecked())));
如果失敗,您的測試將失敗,這可能是你的情況不錯。然後,您可以在此案例匹配後執行所需的點擊。
如果這不是你想要的情況,你能解釋一下你在這個Espresso測試中想做什麼嗎?
我想確保複選框在我做測試之前被選中。它可能未被檢查的原因是因爲另一個測試沒有被檢查。 – kyrax
Espresso不應該能夠以任何方式設置任何視圖狀態或操縱視圖。如果沒有其他的方式來構建你的測試,那麼以前的答案將會起作用,但是又一次違背了意式咖啡的慣例。我會推薦以一種可以使它們更加模塊化的方式來構建測試,以便不必操縱任何視圖。@kyrax –
@kyrax你能否接受我的回答,因爲應該知道在espresso測試中使用活動非常糟糕。 –
我有同樣的問題一個寫了自己的ViewAction這一始終取消選中我SwitchCompat
class UncheckViewAction implements ViewAction{
@Override
public Matcher<View> getConstraints() {
return new Matcher<View>() {
@Override
public boolean matches(Object item) {
return isA(SwitchCompat.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) {
SwitchCompat scView = (SwitchCompat) view;
scView.setChecked(false);
}
}
,並用它這樣的:
onView(withId(R.id.check_box)).perform(new UncheckViewAction())
現在我可以肯定的是,發現開關始終未經檢查,無論它是否被選中或未被選中。
- 1. 如果沒有複選框被選中
- 2. 點擊複選框後沒有收到複選框事件
- 3. 如果沒有選中複選框,點擊事件會引發JavaScript警報
- 4. 選中第一個複選框,如果沒有複選框被選中
- 5. 如何點擊一個複選框,點擊所有複選框VBA
- 6. 單擊複選框點擊選擇Jquery mobile中的所有複選框
- 7. 如果選中複選框,只允許點擊鏈接
- 8. jQuery選擇框沒有顯示,如果沒有通過點擊選擇
- 9. Phantomjs點擊複選框
- 10. Appium的Android點擊複選框
- 11. 我不能點擊複選框,因爲沒有目前該複選框
- 12. 如果所有複選框都選中,選中所有複選框
- 13. NSOutlineView:如何點擊所有選中的複選框?
- 14. jQuery - 點擊,選中類中的所有複選框,如果選中(這樣做)如果不(那麼)
- 15. 驗證如果複選框被點擊,選擇下拉菜單
- 16. 如果沒有選中複選框,如何隱藏div jQuery
- 17. 在沒有點擊提交按鈕的複選框中如何發送選定的複選框值?
- 18. EXTJS 5:如何在點擊網格中的複選框時選中複選框
- 19. 爲什麼複選框沒有被選中,如果我點擊另一個選項卡?
- 20. 啓用/禁用複選框點擊複選框中的另一個複選框
- 21. 測試複選框點擊
- 22. 複選框點擊網頁?
- 23. datagrid複選框colum點擊
- 24. 當複選框被點擊
- 25. 通過點擊複選框
- 26. WPF上點擊複選框
- 27. 如何檢查在android中是否沒有選中複選框?
- 28. 提醒如果複選框沒有被選中並提交
- 29. 顯示,如果沒有選中複選框的jQuery
- 30. 複選框有非常約被點擊
這應該是可以接受的答案! – jakubbialkowski
完美,謝謝@FrostRocket 我不得不改變的唯一的事情是刪除「scrollTo()」ViewAction,因爲我的錯誤是我的複選框不支持scrollTo: 'onView(withId(R.id。正如你所看到的,我想將複選框設置爲提供的「globalSearch」的值var – yvolk
我更新了答案,添加了對複選框當前狀態的檢查並將其更改僅當其狀態不是必要時才能避免不必要的事件: 'if(checkableView.isChecked()!= checked){ checkableView.setChecked(checked); }' – yvolk