Espresso Web

Espresso-Web হল Android WebView UI কম্পোনেন্টের সাথে কাজ করার এন্ট্রি পয়েন্ট। Espresso-Web, WebView-এর আচরণ পরীক্ষা ও নিয়ন্ত্রণ করতে জনপ্রিয় WebDriver API থেকে অ্যাটম আবার ব্যবহার করে।

Espresso-Web কখন ব্যবহার করতে হয়

আপনার হাইব্রিড অ্যাপ পরীক্ষা করতে Espresso-Web ব্যবহার করুন, বিশেষ করে আপনার অ্যাপের নেটিভ UI কম্পোনেন্টের সাথে এর WebView UI কম্পোনেন্টের ইন্টিগ্রেশন। WebView অবজেক্টের মধ্যে ওয়েব এলিমেন্টের সাথে সম্পূর্ণভাবে ইন্টার‍্যাক্ট করতে, আপনি অন্যান্য Espresso API-এর সাথে Espresso-Web API ব্যবহার করতে পারবেন।

আপনি যদি শুধু WebView পরীক্ষা করতে চান এবং আপনার অ্যাপে WebView ও নেটিভ কম্পোনেন্টের মধ্যে ইন্টার‍্যাকশন পরীক্ষা করতে না চান, তাহলে WebDriver-এর মতো ফ্রেমওয়ার্ক ব্যবহার করে সাধারণ ওয়েব টেস্ট লেখার কথা বিবেচনা করুন। আপনি যদি কোনও ওয়েব টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করেন, তাহলে আপনাকে কোনও Android ডিভাইস বা Java ভার্চুয়াল মেশিন ব্যবহার করতে হবে না, যা আপনার টেস্টগুলিকে আরও দ্রুত এবং নির্ভরযোগ্যভাবে রান করায়। তবে, Espresso-Web আপনাকে কাস্টম WebDriver অ্যাটম আবার ব্যবহার করার সুবিধা দেয়, যা আপনাকে অনেক নমনীয়তা প্রদান করে, বিশেষ করে যখন আপনি এমন টেস্ট লিখছেন যা স্ট্যান্ডঅ্যালোন ওয়েব অ্যাপ এবং Android UI সহ অ্যাপ, উভয়ের ক্ষেত্রেই রান করার পরিকল্পনা করছেন।

এটি কীভাবে কাজ করে

Espresso-এর onData() পদ্ধতির মতো, WebView ইন্টার‍্যাকশনে একাধিক Atom থাকে। WebView ইন্টার‍্যাকশন জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ ও জাভাস্ক্রিপ্ট ব্রিজের কম্বিনেশন ব্যবহার করে কাজ করে। যেহেতু জাভাস্ক্রিপ্ট এনভায়রনমেন্ট থেকে ডেটা এক্সপোজ করার মাধ্যমে রেস কন্ডিশন তৈরি হওয়ার কোনও সম্ভাবনা নেই—জাভা-ভিত্তিক সাইডে Espresso যা কিছু দেখে তা হল একটি আইসোলেটেড কপি—Web.WebInteraction অবজেক্ট থেকে ডেটা রিটার্ন করার সুবিধা সম্পূর্ণভাবে কাজ করে, যার ফলে আপনি কোনও অনুরোধ থেকে রিটার্ন করা সব ডেটা যাচাই করতে পারবেন।

WebDriver Atom কী?

WebDriver ফ্রেমওয়ার্ক, Atoms ব্যবহার করে ওয়েব এলিমেন্ট খুঁজে বের করে এবং প্রোগ্রাম্যাটিক্যালি সেগুলি ম্যানিপুলেট করে। ব্রাউজার ম্যানিপুলেশনের অনুমতি দিতে WebDriver-এর মাধ্যমে অ্যাটম ব্যবহার করা হয়। Atom ধারণাগতভাবে ViewAction-এর মতো, একটি স্বয়ংসম্পূর্ণ ইউনিট যা আপনার UI-তে একটি অ্যাকশন পারফর্ম করে। ব্যবহারকারীর দৃষ্টিকোণ থেকে ব্রাউজার চালানোর জন্য, আপনি findElement() এবং getElement()-এর মতো নির্দিষ্ট পদ্ধতির তালিকা ব্যবহার করে অ্যাটম এক্সপোজ করেন। তবে, আপনি সরাসরি WebDriver ফ্রেমওয়ার্ক ব্যবহার করলে, Atoms-কে সঠিকভাবে সাজাতে হবে, যার জন্য বেশ বিস্তারিত লজিক প্রয়োজন।

