एस्प्रेसो वेब

Espresso-Web, Android WebView यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट के साथ काम करने का एंट्री पॉइंट है. Espresso-Web, लोकप्रिय WebDriver API से Atoms का फिर से इस्तेमाल करता है, ताकि 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 ऐटम क्या होता है?

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 के Atoms से जुड़े दस्तावेज़ पढ़ें.

WebView लागू करना

अपने ऐप्लिकेशन की जांचों में WebView का इस्तेमाल करने के लिए, यहां दिए गए दिशा-निर्देशों का पालन करें.

पैकेज

अपने प्रोजेक्ट में Espresso-Web को शामिल करने के लिए, यह तरीका अपनाएं:

  1. अपने ऐप्लिकेशन की build.gradle फ़ाइल खोलें. आम तौर पर, यह टॉप-लेवल की build.gradle फ़ाइल नहीं होती, बल्कि app/build.gradle होती है.
  2. डिपेंडेंसी में यह लाइन जोड़ें:

    Groovy

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

    Kotlin

        androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
        
  3. 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() को जांच के दौरान गतिविधि में कार्रवाई के तौर पर कॉल किया जा सकता है. इसे कोड के इस स्निपेट में दिखाया गया है.

जांच के लिए ज़रूरी सभी इंफ़्रास्ट्रक्चर को लोड कर सके. इसमें JavaScript इंटरैक्शन भी शामिल हैं.
@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: WebView ऑब्जेक्ट के साथ इंटरैक्ट करने के लिए, Espresso-Web का इस्तेमाल करें.