Kiểm tra xem hộp thoại có hiển thị với Espresso không


86

Tôi đang cố gắng viết một số bài kiểm tra với android-test-kit (Espresso) mới . Nhưng tôi không thể tìm thấy bất kỳ thông tin nào về cách kiểm tra xem một hộp thoại có được hiển thị hay không và thực hiện một số hành động trên đó (như nhấp vào nút tích cực và tiêu cực, v.v.). Lưu ý rằng hộp thoại cũng có thể được hiển thị bởi a WebView, không phải bởi ứng dụng tự nó.

Bất kỳ trợ giúp sẽ được đánh giá cao. Tôi chỉ cần một liên kết hoặc một số mã ví dụ cho những điều cơ bản:

  1. Kiểm tra xem hộp thoại có xuất hiện không
  2. Thực hiện nhấp chuột vào các nút hộp thoại
  3. Tương tác với chế độ xem bên trong của hộp thoại (nếu đó là chế độ xem tùy chỉnh)
  4. Định dạng các nhấp chuột bên ngoài hộp thoại và kiểm tra xem nó có hiển thị hay không (ví dụ: nếu nó setCancelable(false)được gọi trên trình tạo hộp thoại và chúng tôi muốn kiểm tra điều đó)

Cảm ơn lời khuyên của bạn!


Bất kỳ phản hồi nào về câu trả lời của tôi dưới đây ??
chối

Câu trả lời:


123
  1. Để xác minh xem hộp thoại có xuất hiện hay không, bạn chỉ cần kiểm tra xem Chế độ xem có văn bản bên trong hộp thoại có được hiển thị hay không:

    onView(withText("dialogText")).check(matches(isDisplayed()));
    

    hoặc, dựa trên văn bản có id

    onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
    
  2. Để nhấp vào nút hộp thoại, hãy thực hiện việc này (button1 - OK, button2 - Cancel):

    onView(withId(android.R.id.button1)).perform(click());
    

    CẬP NHẬT

  3. Tôi nghĩ là có thể vì Espresso có hỗ trợ nhiều cửa sổ .
  4. Không chắc chắn về việc nhấp vào bên ngoài chế độ xem hộp thoại tùy chỉnh nhưng để kiểm tra xem nó có hiển thị hay không, bạn phải tạo trình đối sánh tùy chỉnh của mình và kiểm tra bên trong nó.

3
Bước 1 không phù hợp với tôi trên ProgressDialog. Chỉ cần cố gắng để xác nhận các Tiêu đề và tin nhắn của hộp thoại
Tim Boland

1
Nó là gì với espresso và nhập khẩu tĩnh? Những phương thức đó đến từ những lớp nào? Tại sao bạn sử dụng nhập tĩnh trên câu trả lời tràn ngăn xếp?

2
@jvrodrigues mọi hướng dẫn Espresso đều sử dụng nhập tĩnh. Tôi đề nghị bạn chỉ cần làm quen với nó (mặc dù tôi hiểu sự thất vọng). Điều này hữu ích: google.github.io/android-testing-support-library/docs
AutonomousApps

Đối với bước 4 thay vì nhấp vào bên ngoài hộp thoại, bạn có thể gọi "pressBack ();" loại bỏ hộp thoại. nó tương đương với việc sử dụng nút quay lại phần cứng.
Ethan

Dự án @denys đã được chuyển đi. Có vẻ như liên kết đã chết.
Neon Warge

67

Tôi hiện đang sử dụng cái này và nó có vẻ hoạt động tốt.

onView(withText(R.string.my_title))
    .inRoot(isDialog()) // <---
    .check(matches(isDisplayed()));

27

Nếu bạn có một AlertDialog như vậy:

nhập mô tả hình ảnh ở đây

Bạn có thể kiểm tra xem các thành phần có được hiển thị không:

int titleId = mActivityTestRule.getActivity().getResources()
        .getIdentifier( "alertTitle", "id", "android" );

onView(withId(titleId))
        .inRoot(isDialog())
        .check(matches(withText(R.string.my_title)))
        .check(matches(isDisplayed()));

