Espresso-Web হলো অ্যান্ড্রয়েড WebView UI কম্পোনেন্টগুলোর সাথে কাজ করার একটি প্রবেশপথ। একটি WebView-এর আচরণ পরীক্ষা ও নিয়ন্ত্রণ করার জন্য Espresso-Web জনপ্রিয় WebDriver API- এর Atom-গুলোকে পুনরায় ব্যবহার করে।
কখন Espresso-Web ব্যবহার করবেন
আপনার হাইব্রিড অ্যাপগুলো পরীক্ষা করতে, বিশেষ করে আপনার অ্যাপের নেটিভ UI কম্পোনেন্টগুলোর সাথে এর WebView UI কম্পোনেন্টগুলোর ইন্টিগ্রেশন পরীক্ষা করতে Espresso-Web ব্যবহার করুন। WebView অবজেক্টের ভেতরের ওয়েব এলিমেন্টগুলোর সাথে সম্পূর্ণরূপে ইন্টারঅ্যাক্ট করার জন্য আপনি অন্যান্য Espresso API-এর সাথে একত্রে Espresso-Web API ব্যবহার করতে পারেন।
যদি আপনার শুধু WebView টিকেই পরীক্ষা করার প্রয়োজন হয় এবং আপনার অ্যাপের নেটিভ কম্পোনেন্টগুলোর সাথে WebView মিথস্ক্রিয়া পরীক্ষা করার প্রয়োজন না হয়, তাহলে WebDriver-এর মতো কোনো ফ্রেমওয়ার্ক ব্যবহার করে একটি সাধারণ ওয়েব টেস্ট লেখার কথা বিবেচনা করতে পারেন। আপনি যদি একটি ওয়েব টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করেন, তাহলে আপনার কোনো অ্যান্ড্রয়েড ডিভাইস বা জাভা ভার্চুয়াল মেশিন ব্যবহার করার প্রয়োজন হয় না, যা আপনার টেস্টগুলোকে আরও দ্রুত এবং নির্ভরযোগ্যভাবে চালাতে সাহায্য করে। তা সত্ত্বেও, Espresso-Web আপনাকে আপনার নিজস্ব WebDriver অ্যাটমগুলো পুনরায় ব্যবহার করার সুযোগ দেয়, যা আপনাকে অনেক সুবিধা দেয়, বিশেষ করে যখন আপনি স্বতন্ত্র ওয়েব অ্যাপ এবং অ্যান্ড্রয়েড UI যুক্ত অ্যাপ—উভয়ের বিরুদ্ধেই টেস্ট চালানোর পরিকল্পনা করেন।
এটি কীভাবে কাজ করে
Espresso-এর onData() মেথডের মতোই, একটি WebView ইন্টারঅ্যাকশন বেশ কয়েকটি Atom নিয়ে গঠিত। WebView ইন্টারঅ্যাকশনগুলো তাদের কাজ করার জন্য জাভা প্রোগ্রামিং ভাষা এবং একটি জাভাস্ক্রিপ্ট ব্রিজের সংমিশ্রণ ব্যবহার করে। যেহেতু জাভাস্ক্রিপ্ট পরিবেশ থেকে ডেটা প্রকাশ করার মাধ্যমে রেস কন্ডিশন তৈরি হওয়ার কোনো সম্ভাবনা নেই—জাভা-ভিত্তিক দিকে Espresso যা কিছু দেখে তা একটি বিচ্ছিন্ন অনুলিপি—তাই Web.WebInteraction অবজেক্ট থেকে ডেটা ফেরত দেওয়া সম্পূর্ণরূপে সমর্থিত, যা আপনাকে একটি অনুরোধ থেকে ফেরত আসা সমস্ত ডেটা যাচাই করার সুযোগ দেয়।
ওয়েবড্রাইভার অ্যাটম কী?
ওয়েবড্রাইভার ফ্রেমওয়ার্ক প্রোগ্রাম্যাটিকভাবে ওয়েব এলিমেন্ট খুঁজে বের করতে এবং সেগুলোকে নিয়ন্ত্রণ করতে অ্যাটম ব্যবহার করে। ব্রাউজার নিয়ন্ত্রণের সুযোগ দেওয়ার জন্য ওয়েবড্রাইভার অ্যাটম ব্যবহার করে। একটি অ্যাটম ধারণাগতভাবে একটি ViewAction অনুরূপ, যা আপনার ইউআই-তে (UI) কোনো কাজ সম্পাদনকারী একটি স্বয়ংসম্পূর্ণ একক। ব্যবহারকারীর দৃষ্টিকোণ থেকে ব্রাউজারকে চালনা করার জন্য, আপনি findElement() এবং getElement() এর মতো কিছু নির্দিষ্ট মেথডের তালিকা ব্যবহার করে অ্যাটমগুলোকে প্রকাশ করেন। তবে, আপনি যদি সরাসরি ওয়েবড্রাইভার ফ্রেমওয়ার্ক ব্যবহার করেন, তাহলে অ্যাটমগুলোকে যথাযথভাবে পরিচালনা করার প্রয়োজন হয়, যার জন্য বেশ বিশদ লজিকের প্রয়োজন হয়।
Espresso-এর মধ্যে, Web এবং Web.WebInteraction ক্লাসগুলো এই বয়লারপ্লেটকে র্যাপ করে এবং WebView অবজেক্টের সাথে ইন্টারঅ্যাক্ট করার ক্ষেত্রে একটি Espresso-সদৃশ অনুভূতি প্রদান করে। তাই একটি WebView এর প্রেক্ষাপটে, প্রচলিত Espresso ViewMatchers এবং ViewActions এর বিকল্প হিসেবে Atoms ব্যবহৃত হয়।
তাহলে এপিআইটি বেশ সহজ মনে হয়:
কোটলিন
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion)
জাভা
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion);
আরও জানতে, সেলেনিয়ামের অ্যাটম সম্পর্কিত ডকুমেন্টেশন পড়ুন।
ওয়েবভিউ বাস্তবায়ন করুন
আপনার অ্যাপের টেস্টগুলোতে WebView নিয়ে কাজ করার জন্য নিচের সেকশনগুলোতে দেখানো নির্দেশনা অনুসরণ করুন।
প্যাকেজ
আপনার প্রোজেক্টে Espresso-Web অন্তর্ভুক্ত করতে, নিম্নলিখিত ধাপগুলো সম্পন্ন করুন:
- আপনার অ্যাপের
build.gradleফাইলটি খুলুন। এটি সাধারণত টপ-লেভেলbuild.gradleফাইল নয়, বরংapp/build.gradle। dependencies-এর ভিতরে নিম্নলিখিত লাইনটি যোগ করুন:
গ্রুভি
androidTestImplementation 'androidx.test.espresso:espresso-web:3.6.1'
কোটলিন
androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
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')
সাধারণ এপিআই ব্যবহার
Espresso ব্যবহার করে Android-এ WebView নিয়ে কাজ করার সময় onWebView() মেথডটি হলো প্রধান এন্ট্রি পয়েন্ট। নিম্নলিখিত Espresso-Web টেস্টগুলো সম্পাদন করার জন্য এই মেথডটি ব্যবহার করা হয়:
কোটলিন
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 "link_2" আইডিযুক্ত একটি DOM এলিমেন্ট খুঁজে বের করে এবং সেটিতে ক্লিক করে। এরপর টুলটি যাচাই করে যে WebView-টি "navigation_2.html" স্ট্রিং সম্বলিত একটি GET রিকোয়েস্ট পাঠিয়েছে।
জাভাস্ক্রিপ্ট সমর্থন
আপনার টেস্টগুলো চালানোর সময়, সিস্টেমটি জাভাস্ক্রিপ্ট ব্যবহার করে সমস্ত ওয়েবভিউ ইন্টারঅ্যাকশন সম্পাদন করে। তাই, জাভাস্ক্রিপ্ট ইভ্যালুয়েশন সমর্থন করার জন্য, পরীক্ষাধীন ওয়েবভিউটিতে অবশ্যই জাভাস্ক্রিপ্ট সক্রিয় থাকতে হবে।
নিম্নলিখিত কোড স্নিপেটে দেখানো অনুযায়ী, আপনার পরীক্ষাধীন অ্যাক্টিভিটিতে একটি অ্যাকশন হিসেবে forceJavascriptEnabled() কল করে আপনি জাভাস্ক্রিপ্টকে জোর করে সক্রিয় করতে পারেন।
@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()ফাংশন WebView-কে তার প্রাথমিক অবস্থায় ফিরিয়ে দেয়। যখন ক্লিকের মতো কোনো পূর্ববর্তী ক্রিয়ার ফলে নেভিগেশনে এমন পরিবর্তন আসে যা 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))); }
অতিরিক্ত সম্পদ
অ্যান্ড্রয়েড টেস্টে Espresso-Web ব্যবহার সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত রিসোর্সগুলো দেখুন।
নমুনা
- WebBasicSample :
WebViewঅবজেক্টগুলোর সাথে ইন্টারঅ্যাক্ট করতে Espresso-Web ব্যবহার করুন।