Espresso-Web, Android WebView यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट के साथ काम करने का एक एंट्री पॉइंट है. Espresso-Web, WebView के व्यवहार की जांच करने और उसे कंट्रोल करने के लिए, लोकप्रिय WebDriver API से एटम का फिर से इस्तेमाल करता है.
Espresso-Web का इस्तेमाल कब करें
Espresso-Web का इस्तेमाल, अपने हाइब्रिड ऐप्लिकेशन की जांच करने के लिए करें. खास तौर पर, अपने ऐप्लिकेशन के नेटिव यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट को उसके WebView यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट के साथ इंटिग्रेट करने की जांच करने के लिए. WebView ऑब्जेक्ट में मौजूद वेब एलिमेंट के साथ पूरी तरह से इंटरैक्ट करने के लिए, Espresso-Web API के साथ-साथ अन्य Espresso API का इस्तेमाल किया जा सकता है.
अगर आपको सिर्फ़ WebView की जांच करनी है और अपने ऐप्लिकेशन में WebView और नेटिव कॉम्पोनेंट के बीच होने वाले इंटरैक्शन की जांच नहीं करनी है, तो WebDriver जैसे फ़्रेमवर्क का इस्तेमाल करके, वेब की सामान्य जांच करने के बारे में सोचें. अगर वेब की जांच करने वाले फ़्रेमवर्क का इस्तेमाल किया जाता है, तो Android डिवाइस या Java वर्चुअल मशीन का इस्तेमाल करने की ज़रूरत नहीं होती. इससे, आपकी जांचें ज़्यादा तेज़ी से और भरोसेमंद तरीके से पूरी होती हैं. हालांकि, Espresso-Web की मदद से, WebDriver के कस्टम एटम का फिर से इस्तेमाल किया जा सकता है. इससे आपको काफ़ी फ़्लेक्सिबिलिटी मिलती है. खास तौर पर, ऐसी जांचें लिखते समय जिन्हें स्टैंडअलोन वेब ऐप्लिकेशन और Android यूज़र इंटरफ़ेस (यूआई) वाले ऐप्लिकेशन, दोनों के ख़िलाफ़ चलाना है.
यह कैसे काम करता है
Espresso के onData()
तरीके की तरह, एक WebView इंटरैक्शन में कई एटम शामिल होते हैं.
WebView इंटरैक्शन, अपना काम करने के लिए Java प्रोग्रामिंग लैंग्वेज और
JavaScript ब्रिज के कॉम्बिनेशन का इस्तेमाल करते हैं. JavaScript एनवायरमेंट से डेटा दिखाने पर, रेस कंडीशन होने की कोई संभावना नहीं होती. इसकी वजह यह है कि Java पर आधारित साइड पर Espresso को दिखने वाला हर डेटा, अलग कॉपी होती है. इसलिए, Web.WebInteractionऑब्जेक्ट से डेटा वापस करने की सुविधा पूरी तरह से काम करती है. इससे, अनुरोध से वापस किए गए सभी डेटा की पुष्टि की जा सकती है.
WebDriver एटम क्या है?
WebDriver फ़्रेमवर्क, वेब एलिमेंट को प्रोग्राम के ज़रिए ढूंढने और उनमें बदलाव करने के लिए, एटम का इस्तेमाल करता है. WebDriver, ब्राउज़र में बदलाव करने की अनुमति देने के लिए, एटम का इस्तेमाल करता है. एटम, कॉन्सेप्ट के तौर पर
ViewAction जैसा होता है. यह एक ऐसी
यूनिट है जो आपके यूज़र इंटरफ़ेस (यूआई) में कोई कार्रवाई करती है. उपयोगकर्ता के नज़रिए से ब्राउज़र को चलाने के लिए, findElement() और getElement() जैसे तय किए गए तरीकों की सूची का इस्तेमाल करके, एटम दिखाए जाते हैं. हालांकि, अगर WebDriver फ़्रेमवर्क का सीधे तौर पर इस्तेमाल किया जाता है, तो एटम को सही तरीके से व्यवस्थित करना ज़रूरी है. इसके लिए, काफ़ी लॉजिक की ज़रूरत होती है.
Espresso में, Web
और Web.WebInteraction
क्लास, इस बॉयलरप्लेट को रैप करती हैं. साथ ही, WebView
ऑब्जेक्ट के साथ इंटरैक्ट करने पर, Espresso जैसा अनुभव देती हैं. इसलिए, WebView के संदर्भ में, एटम का इस्तेमाल, पारंपरिक Espresso ViewMatchers और ViewActions के विकल्प के तौर पर किया जाता है.
इसके बाद, एपीआई काफ़ी आसान दिखता है:
Kotlin
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion)
Java
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion);
ज़्यादा जानने के लिए, एटम के बारे में Selenium का दस्तावेज़ पढ़ें.
WebView लागू करें
अपने ऐप्लिकेशन की जांचों में
WebView के साथ काम करने के लिए, यहां दिए गए निर्देशों का पालन करें.
पैकेज
अपने प्रोजेक्ट में Espresso-Web शामिल करने के लिए, यह तरीका अपनाएं:
- अपने ऐप्लिकेशन की
build.gradleफ़ाइल खोलें. आम तौर पर, यह टॉप-लेवल कीbuild.gradleफ़ाइल नहीं होती, बल्किapp/build.gradleहोती है. dependencies में यह लाइन जोड़ें:
शानदार
androidTestImplementation 'androidx.test.espresso:espresso-web:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
Espresso-Web, सिर्फ़ Espresso 2.2 या इसके बाद के वर्शन और जांच लाइब्रेरी के 0.3 या इसके बाद के वर्शन के साथ काम करता है. इसलिए, पक्का करें कि आपने इन लाइनों को भी अपडेट किया हो:
शानदार
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')
एपीआई का सामान्य इस्तेमाल
Espresso का इस्तेमाल करके, Android पर WebView के साथ काम करते समय, onWebView()
तरीका मुख्य एंट्री पॉइंट होता है. Espresso-Web की जांचें करने के लिए, इस तरीके का इस्तेमाल किया जाता है. जैसे, यहां दी गई जांचें:
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")));
इस उदाहरण में, Espresso-Web, "link_2" आईडी वाले डीओएम एलिमेंट को ढूंढता है और
उस पर क्लिक करता है. इसके बाद, टूल पुष्टि करता है कि WebView, "navigation_2.html" स्ट्रिंग वाला GET अनुरोध भेजता है.
JavaScript के साथ काम करने की सुविधा
आपकी जांचें पूरी करते समय, सिस्टम JavaScript का इस्तेमाल करके, WebView के सभी इंटरैक्शन करता है. इसलिए, JavaScript के आकलन के साथ काम करने के लिए, जांच के दायरे में आने वाले WebView में JavaScript चालू होनी चाहिए.
जांच के दायरे में आने वाली अपनी गतिविधि में, JavaScript को चालू किया जा सकता है. जैसा कि यहां दिए गए कोड स्निपेट में दिखाया गया है.forceJavascriptEnabled()
@RunWith(AndroidJUnit4::class) class MyTestSuite { @get:Rule val activityScenarioRule = activityScenarioRule<MyWebViewActivity>() @Test fun testWebViewInteraction() { onWebView().forceJavascriptEnabled() } }
वेब के सामान्य इंटरैक्शन
Web.WebInteraction ऑब्जेक्ट के साथ सामान्य इंटरैक्शन में ये शामिल हैं:
-
withElement(), WebView में मौजूद डीओएम एलिमेंट को रेफ़र करता है.उदाहरण:
Kotlin
onWebView().withElement(findElement(Locator.ID, "teacher"))
Java
onWebView().withElement(findElement(Locator.ID, "teacher"));
-
withContextualElement(), WebView में स्कोप्ड डीओएम एलिमेंट को रेफ़र करता है. यह किसी दूसरे डीओएम एलिमेंट के मुकाबले होता है. रेफ़रंसWeb.WebInteractionऑब्जेक्ट (डीओएम एलिमेंट) बनाने के लिए, आपको सबसे पहलेwithElement()को कॉल करना चाहिए.उदाहरण:
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(), किसी शर्त का आकलन करता है. साथ ही, यह पक्का करता है कि वहtrueपर रिज़ॉल्व हो.उदाहरण:
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(), WebView में कोई कार्रवाई करता है. जैसे, किसी एलिमेंट पर क्लिक करना.उदाहरण:
Kotlin
onWebView() .withElement(findElement(Locator.ID, "teacher")) .perform(webClick())
Java
onWebView() .withElement(findElement(Locator.ID, "teacher")) .perform(webClick());
-
reset(), WebView को उसकी शुरुआती स्थिति में वापस ले जाता है. यह तब ज़रूरी होता है, जब किसी पिछली कार्रवाई, जैसे कि क्लिक करने पर, नेविगेशन में बदलाव होता है. इससे, ElementReference और WindowReference ऑब्जेक्ट को ऐक्सेस नहीं किया जा सकता.ध्यान दें: मल्टी-पेज वर्कफ़्लो के ख़िलाफ़ दावे करते समय,
reset()का इस्तेमाल करना काम का होता है. जैसे, फ़ॉर्म सबमिट करना. हालांकि, आपकी जांचों का दायरा आम तौर पर सीमित होना चाहिए और उनका फ़ोकस किसी एक पेज पर होना चाहिए.उदाहरण:
Kotlin
onWebView() .withElement(...) .perform(...) .reset()
Java
onWebView() .withElement(...) .perform(...) .reset();
उदाहरण
यहां दिए गए उदाहरण में, यह जांच की जाती है कि WebView में टेक्स्ट डालने और सबमिट करें बटन चुनने के बाद, वही टेक्स्ट, उसी 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))); }
अन्य संसाधन
Android की जांचों में Espresso-Web का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, यहां दिए गए संसाधन देखें.
सैंपल
- WebBasicSample:
WebViewऑब्जेक्ट के साथ इंटरैक्ट करने के लिए, Espresso-Web का इस्तेमाल करें.