onView(withId(android.R.id.text1))
        .inRoot(isDialog())
        .check(matches(withText(R.string.my_message)))
        .check(matches(isDisplayed()));

onView(withId(android.R.id.button2))
        .inRoot(isDialog())
        .check(matches(withText(android.R.string.no)))
        .check(matches(isDisplayed()));

onView(withId(android.R.id.button3))
        .inRoot(isDialog())
        .check(matches(withText(android.R.string.yes)))
        .check(matches(isDisplayed()));

và thực hiện một hành động:

onView(withId(android.R.id.button3)).perform(click());

2
Văn bản trong trường hợp của tôi có id android.R.id.messagevà tiêu đề có id ẩn android.R.id.alertTitle.
Jason Robinson

2
Nếu bạn sử dụng AlertDialog (hoặc DialogFragment) đến từ thư viện hỗ trợ AppCompat, hãy sử dụng cái này:int alertDialogTitleId = android.support.v7.appcompat.R.id.alertTitle;
Mr-IDE

3

Để trả lời câu hỏi 4, mà câu trả lời được chấp nhận thì không, tôi đã sửa đổi đoạn mã sau mà tôi tìm thấy ở đây trên Stack Overflow ( liên kết ) để kiểm tra xem Bánh mì nướng có được hiển thị hay không.

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) {
    return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

Giá trị idđược chuyển vào là id của một Viewhiện đang hiển thị trong hộp thoại của bạn. Bạn cũng có thể viết phương thức như vậy:

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) {
    return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

Và bây giờ nó đang tìm kiếm Viewchứa một chuỗi văn bản cụ thể.

Sử dụng nó như vậy:

getRootView(getActivity(), R.id.text_id).perform(click());

3

Nút R.id.button1 và R.id.button2 sẽ không giống nhau trên các thiết bị. Id có thể thay đổi theo các phiên bản hệ điều hành.

Cách chính xác để đạt được điều này là sử dụng UIAutomator. Bao gồm sự phụ thuộc của UIAutomator trong build.gradle của bạn

// Set this dependency to build and run UI Automator tests
  androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'

Và sử dụng

// Initialize UiDevice instance
UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

// Search for correct button in the dialog.
UiObject button = uiDevice.findObject(new UiSelector().text("ButtonText"));
if (button.exists() && button.isEnabled()) {
    button.click();
}

1
Trên thực tế, android.R.id.button1, android.R.id.button2android.R.id.button3cho "tích cực", "trung lập" và "tiêu cực", là biểu tượng toàn cầu mà có thể được sử dụng. Nếu bạn chọn các nút thông qua văn bản của chúng - điều này hoàn toàn ổn - bạn không cần UIAutomator, nhưng có thể làm tương tự với Espresso onView(withText("ButtonTest")).perform(click()).
Thomas Keller

Tôi đã sử dụng giải pháp này với khung thử nghiệm Robotium và tôi có thể chọn các nút hộp thoại hệ điều hành Android một cách dễ dàng. Tiết kiệm cho tôi rất nhiều thời gian. Cảm ơn jaydeepw!
Ray

@ThomasKeller Tôi đã sử dụng id button1, button2 trước đây, các bài kiểm tra của tôi bị hỏng khi tôi chạy chúng trên nhiều thiết bị. Hộp thoại hiển thị là điều khiển hệ thống. Không phải điều khiển / giao diện người dùng của bạn. Đối với bất kỳ thứ gì bên ngoài giao diện người dùng của bạn, UIAutomator được khuyến nghị.
JaydeepW

Đó là nó. Cảm ơn bạn rất nhiều.
1lb3r

3

Đề phòng bất cứ ai tình cờ gặp câu hỏi này như tôi. Tất cả các câu trả lời sẽ chỉ hoạt động cho hộp thoại CÓ nút hộp thoại. Không thử và sử dụng điều này cho các hộp thoại tiến trình mà không có sự tương tác của người dùng. Espresso tiếp tục chờ ứng dụng chuyển sang trạng thái không hoạt động. Miễn là hộp thoại tiến trình hiển thị, ứng dụng không ở chế độ chờ.

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.