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()
và 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 Web
và Web.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 ViewMatchers
và ViewActions
.
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:
- Mở tệp
build.gradle
của ứng dụng. Đây thường không phải là tệpbuild.gradle
cấp cao nhất nhưngapp/build.gradle
. 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')
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ọiwithElement()
trước tiên để thiết lập tham chiếu Đối tượngWeb.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 đếntrue
.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
.