Тестирование сообщения тоста с использованием эспрессо не разрешено
Я не могу протестировать сообщение "Тост" с помощью эспрессо. С ним связано много вопросов и ответов, но я не могу решить эту проблему.
TestingCode
class ToastMatcher extends TypeSafeMatcher<Root> {
@Override
public boolean matchesSafely(Root root) {
int type = root.getWindowLayoutParams().get().type;
if ((type == WindowManager.LayoutParams.TYPE_TOAST)) {
IBinder windowToken = root.getDecorView().getWindowToken();
IBinder appToken = root.getDecorView().getApplicationWindowToken();
if (windowToken == appToken) {
return true;
//means this window isn't contained by any other windows.
}
}
return false;
}
@Override
public void describeTo(Description description) {
description.appendText(String.valueOf(R.string.messsage_login_successful));
}
}
@Test
public void btnLoginClickWithPassingUserNameAndPassword() throws Exception {
onView(withId(R.id.etUsername)).perform(clearText());
onView(withId(R.id.etUsername)).perform(typeText(userName));
onView(withId(R.id.etPassword)).perform(typeText(passWord));
onView(withId(R.id.btnLogin)).perform(click());
// onView(withText(R.string.messsage_login_successful)).inRoot(withDecorView(not(mActivityRule.getActivity().getWindow().getDecorView()))).check(matches(isDisplayed()));
// onView(withText(R.string.messsage_login_successful)).inRoot(withDecorView(not(is(mActivityRule.getActivity().getWindow().getDecorView())))).check(matches(isDisplayed()));
onView(withText(R.string.messsage_login_successful)).inRoot(new ToastMatcher())
.check(matches(isDisplayed()));
}
Проблема, которую я получил
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with string from resource id: <2131689608>[messsage_login_successful] value: Logged In Successfully
If the target view is not part of the view hierarchy, you may need to use Espresso.onData to load it from one of the following AdapterViews:android.widget.GridView{52a6eb90 VFED.VC. .F...... 60,112-884,904 #7f0a007c app:id/dashMenu}
View Hierarchy:
+>DecorView{id=-1, visibility=VISIBLE, width=1080, height=1920, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=WM.LayoutParams{(0,0)(fillxfill) ty=1 fl=#1810100 pfl=0x8 wanim=0x10302a1}, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
Как решить эту проблему. Я всегда получаю Нет подходящих представлений в иерархии?
2 ответа
Это заявление работает для меня.
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.RootMatchers.withDecorView;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
onView(withText(R.string.TOAST_STRING)).inRoot(withDecorView(not(getActivity().getWindow().getDecorView()))).check(matches(isDisplayed()));
или используйте Custom Matcher для достижения этой цели
public class ToastMatcher extends TypeSafeMatcher<Root> {
@Override public boolean matchesSafely(Root root) {
int type = root.getWindowLayoutParams().get().type;
if ((type == WindowManager.LayoutParams.TYPE_TOAST)) {
IBinder windowToken = root.getDecorView().getWindowToken();
IBinder appToken = root.getDecorView().getApplicationWindowToken();
if (windowToken == appToken) {
return true;
//means this window isn't contained by any other windows.
}
}
return false;
}
Проверьте, отображается ли сообщение Toast
onView(withText(R.string.mssage)).inRoot(new ToastMatcher())
.check(matches(isDisplayed()));
Проверьте, не отображается ли сообщение о тосте
onView(withText(R.string.mssage)).inRoot(new ToastMatcher())
.check(matches(not(isDisplayed())));
Тестовый идентификатор, который содержит тост
onView(withText(R.string.mssage)).inRoot(new ToastMatcher())
.check(matches(withText("Invalid Name"));
У меня такая же проблема на Android 11 . С любой другой версией Android ваш код отлично работает (для меня). К сожалению, я пока не нашел решения. Даже UIAutomator, похоже, не обнаруживает тосты на Android 11 (как предлагается в этом сообщении ).