Espresso-র মধ্যে, Web এবং Web.WebInteraction ক্লাসগুলি এই বয়লারপ্লেটকে র‍্যাপ করে এবং WebView অবজেক্টের সাথে ইন্টার‍্যাক্ট করার জন্য Espresso-র মতো অনুভূতি দেয়। তাই WebView-এর প্রসঙ্গে, অ্যাটমকে প্রথাগত Espresso ViewMatchers এবং ViewActions-এর বিকল্প হিসেবে ব্যবহার করা হয়।

তারপর API-কে বেশ সহজ দেখায়:

Kotlin

onWebView()
    .withElement(Atom)
    .perform(Atom)
    .check(WebAssertion)

জাভা

onWebView()
    .withElement(Atom)
    .perform(Atom)
    .check(WebAssertion);

আরও জানতে, Atoms-এ Selenium-এর ডকুমেন্টেশন পড়ুন।

WebView প্রয়োগ করা

আপনার অ্যাপের টেস্টে WebView-এর সাথে কাজ করার জন্য নিম্নলিখিত বিভাগে দেখানো নির্দেশিকা অনুসরণ করুন।

প্যাকেজ

আপনার প্রোজেক্টে Espresso-Web অন্তর্ভুক্ত করতে, নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:

  1. আপনার অ্যাপের build.gradle ফাইল খুলুন। এটি সাধারণত টপ-লেভেল build.gradle ফাইল নয়, app/build.gradle।
  2. ডিপেন্ডেন্সির মধ্যে নিম্নলিখিত লাইন যোগ করুন:

    গ্ৰুভি

        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')
        

সাধারণ API ব্যবহার

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")))

জাভা

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 একটি GET অনুরোধ পাঠায় যাতে "navigation_2.html" স্ট্রিং থাকে।

জাভাস্ক্রিপ্ট সাপোর্ট

আপনার টেস্ট এক্সিকিউট করার সময়, সিস্টেম জাভাস্ক্রিপ্ট ব্যবহার করে সব WebView ইন্টার‍্যাকশন সম্পূর্ণ করে। তাই, জাভাস্ক্রিপ্ট মূল্যায়নকে সাপোর্ট করতে, টেস্ট করা হচ্ছে এমন WebView-তে জাভাস্ক্রিপ্ট চালু থাকতে হবে।

আপনি forceJavascriptEnabled() কল করে জাভাস্ক্রিপ্ট চালু করতে বাধ্য করতে পারেন। এটি পরীক্ষার অধীনে আপনার অ্যাক্টিভিটিতে একটি অ্যাকশন হিসেবে কাজ করে, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে।

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule val activityScenarioRule =
        activityScenarioRule<MyWebViewActivity>()

    @Test fun testWebViewInteraction() {
        onWebView().forceJavascriptEnabled()
    }
}

সাধারণ ওয়েব ইন্টার‍্যাকশন

Web.WebInteraction অবজেক্টের সাথে সাধারণ ইন্টার‌্যাকশনের মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত:

  • withElement() WebView-এর মধ্যে DOM এলিমেন্টকে রেফারেন্স করে।

    উদাহরণ:

    Kotlin

    onWebView().withElement(findElement(Locator.ID, "teacher"))

    জাভা

    onWebView().withElement(findElement(Locator.ID, "teacher"));
  • withContextualElement() অন্য DOM এলিমেন্টের সাপেক্ষে, WebView-এর মধ্যে একটি স্কোপড DOM এলিমেন্টকে রেফারেন্স করে। রেফারেন্স Web.WebInteraction অবজেক্ট (DOM এলিমেন্ট) তৈরি করতে আপনাকে প্রথমে withElement() কল করতে হবে।

    উদাহরণ:

    Kotlin

    .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"))

    জাভা

    .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")))

    জাভা

    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())

    জাভা

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick());
  • reset() WebView-কে তার প্রাথমিক অবস্থায় ফিরিয়ে আনে। এটি তখনই প্রয়োজন হয় যখন আগের কোনও অ্যাকশন, যেমন ক্লিক, নেভিগেশন পরিবর্তন করে যার ফলে ElementReference এবং WindowReference অবজেক্ট অ্যাক্সেস করা যায় না।

    মনে রাখবেন: ফর্ম জমা দেওয়ার মতো মাল্টি-পেজ ওয়ার্কফ্লোর ক্ষেত্রে অ্যাসার্শন করার সময় reset() ব্যবহার করা উপযোগী হলেও, আপনার টেস্ট সাধারণত সীমিত পরিসরে এবং একটি পৃষ্ঠার উপর ফোকাস করে করা উচিত।

    উদাহরণ:

    Kotlin

    onWebView()
        .withElement(...)
        .perform(...)
        .reset()

    জাভা

    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)))
    }
}

জাভা

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 ব্যবহার করুন।