Espresso-Web, Android WebView के यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट के साथ काम करने का एंट्री पॉइंट है. Espresso-Web, लोकप्रिय WebDriver API से मिले ऐटम का फिर से इस्तेमाल करता है. इससे WebView के व्यवहार की जांच की जा सकती है और उसे कंट्रोल किया जा सकता है.
Espresso-Web का इस्तेमाल कब करें
Espresso-Web का इस्तेमाल करके, अपने हाइब्रिड ऐप्लिकेशन की जांच करें. खास तौर पर, अपने ऐप्लिकेशन के नेटिव यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट को WebViewयूआई कॉम्पोनेंट के साथ इंटिग्रेट करने की जांच करें. Espresso-Web API का इस्तेमाल, अन्य Espresso API के साथ किया जा सकता है. इससे WebView ऑब्जेक्ट में मौजूद वेब एलिमेंट के साथ पूरी तरह से इंटरैक्ट किया जा सकता है.
अगर आपको सिर्फ़ WebView की जांच करनी है, न कि आपके ऐप्लिकेशन में WebView और नेटिव कॉम्पोनेंट के बीच होने वाले इंटरैक्शन की, तो WebDriver जैसे फ़्रेमवर्क का इस्तेमाल करके, सामान्य वेब टेस्ट लिखें.WebView अगर वेब टेस्टिंग फ़्रेमवर्क का इस्तेमाल किया जाता है, तो Android डिवाइस या Java वर्चुअल मशीन का इस्तेमाल करने की ज़रूरत नहीं होती. इससे टेस्ट ज़्यादा तेज़ी से और भरोसेमंद तरीके से रन होते हैं. हालांकि, Espresso-Web की मदद से, अपने कस्टम WebDriver ऐटम का फिर से इस्तेमाल किया जा सकता है. इससे आपको काफ़ी सुविधा मिलती है. खास तौर पर, ऐसे टेस्ट लिखते समय जिन्हें आपको स्टैंडअलोन वेब ऐप्लिकेशन और Android यूज़र इंटरफ़ेस (यूआई) वाले ऐप्लिकेशन, दोनों के ख़िलाफ़ चलाना है.
यह कैसे काम करता है
Espresso की onData()
विधि की तरह ही, WebView इंटरैक्शन में कई ऐटम शामिल होते हैं.
WebView इंटरैक्शन, Java प्रोग्रामिंग लैंग्वेज और JavaScript ब्रिज का इस्तेमाल करते हैं. JavaScript एनवायरमेंट से डेटा को ऐक्सेस करने पर, रेस कंडीशन होने की कोई संभावना नहीं होती. ऐसा इसलिए, क्योंकि Java पर आधारित Espresso, हर चीज़ की एक अलग कॉपी देखता है. इसलिए, Web.WebInteraction ऑब्जेक्ट से डेटा वापस पाने की सुविधा पूरी तरह से काम करती है. इससे, अनुरोध से मिले सभी डेटा की पुष्टि की जा सकती है.
WebDriver Atom क्या होता है?
WebDriver फ़्रेमवर्क, वेब एलिमेंट को प्रोग्राम के हिसाब से ढूंढने और उनमें बदलाव करने के लिए, ऐटम का इस्तेमाल करता है. WebDriver, ब्राउज़र में बदलाव करने की अनुमति देने के लिए ऐटम का इस्तेमाल करता है. कॉन्सेप्ट के हिसाब से, ऐटम ViewAction के जैसा होता है. यह एक ऐसी यूनिट होती है जो आपके यूज़र इंटरफ़ेस (यूआई) में कोई कार्रवाई करती है. उपयोगकर्ता के नज़रिए से ब्राउज़र को चलाने के लिए, तय किए गए तरीकों की सूची का इस्तेमाल करके ऐटम दिखाए जाते हैं. जैसे, findElement() और getElement(). हालांकि, WebDriver फ़्रेमवर्क का सीधे तौर पर इस्तेमाल करने पर, ऐटम को सही तरीके से व्यवस्थित करना ज़रूरी होता है. इसके लिए, ऐसे लॉजिक की ज़रूरत होती है जो काफ़ी ज़्यादा जानकारी वाला हो.
Espresso में, Web और Web.WebInteraction क्लास, इस बॉयलरप्लेट को रैप करती हैं. साथ ही, WebView ऑब्जेक्ट के साथ इंटरैक्ट करने पर Espresso जैसा अनुभव देती हैं. इसलिए, WebView के संदर्भ में, Atoms का इस्तेमाल पारंपरिक Espresso ViewMatchers और ViewActions के विकल्प के तौर पर किया जाता है.
इसके बाद, एपीआई का इस्तेमाल करना काफ़ी आसान हो जाता है:
Kotlin
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion)
Java
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion);
ज़्यादा जानने के लिए, Selenium के Atoms से जुड़े दस्तावेज़ पढ़ें.
WebView लागू करना
अपने ऐप्लिकेशन की जांचों में WebView का इस्तेमाल करने के लिए, यहां दिए गए दिशा-निर्देशों का पालन करें.
पैकेज
अपने प्रोजेक्ट में Espresso-Web को शामिल करने के लिए, यह तरीका अपनाएं:
- अपने ऐप्लिकेशन की
build.gradleफ़ाइल खोलें. आम तौर पर, यह टॉप-लेवलbuild.gradleफ़ाइल नहीं होती, बल्किapp/build.gradleहोती है. डिपेंडेंसी में यह लाइन जोड़ें:
Groovy
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 या इसके बाद के वर्शन के साथ काम करता है. इसलिए, पक्का करें कि आपने इन लाइनों को भी अपडेट किया हो:
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')
एपीआई का सामान्य इस्तेमाल
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 ऐसे DOM एलिमेंट का पता लगाता है जिसका आईडी "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 में स्कोप किए गए डीओएम एलिमेंट को रेफ़रंस करता है. यह किसी दूसरे डीओएम एलिमेंट के हिसाब से होता है. आपको सबसे पहलेwithElement()को कॉल करना चाहिए, ताकिWeb.WebInteractionऑब्जेक्ट (DOM एलिमेंट) का रेफ़रंस सेट किया जा सके.उदाहरण:
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()वेबव्यू में कोई कार्रवाई करता है. जैसे, किसी एलिमेंट पर क्लिक करना.उदाहरण:
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();
उदाहरण
इस उदाहरण में यह जांच की जाती है कि वेबव्यू में टेक्स्ट डालने और सबमिट करें बटन चुनने के बाद, क्या वही टेक्स्ट उसी वेबव्यू में मौजूद किसी दूसरे एलिमेंट में दिखता है:
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:
Espresso-Web का इस्तेमाल करके,
WebViewऑब्जेक्ट के साथ इंटरैक्ट करें.