Espresso Web

Espresso-Web là một điểm truy cập để làm việc với các thành phần giao diện người dùng WebView trên Android. Espresso-Web sử dụng lại các Nguyên tử trong API WebDriver phổ biến để kiểm tra và kiểm soát hành vi của một WebView.

Các trường hợp nên sử dụng Espresso-Web

Sử dụng Espresso-Web để kiểm thử các ứng dụng kết hợp, đặc biệt là việc tích hợp thành phần giao diện người dùng gốc của ứng dụng với WebView Thành phần giao diện người dùng. Bạn có thể sử dụng Espresso-Web API cùng với các API Espresso để tương tác đầy đủ với các thành phần web bên trong đối tượng WebView.

Nếu bạn chỉ cần kiểm thử chính WebView chứ không phải kiểm thử hoạt động tương tác giữa WebView và các thành phần gốc trong ứng dụng của bạn, hãy cân nhắc viết chương trình kiểm thử web chung bằng một khung như WebDriver. Nếu sử dụng khung thử nghiệm web, bạn không cần sử dụng thiết bị Android hoặc Máy ảo Java để thực hiện các bài kiểm thử chạy nhanh hơn và đáng tin cậy hơn. Dù vậy, Espresso-Web vẫn cho phép bạn sử dụng lại các nguyên tử WebDriver tuỳ chỉnh của bạn, giúp bạn linh hoạt hơn, đặc biệt là khi viết mã kiểm thử mà bạn dự định chạy trên cả ứng dụng web độc lập và các ứng dụng có giao diện người dùng Android.

Cách hoạt động

Tương tự như onData() của Espresso , một tương tác WebView bao gồm một số Nguyên tử. Các hoạt động tương tác WebView sử dụng tổ hợp ngôn ngữ lập trình Java và Cầu nối JavaScript để thực hiện công việc của mình. Vì không có cơ hội giới thiệu bằng cách hiển thị dữ liệu từ môi trường JavaScript—mọi thứ Espresso thấy được ở phía dựa trên Java là một bản sao riêng biệt – trả về dữ liệu từ Web.WebInteraction được hỗ trợ đầy đủ, cho phép bạn xác minh tất cả dữ liệu được trả về từ yêu cầu.

WebDriver Atom là gì?

Khung WebDriver sử dụng các nguyên tử để tìm và thao tác với các phần tử trên web theo phương thức lập trình. WebDriver sử dụng các nguyên tử nguyên tử để cho phép thao tác trên trình duyệt. Một Về mặt lý thuyết, Atom tương tự như ViewAction, một thành phần độc lập thực hiện hành động trong giao diện người dùng. Bạn hiển thị các Nguyên tử bằng cách sử dụng danh sách các phương thức đã xác định, chẳng hạn như findElement()getElement(), để điều khiển trình duyệt theo góc nhìn của người dùng. Tuy nhiên, nếu bạn sử dụng WebDriver các nguyên tử cần được sắp xếp hợp lý, đòi hỏi logic khá chi tiết.

Trong Espresso, các lớp WebWeb.WebInteraction gói mẫu này và tạo cảm giác giống như Espresso khi tương tác với WebView . Vì vậy, trong ngữ cảnh WebView, Nguyên tử được dùng làm sự thay thế cho Espresso truyền thống ViewMatchersViewActions.

Khi đó, API này sẽ trông khá đơn giản:

Kotlin

onWebView()
    .withElement(Atom)
    .perform(Atom)
    .check(WebAssertion)

Java

onWebView()
    .withElement(Atom)
    .perform(Atom)
    .check(WebAssertion);

Để tìm hiểu thêm, hãy đọc Tài liệu của Serenium về Nguyên tử.

Triển khai WebView

Hãy làm theo hướng dẫn trong các phần sau để làm việc với WebView trong các kiểm thử của ứng dụng.

Gói

Để đưa Espresso-Web vào dự án của bạn, hãy hoàn tất các bước sau:

  1. Mở tệp build.gradle của ứng dụng. Đây thường không phải là tệp build.gradle cấp cao nhất nhưng app/build.gradle.
  2. Thêm dòng sau vào bên trong phần phụ thuộc:

    Groovy

        androidTestImplementation 'androidx.test.espresso:espresso-web:3.6.1'
        

    Kotlin

        androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
        
  3. Espresso-Web chỉ tương thích với Espresso 2.2 trở lên và phiên bản 0.3 trở lên của thư viện thử nghiệm, vì vậy, hãy đảm bảo bạn cập nhật những dòng:

    Groovy

        androidTestImplementation 'androidx.test:runner:1.6.1'
        androidTestImplementation 'androidx.test:rules:1.6.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
        

    Kotlin

        androidTestImplementation('androidx.test:runner:1.6.1')
        androidTestImplementation('androidx.test:rules:1.6.1')
        androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1')
        

Cách sử dụng API phổ biến

onWebView() là điểm truy cập chính khi làm việc với WebView trên Android thông qua Espresso. Bạn sẽ sử dụng phương thức này để thực hiện các chương trình kiểm thử Espresso-Web, chẳng hạn như sau:

Kotlin

onWebView()
    .withElement(findElement(Locator.ID, "link_2")) // similar to onView(withId(...))
    .perform(webClick()) // Similar to perform(click())

    // Similar to check(matches(...))
    .check(webMatches(getCurrentUrl(), containsString("navigation_2.html")))

Java

onWebView()
    .withElement(findElement(Locator.ID, "link_2")) // similar to onView(withId(...))
    .perform(webClick()) // Similar to perform(click())

    // Similar to check(matches(...))
    .check(webMatches(getCurrentUrl(), containsString("navigation_2.html")));

