2014-05-21 17 views
12

Tôi đang cố gắng để cập nhật một EditText như là một phần của một thử nghiệm Espresso với:Đang cập nhật một EditText với Espresso

onView(allOf(withClassName(endsWith("EditText")), withText(is("Test")))).perform(clearText()) 
                     .perform(click()) 
                     .perform(typeText("Another test")); 

Tuy nhiên tôi nhận được lỗi sau:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: No views in hierarchy found matching: (with class name: a string ending with "EditText" and with text: is "Test") 

Bằng cách phá vỡ sự kiểm tra Tôi có thể thấy rằng điều này xảy ra sau khi thực hiện clearText(), vì vậy tôi giả định rằng các đối sánh đang được chạy lại trước mỗi perform và không thực hiện trước hành động thứ hai. Mặc dù điều này có ý nghĩa, nó khiến tôi hơi bối rối về cách cập nhật EditText bằng cách sử dụng Espresso. Làm thế nào tôi nên làm điều này?

Lưu ý rằng tôi không thể sử dụng ID tài nguyên hoặc tương tự trong trường hợp này và phải sử dụng kết hợp như được hiển thị ở trên để xác định chế độ xem chính xác.

Trả lời

1

Bạn có thể thử hai thứ. Trước tiên, tôi sẽ cố gắng sử dụng

onView(withId(<id>).perform... 

Bằng cách này bạn sẽ luôn có quyền truy cập vào trường EditText ngay cả khi các trường EditText khác trên màn hình.

Nếu đó không phải là một tùy chọn, bạn có thể chia nhỏ các cuộc gọi thực hiện của mình.

onView(allOf(withClassName(endsWith("EditText")),withText(is("Test")))).perform(clearText()); 
onView(withClassName(endsWith("EditText"))).perform(click()); 
onView(withClassName(endsWith("EditText"))).perform(typeText("Another Test"); 
+0

Cảm ơn đã phản ứng. Rất tiếc, có nhiều EditTexts trong hoạt động, được tạo theo chương trình mà không có ID, do đó, cả hai đề xuất này đều không hoạt động. – jgm

+0

Tôi hiểu. Có lẽ bạn có thể đặt thẻ cho mỗi EditText bạn tạo và tìm chế độ xem dựa trên thẻ đó. Thẻ chỉ có thể được sử dụng để thử nghiệm, nhưng ít nhất nó sẽ cung cấp cho bạn một cái gì đó để phân biệt các trường EditText. Sau đó, một lần nữa, có thể vi phạm các điều kiện bạn đề cập ở phần cuối của câu hỏi của bạn (tôi bỏ qua phần đó trước khi tôi trả lời). – Maxwell

8

Ba điều cần thử:

1. Bạn có thể chạy Thực hiện liên tiếp.

onView(...) 
    .perform(clearText(), typeText("Some Text")); 

2. Có một recorded issue on the Espresso page được đánh dấu là không hợp lệ (nhưng vẫn còn rất nhiều lỗi). Giải pháp cho việc này là tạm dừng thử nghiệm ở giữa các hoạt động.

public void test01(){ 
    onView(...).perform(clearText(), typeText("Some Text")); 
    pauseTestFor(500); 
    onView(...).perform(clearText(), typeText("Some Text")); 
} 

private void pauseTestFor(long milliseconds) { 
    try { 
     Thread.sleep(milliseconds); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

3. Bạn có hoàn toàn chắc chắn rằng EditText của bạn có chứa các văn bản, "Test"?

20

Bạn có thể sử dụng phương thức ReplaceText.

onView(allOf(withClassName(endsWith("EditText")), withText(is("Test")))).perform(replaceText("Another test")); 
+0

replaceText() hoạt động! Điều đó đã cứu tôi. Dường như typeText() có một số vấn đề với bàn phím đầu vào. – herbertD

2

Tôi đã gặp sự cố tương tự và đã giải quyết sự cố bằng cách sử dụng trình ghép nối containsString và Class.getSimpleName(). Như thế này:

onView(withClassName(containsString(PDFViewPagerIVZoom.class.getSimpleName()))).check(matches(isDisplayed())); 

Bạn có thể xem toàn bộ mã here

Các vấn đề liên quan