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

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

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

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

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

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

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

একটি WebDriver পরমাণু কি?

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

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

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

কোটলিন

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

জাভা

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

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

WebView বাস্তবায়ন করুন

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

প্যাকেজ

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

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

    কোটলিন

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

জাভাস্ক্রিপ্ট সমর্থন

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

আপনি নিম্নলিখিত কোড স্নিপেটে দেখানো হিসাবে, পরীক্ষার অধীনে আপনার কার্যকলাপে একটি ক্রিয়া হিসাবে forceJavascriptEnabled() কল করে JavaScript সক্রিয় করতে বাধ্য করতে পারেন৷

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

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

সাধারণ ওয়েব মিথস্ক্রিয়া

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

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

    উদাহরণ:

    কোটলিন

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

    জাভা

    onWebView().withElement(findElement(Locator.ID, "teacher"));
    
  • withContextualElement() WebView এর মধ্যে একটি স্কোপড 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-এ পাঠ্য প্রবেশ করান এবং একটি জমা বোতাম নির্বাচন করার পরে, একই পাঠ্য একই 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 ব্যবহার করুন।