Trong ví dụ này, Espresso-Web xác định một phần tử DOM có mã nhận dạng là "link_2" và nhấp vào nội dung đó. Sau đó, công cụ này xác minh rằng WebView gửi một yêu cầu GET chứa chuỗi "navigation_2.html".

Hỗ trợ JavaScript

Khi thực thi kiểm thử, hệ thống thực hiện tất cả các lượt tương tác với WebView bằng cách sử dụng JavaScript. Do đó, để hỗ trợ việc đánh giá JavaScript, WebView đang được kiểm thử phải bật JavaScript.

Bạn có thể buộc bật JavaScript bằng cách gọi forceJavascriptEnabled() dưới dạng hành động trong hoạt động của bạn trong thử nghiệm, như minh hoạ trong đoạn mã sau.

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule val activityScenarioRule =
        activityScenarioRule<MyWebViewActivity>()

    @Test fun testWebViewInteraction() {
        onWebView().forceJavascriptEnabled()
    }
}

Các hoạt động tương tác phổ biến trên web

Sau đây là các hoạt động tương tác phổ biến với đối tượng Web.WebInteraction:

  • withElement() tham chiếu đến một phần tử DOM trong WebView.

    Ví dụ:

    Kotlin

    onWebView().withElement(findElement(Locator.ID, "teacher"))
    

    Java

    onWebView().withElement(findElement(Locator.ID, "teacher"));
    
  • withContextualElement() tham chiếu đến một phần tử DOM trong phạm vi trong WebView, so với một phần tử DOM khác. Bạn nên gọi withElement() trước tiên để thiết lập tham chiếu Đối tượng Web.WebInteraction (phần tử DOM).

    Ví dụ:

    Kotlin

    .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"))
    

    Java

    .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"));
    
  • check() đánh giá một điều kiện, đảm bảo rằng điều kiện đó được giải quyết đến true.

    Ví dụ:

    Kotlin

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"))
        .check(webMatches(getText(), containsString("Socrates")))
    

    Java

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"))
        .check(webMatches(getText(), containsString("Socrates")));
    
  • perform() thực thi một thao tác trong WebView, chẳng hạn như nhấp vào một phần tử.

    Ví dụ:

    Kotlin

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick())
    

    Java

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick());
    
  • reset() hoàn nguyên WebView về trạng thái ban đầu. Điều này là cần thiết khi chẳng hạn như nhấp chuột, đưa ra thay đổi điều hướng khiến Đối tượng ElementReference và WindowReference không thể truy cập được.

    Lưu ý: Mặc dù việc sử dụng reset() sẽ hữu ích khi đưa ra câu nhận định dựa trên quy trình làm việc nhiều trang, chẳng hạn như gửi biểu mẫu, các thử nghiệm của bạn thường được giới hạn trong phạm vi và tập trung vào một trang duy nhất.

    Ví dụ:

    Kotlin

    onWebView()
        .withElement(...)
        .perform(...)
        .reset()
    

    Java

    onWebView()
        .withElement(...)
        .perform(...)
        .reset();
    

Ví dụ

Ví dụ sau đây kiểm tra xem liệu sau khi nhập văn bản vào WebView và chọn nút Gửi, văn bản đó sẽ xuất hiện trong một phần tử khác trong cùng một WebView:

Kotlin

const val MACCHIATO = "Macchiato"

@RunWith(AndroidJUnit4::class)
class MyEspressoWebTestSuite {

    @Test fun typeTextInInput_clickButton_SubmitsForm() {
        // Create an intent that displays a web form.
        val webFormIntent = Intent()
        // ...

        // Lazily launch the Activity with a custom start Intent per test.
        ActivityScenario.launchActivity(webFormIntent)

        // Selects the WebView in your layout. If you have multiple WebView
        // objects, you can also use a matcher to select a given WebView,
        // onWebView(withId(R.id.web_view)).
        onWebView()
            // Find the input element by ID.
            .withElement(findElement(Locator.ID, "text_input"))

            // Clear previous input and enter new text into the input element.
            .perform(clearElement())
            .perform(DriverAtoms.webKeys(MACCHIATO))

            // Find the "Submit" button and simulate a click using JavaScript.
            .withElement(findElement(Locator.ID, "submitBtn"))
            .perform(webClick())

            // Find the response element by ID, and verify that it contains the
            // entered text.
            .withElement(findElement(Locator.ID, "response"))
            .check(webMatches(getText(), containsString(MACCHIATO)))
    }
}

Java

public static final String MACCHIATO = "Macchiato";

@Test
public void typeTextInInput_clickButton_SubmitsForm() {
    // Create an intent that displays a web form.
    Intent webFormIntent = new Intent();
    // ...

    // Lazily launch the Activity with a custom start Intent per test.
    ActivityScenario.launchActivity(webFormIntent);

    // Selects the WebView in your layout. If you have multiple WebView objects,
    // you can also use a matcher to select a given WebView,
    // onWebView(withId(R.id.web_view)).
    onWebView()
        // Find the input element by ID.
        .withElement(findElement(Locator.ID, "text_input"))

        // Clear previous input and enter new text into the input element.
        .perform(clearElement())
        .perform(DriverAtoms.webKeys(MACCHIATO))

        // Find the "Submit" button and simulate a click using JavaScript.
        .withElement(findElement(Locator.ID, "submitBtn"))
        .perform(webClick())

        // Find the response element by ID, and verify that it contains the
        // entered text.
        .withElement(findElement(Locator.ID, "response"))
        .check(webMatches(getText(), containsString(MACCHIATO)));
}

Tài nguyên khác

Để biết thêm thông tin về cách sử dụng Espresso-Web trong quy trình kiểm thử Android, hãy tham khảo các tài nguyên sau đây.

Mẫu

  • WebBasicSample: Sử dụng Espresso-Web để tương tác với các đối tượng WebView.