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

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 शामिल करने के लिए, यह तरीका अपनाएं:

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

    शानदार

        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 या इसके बाद के वर्शन के साथ काम करता है. इसलिए, पक्का करें कि आपने इन लाइनों को भी अपडेट किया हो:

    शानदार

        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 का इस्तेमाल करें.