এসপ্রেসো ওয়েব

এসপ্রেসো-ওয়েব হল অ্যান্ড্রয়েড ওয়েবভিউ ইউআই উপাদানগুলির সাথে কাজ করার একটি এন্ট্রি পয়েন্ট। এসপ্রেসো-ওয়েব একটি ওয়েবভিউয়ের আচরণ পরীক্ষা এবং নিয়ন্ত্রণ করতে জনপ্রিয় ওয়েবড্রাইভার API থেকে পরমাণু পুনঃব্যবহার করে।

কখন এসপ্রেসো-ওয়েব ব্যবহার করবেন

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

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

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

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

ওয়েবড্রাইভার অ্যাটম কী?

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

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

তাহলে API টি বেশ সহজ দেখাচ্ছে:

কোটলিন

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

জাভা

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

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

ওয়েবভিউ বাস্তবায়ন করুন

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

প্যাকেজ

আপনার প্রকল্পে এসপ্রেসো-ওয়েব অন্তর্ভুক্ত করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:

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

    খাঁজকাটা

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

    কোটলিন

        androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
        
  3. এসপ্রেসো-ওয়েব শুধুমাত্র এসপ্রেসো ২.২ বা উচ্চতর সংস্করণ এবং টেস্টিং লাইব্রেরির ০.৩ বা উচ্চতর সংস্করণের সাথে সামঞ্জস্যপূর্ণ, তাই নিশ্চিত করুন যে আপনি এই লাইনগুলিও আপডেট করেছেন:

    খাঁজকাটা

        androidTestImplementation 'androidx.test:runner:1.6.1'
        androidTestImplementation 'androidx.test:rules:1.6.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
        

    কোটলিন

        androidTestImplementation('androidx.test:runner:1.6.1')
        androidTestImplementation('androidx.test:rules:1.6.1')
        androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1')
        

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

অ্যান্ড্রয়েডে এসপ্রেসো ব্যবহার করে ওয়েবভিউয়ের সাথে কাজ করার সময় onWebView() পদ্ধতিটি প্রধান প্রবেশ বিন্দু। আপনি এসপ্রেসো-ওয়েব পরীক্ষাগুলি সম্পাদন করার জন্য এই পদ্ধতিটি ব্যবহার করেন, যেমন নিম্নলিখিত:

কোটলিন

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 উপাদান খুঁজে বের করে যার ID হল "link_2" এবং এটিতে ক্লিক করে। তারপর টুলটি যাচাই করে যে WebView "navigation_2.html" স্ট্রিং ধারণকারী একটি GET অনুরোধ পাঠাচ্ছে।

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

আপনার পরীক্ষাগুলি কার্যকর করার সময়, সিস্টেমটি জাভাস্ক্রিপ্ট ব্যবহার করে সমস্ত ওয়েবভিউ ইন্টারঅ্যাকশন সম্পাদন করে। অতএব, জাভাস্ক্রিপ্ট মূল্যায়ন সমর্থন করার জন্য, পরীক্ষার অধীনে থাকা ওয়েবভিউতে জাভাস্ক্রিপ্ট সক্ষম থাকতে হবে।

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

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

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

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

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

  • withElement() ওয়েবভিউয়ের মধ্যে একটি DOM উপাদান উল্লেখ করে।

    উদাহরণ:

    কোটলিন

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

    জাভা

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

    উদাহরণ:

    কোটলিন

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

    জাভা

    .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"));
  • check() একটি শর্ত মূল্যায়ন করে, নিশ্চিত করে যে এটি true তে সমাধান হয়েছে।

    উদাহরণ:

    কোটলিন

    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 এর মধ্যে একটি ক্রিয়া সম্পাদন করে, যেমন একটি উপাদানের উপর ক্লিক করা।

    উদাহরণ:

    কোটলিন

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

    জাভা

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

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

    উদাহরণ:

    কোটলিন

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

    জাভা

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

উদাহরণ

নিম্নলিখিত উদাহরণটি পরীক্ষা করে যে, একটি WebView-এ টেক্সট প্রবেশ করানোর পরে এবং একটি Submit বোতাম নির্বাচন করার পরে, একই টেক্সট একই WebView-এর একটি ভিন্ন উপাদানের মধ্যে প্রদর্শিত হয় কিনা:

কোটলিন

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

অতিরিক্ত সম্পদ

অ্যান্ড্রয়েড পরীক্ষায় এসপ্রেসো-ওয়েব ব্যবহার সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত সংস্থানগুলি দেখুন।

নমুনা

  • WebBasicSample : WebView অবজেক্টের সাথে ইন্টারঅ্যাক্ট করতে Espresso-Web ব্যবহার করুন।