đối sánh (not (isDisplayed ())) không thành công với NoMatchingViewException


85

Tôi đang cố gắng kiểm tra sự vắng mặt của giao diện người dùng. Bộ chọn chế độ xem như sau:

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

Bộ chọn hoạt động tốt để kiểm tra xem chế độ xem có được hiển thị hay không, nhưng lại báo lỗi khi kiểm tra nếu chế độ xem không được hiển thị. Tôi đang sử dụng cái này như sau:

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

Nhưng tôi gặp lỗi sau:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: Không tìm thấy chế độ xem nào trong cấu trúc phân cấp phù hợp: với id: là Nếu chế độ xem đích không phải là một phần của cấu trúc phân cấp chế độ xem, bạn có thể cần sử dụng Espresso.onData để tải nó từ một trong các AdapterViews sau: android.widget.ListView {...}

Điều này thật kỳ lạ. Tôi đang kiểm tra sự vắng mặt của giao diện người dùng và dự kiến ​​rằng chế độ xem này sẽ không được tìm thấy. Vậy tại sao Espresso lại bị lỗi? Vui lòng đề xuất những gì có thể xảy ra ở đây.

Cảm ơn, ngạc nhiên!

Câu trả lời:


161

Cần sử dụng doesNotExist()thay thế. Tìm thấy ở đây .

Nếu chế độ xem ở đó trong hệ thống phân cấp chế độ xem nhưng ở trạng thái vô hình (khả năng hiển thị được đặt thành 'KHÔNG CÓ THỂ'), hãy sử dụng not(isDisplayed). Tuy nhiên, nếu chế độ xem hoàn toàn không có trong phân cấp chế độ xem (ví dụ: khả năng hiển thị được đặt thành 'GONE'), doesNotExist()sẽ được sử dụng.


17
Nó không hiệu quả với tôi, nhưng onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));đã hoạt động.
Sithu

35
@Sithu -Nó phụ thuộc vào ứng dụng. Nếu chế độ xem bạn đang tìm kiếm có trong hệ thống phân cấp chế độ xem nhưng không nhìn thấy được, thì bạn cần sử dụng not (isDisplayed). Tuy nhiên, nếu dạng xem không có trong cấu trúc phân cấp dạng xem, bạn cần sử dụng doesNotExist ().
user846316

1
Tôi có nút trong cách bố trí, nhưng tầm nhìn bộ View.GONEtrong onCreatekhi sử dụng vai trò. Vì vậy, nó có nghĩa là nó nằm trong hệ thống phân cấp chế độ xem và vô hình?
Sithu

Vâng! Cảm ơn vì điều này, siêu đã giải quyết vấn đề của tôi và làm cho buổi sáng của tôi tốt hơn nhiều (đã đi ngủ với vấn đề này).
Booger

Nếu chế độ xem biến mất khỏi phân cấp chế độ xem — điều này có thể xảy ra khi một hành động gây ra chuyển đổi sang hoạt động khác — bạn nên sử dụng ví dụ ViewAssertions.doesNotExist (): View.GONE trong ví dụ của bạn là sai và gây hiểu lầm. Vui lòng chỉnh sửa câu trả lời của bạn
metis

18

Cũng làm việc với phương pháp của bạn, nhưng một cái gì đó như thế này:

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

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

5
Đây là một câu trả lời đúng một phần. Điều này sẽ chỉ hoạt động nếu chế độ xem targedet không tồn tại trong bố cục (cấu trúc phân cấp chế độ xem không chứa chế độ xem này.) Tuy nhiên, xác nhận này sẽ không thành công nếu chế độ xem được nhắm mục tiêu thực sự tồn tại trong cấu trúc phân cấp chế độ xem bố cục, nhưng trạng thái hiển thị của nó là GONE hoặc KHÔNG CÓ THỂ. Thông báo xác nhận thất bại trong trường hợp đó sẽ cho biết:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
Simon-Droid

Đúng, vì vậy tôi nghĩ bạn có thể kiểm tra thông báo lỗi bằng hệ thống phân cấp chế độ xem chi tiết.
Olivia Liao

8

Nếu bạn muốn kiểm tra xem Viewhiển thị hoặc không tồn tại hay không .

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));
            }
        }
    };
}

Sử dụng:

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

Cảm ơn vì điều này - IMHO đây là giải pháp tốt nhất để "kiểm tra xem chế độ xem có biến mất khỏi màn hình hay không". Tuy nhiên, một điều chỉnh: IME, cách sử dụng làonView(withId(R.id.someView)).check(isNotDisplayed());
Chuỗi

4

Bạn có thể thử tùy chọn này nếu bạn kiểm tra khả năng hiển thị của chế độ xem "withEffectiveVisibility"

    onViewWithId(R.id.YOURVIEW).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))

Những cái khác không hoạt động nhưng cái này thì có. Cảm ơn
Saul_programa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.