eşleşmeler (not (isDisplayed ())) NoMatchingViewException ile başarısız olur


87

UI görünümünün yokluğunu test etmeye çalışıyorum. Görünüm seçici aşağıdaki gibidir:

public static ViewInteraction onMyTestUi() {
    return onView(withId(R.id.myTestId));
}

Seçici, görünümün görüntülenip görüntülenmediğini kontrol etmek için iyi çalışır, ancak görünümün görüntülenip görüntülenmediğini kontrol ederken hata verir. Bunu şu şekilde kullanıyorum:

 onMyTestUi().check(matches(not(isDisplayed())));

Ama şu hatayı alıyorum:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: hiyerarşide eşleşen görünüm bulunamadı: with id: is Hedef görünüm, görünüm hiyerarşisinin bir parçası değilse, Espresso.onData'yı kullanmak için aşağıdaki AdapterViews öğelerinin birinden yükleyin: android.widget.ListView {...}

Bu tuhaf. Kullanıcı arayüzünün yokluğunu kontrol ediyorum ve bu görünümün bulunmaması bekleniyor. O zaman Espresso neden hata veriyor? Lütfen burada neyin yanlış gidebileceğini önerin.

Teşekkürler, Hayret!

Yanıtlar:


166

doesNotExist()Bunun yerine kullanmanız gerekir . Burada bulundu .

Görünüm, görünüm hiyerarşisinde oradaysa ancak görünmez bir durumdaysa (görünürlük 'GÖRÜNMEZ' olarak ayarlanmışsa), kullanın not(isDisplayed). Ancak, görünüm hiyerarşisinde görünüm hiç bulunmuyorsa (örneğin, görünürlük 'GONE' olarak ayarlanmışsa) doesNotExist()kullanılır.


17
Benim için işe yaramıyor, ama onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));işe yaradı.
Sithu

37
@Sithu -Uygulamaya göre değişir. Aradığınız görünüm görünüm hiyerarşisinde oradaysa ancak görünmüyorsa not (isDisplayed) kullanmanız gerekir. Bununla birlikte, görünüm, görünüm hiyerarşisinde yoksa, doesNotExist () kullanmanız gerekir.
user846316

1
Ben düzeninde düğmeye ancak set görünürlüğe sahip View.GONEiçinde onCreatekullanıcı rolü üzerine. Öyleyse, görünüm hiyerarşisinde ve görünmez olduğu anlamına mı geliyor?
Sithu

Evet! Bunun için teşekkürler, süper sorunumu çözdü ve sabahımı çok daha iyi hale getirdi (bu sorunla yattım).
Booger

Görünüm, görünüm hiyerarşisinden gitmişse (bir eylem başka bir etkinliğe geçişe neden olduğunda meydana gelebilir) ViewAssertions.doesNotExist () kullanmalısınız: Örneğinizdeki View.GONE örneği yanlış ve yanıltıcıdır. Lütfen cevabınızı düzenleyin
metis

18

Ayrıca kendi yönteminizle çalışın, ancak bunun gibi bir şey:

onView(withId(R.id.next)).check(matches(not(isDisplayed())));

15
onView(withText("")).check(doesNotExist());

5
Bu kısmen doğru bir cevap. Bu yalnızca, targedet görünümü düzende yoksa çalışır (görünüm hiyerarşisi bu görünümü içermez.) Ancak, hedeflenen görünüm aslında düzen görünümü hiyerarşisinde mevcutsa, ancak görünürlük durumu GONE veya GÖRÜNMEZ ise bu iddia başarısız olacaktır. Bu durumda onaylama hatası mesajında ​​şunlar gösterilir:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
Simon-Droid

Doğru, bu yüzden hata mesajını ayrıntılı görünüm hiyerarşisi ile kontrol edebileceğinizi düşünüyorum.
Olivia Liao

8

Eğer kontrol etmek isterseniz Viewya olduğu görünmüyorsa veya mevcut değil .

public static ViewAssertion isNotDisplayed() {
    return new ViewAssertion() {
        @Override
        public void check(View view, NoMatchingViewException noView) {
            if (view != null && isDisplayed().matches(view)) {
                throw new AssertionError("View is present in the hierarchy and Displayed: "
                        + HumanReadables.describe(view));
            }
        }
    };
}

Kullanım:

onView(withId(R.id.someView)).check(isNotDisplayed());

Bunun için teşekkürler - IMHO bu, genelleştirilmiş bir "görünümün ekrandan gidip gitmediğini kontrol et" için en iyi çözümdür. Yine de bir düzeltme: IME, kullanımonView(withId(R.id.someView)).check(isNotDisplayed());
String

4

"WithEffectiveVisibility" görünümünün görünürlüğünü kontrol ederseniz bu seçeneği deneyebilirsiniz.

    onViewWithId(R.id.YOURVIEW).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.