MaterialSearchBar
- это ViewGroup
, а не EditText
, поэтому вы не сможете использовать perform(typeText("Tony"))
напрямую. Но вы знаете, что он содержит ровно один EditText
.
Вы можете найти EditText
с помощью другого ViewMatcher
на EditText
:
@Test
public void findEditTextByClassName(){
onView(withClassName(containsString(EditText.class.getSimpleName()))).perform(replaceText("Tony"));
onView(withText("Tony")).check(matches(isDisplayed()));
}
Кроме того, вы можете искать в дереве View
, начиная с MaterialSearchBar
как root, так как вы знаете, под каким идентификатором он присутствует в вашем макете:
@Test
public void findEditTextInViewTree(){
// NOTE exchange R.id.material_search_bar for your own id value!
ViewGroup viewGroup = activityRule.getActivity().findViewById(R.id.material_search_bar);
int id = -1;
for(int i = 0; i < viewGroup.getChildCount(); i++){
View view = viewGroup.getChildAt(i);
if(view instanceof EditText){
id = view.getId();
}
}
onView(allOf(withParent(withId(R.id.material_search_bar)),withId(id))).perform(replaceText("Tony"));
onView(withText("Tony")).check(matches(isDisplayed()));
}
Обратите внимание, что я использую replaceText()
вместо typeText()
, так как этот пост о поиске View
, не о ожидании typeText()
до финиша sh