UI Automator Google का एक फ्रेमवर्क है जो Android एप्लिकेशन के स्वचालित UI परीक्षण के लिए है जो सिस्टम स्तर पर काम करता है और एकल एप्लिकेशन से परे इंटरफ़ेस तत्वों के साथ बातचीत कर सकता है। Espresso के विपरीत, UI Automator किसी विशिष्ट एप्लिकेशन की प्रक्रिया से बंधा नहीं है: यह सिस्टम डायलॉग, नोटिफिकेशन शेड खोल सकता है और एप्लिकेशन के बीच स्विच कर सकता है। Google Android Developers के अनुसार, UI Automator डिवाइस के UI ट्री तक पहुँचने के लिए मानक Accessibility Service का उपयोग करता है।
मुख्य बातें
UI Automator Android के कार्यात्मक UI परीक्षण के लिए एक फ्रेमवर्क है जो ऑपरेटिंग सिस्टम स्तर पर काम करता है। यह डिवाइस स्क्रीन पर किसी भी तत्व तक पहुँचने के लिए API प्रदान करता है, भले ही वह किसी भी एप्लिकेशन का हो — जिसमें सिस्टम स्टेटस बार, अनुमति डायलॉग, होम स्क्रीन और तृतीय-पक्ष एप्लिकेशन शामिल हैं। यह इसे एकल एप्लिकेशन से परे जाने वाले परिदृश्यों के परीक्षण के लिए अपरिहार्य बनाता है।
आर्किटेक्चरल रूप से, UI Automator Accessibility Service का उपयोग करता है — वही सेवा जो TalkBack, Switch Access और अन्य एक्सेसिबिलिटी टूल द्वारा उपयोग की जाती है। इस सेवा के माध्यम से, फ्रेमवर्क वर्तमान स्क्रीन का पूरा UI घटक ट्री प्राप्त करता है और उन पर क्रियाएँ करने की अनुमति देता है: टैप करना, स्वाइप करना, टेक्स्ट इनपुट और लॉन्ग प्रेस करना।
UI Automator पहली बार Android 4.3 (API 18) में दिखाई दिया और तब से यह क्रॉस-एप्लिकेशन परीक्षण के लिए Google के आधिकारिक टूल के रूप में Android Testing Support Library का हिस्सा है। AndroidX Test में, यह एक अलग आर्टिफैक्ट androidx.test.uiautomator:uiautomator संस्करण 2.3.0 (2024) के रूप में उपलब्ध है, जो API 18 से सभी Android संस्करणों का समर्थन करता है।
कार्य सिद्धांत: UI Automator वर्तमान स्क्रीन के एक्सेसिबिलिटी ट्री को स्कैन करने पर आधारित है। जब findObject(selector) विधि कॉल की जाती है, तो फ्रेमवर्क View पदानुक्रम को पार करता है, UiSelector शर्तों से मेल खाने वाला पहला तत्व ढूंढता है, और एक UiObject लौटाता है — वास्तविक View के साथ बातचीत करने के लिए एक प्रॉक्सी।
एक सामान्य UI Automator परीक्षण UiDevice इंस्टेंस प्राप्त करके शुरू होता है, जो भौतिक डिवाइस का प्रतिनिधित्व करता है। UiDevice तत्वों को खोजने, बटन प्रेस (होम, बैक, रीसेंट) प्रबंधित करने, स्क्रीन घुमाने और स्क्रीनशॉट लेने के तरीके प्रदान करता है। UiSelector के माध्यम से एक तत्व खोजने के बाद, UiObject पर क्रियाएँ की जाती हैं।
नीचे दिए गए उदाहरण में, परीक्षण Settings एप्लिकेशन खोलता है, टेक्स्ट द्वारा “बैटरी” आइटम ढूंढता है और उसे टैप करता है। UI Automator को Activity लॉन्च करने की आवश्यकता नहीं है — यह डिवाइस पर किसी भी स्क्रीन के साथ काम करता है, जिसमें तृतीय-पक्ष एप्लिकेशन शामिल हैं।
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
// सेटिंग्स स्क्रीन खोलें
device.pressHome()
device.wait(Until.hasObject(UiSelector().text("सेटिंग्स")), 2000)
// "बैटरी" आइटम ढूंढें और टैप करें
val batteryItem = device.findObject(
UiSelector().text("बैटरी")
)
batteryItem.clickAndWait(Until.newWindow(), 3000)
UiDevice डिवाइस के साथ बातचीत करने के लिए मुख्य क्लास है। यह तत्वों को खोजने, हार्डवेयर बटन प्रेस (होम, बैक, मेनू, वॉल्यूम) का अनुकरण करने, पावर प्रबंधित करने, स्क्रीनशॉट लेने और विशिष्ट स्क्रीन स्थितियों की प्रतीक्षा करने के तरीके प्रदान करता है। UiDevice प्रति परीक्षण एक बार बनाया जाता है और सभी संचालन के लिए पुनः उपयोग किया जाता है।
UiSelector UI तत्वों को खोजने के लिए एक फ़्लूएंट API है। Espresso ViewMatchers के विपरीत, UiSelector को संकलन की आवश्यकता नहीं है — खोज शर्तें विधियों की एक श्रृंखला के माध्यम से बनती हैं: text(), className(), description(), resourceId(), index()। कई शर्तें तार्किक AND के माध्यम से स्वचालित रूप से संयोजित होती हैं।
| UiSelector विधि | उद्देश्य |
|---|---|
| text(String) | सटीक तत्व टेक्स्ट द्वारा खोज |
| textContains(String) | आंशिक टेक्स्ट मिलान द्वारा खोज |
| resourceId(String) | संसाधन ID द्वारा खोज (जैसे, com.example:id/button) |
| className(String) | View क्लास नाम द्वारा खोज |
| description(String) | content-description द्वारा खोज |
| childSelector(selector) | कंटेनर के अंदर चाइल्ड तत्व खोजें |
जब स्क्रीन पर एक ही टेक्स्ट वाले कई तत्व होते हैं, तो UiSelector मानदंडों को संयोजित करने की अनुमति देता है: ID द्वारा एक कंटेनर खोजें, फिर उसके अंदर — टेक्स्ट और क्लास द्वारा एक तत्व। यह वांछित घटक की अद्वितीय पहचान सुनिश्चित करता है। childSelector विधि खोज के दायरे को एक निर्दिष्ट कंटेनर तक सीमित करती है, UI ट्री में नेविगेशन को गति देती है।
val scrollView = device.findObject(
UiSelector().resourceId("android:id/list")
)
// सूची के अंदर, "Wi-Fi" टेक्स्ट वाला तत्व ढूंढें
val wifiItem = scrollView.findObject(
UiSelector().text("Wi-Fi")
wifiItem.click()
क्रॉस-एप्लिकेशन (अंतर-एप्लिकेशन) परीक्षण मुख्य विशेषता है जिसके लिए UI Automator को चुना जाता है। फ्रेमवर्क एप्लिकेशन के बीच स्विच कर सकता है, ब्राउज़र के माध्यम से OAuth लॉगिन का परीक्षण कर सकता है, सिस्टम डायलॉग (अनुमतियाँ, एप्लिकेशन चयनकर्ता) की जाँच कर सकता है और सिस्टम स्टेटस बार, नोटिफिकेशन पैनल और लॉक स्क्रीन के साथ बातचीत कर सकता है।
एक सामान्य क्रॉस-एप्लिकेशन परीक्षण परिदृश्य: एप्लिकेशन OAuth प्राधिकरण के लिए एक ब्राउज़र खोलता है, उपयोगकर्ता अपना लॉगिन और पासवर्ड दर्ज करता है, और ब्राउज़र वापस एप्लिकेशन पर रीडायरेक्ट करता है। UI Automator प्रक्रियाओं के बीच स्विच करता है, ब्राउज़र में इनपुट फ़ील्ड ढूंढता है, उन्हें भरता है और “साइन इन” पर टैप करता है।
// ब्राउज़र के प्रकट होने की प्रतीक्षा
device.wait(Until.hasObject(
UiSelector().packageName("com.android.chrome")
), 5000)
// ब्राउज़र में ईमेल इनपुट फ़ील्ड खोजना
val emailField = device.findObject(
UiSelector().className("android.widget.EditText").instance(0)
)
emailField.text = "user@example.com"
UI Automator सिस्टम डायलॉग की जाँच और बंद कर सकता है — स्थान अनुमतियाँ, सूचनाएँ, फ़ाइल एक्सेस। यह पहले लॉन्च परिदृश्यों के परीक्षण के लिए महत्वपूर्ण है जब सिस्टम क्रमिक रूप से कई अनुमतियों का अनुरोध करता है। UI Automator के बिना, ऐसे परिदृश्यों को स्वचालित नहीं किया जा सकता क्योंकि सिस्टम डायलॉग एप्लिकेशन की प्रक्रिया से संबंधित नहीं हैं।
चुनाव UI Automator और Espresso के बीच परीक्षण परिदृश्य पर निर्भर करता है। Espresso स्वचालित सिंक्रोनाइज़ेशन और न्यूनतम बॉयलरप्लेट के साथ एकल एप्लिकेशन के परीक्षण के लिए अनुकूलित है। UI Automator उन परिदृश्यों के लिए उपयुक्त है जहाँ आपको सिस्टम, ब्राउज़र या कई एप्लिकेशन के साथ बातचीत करने की आवश्यकता होती है।
| मानदंड | UI Automator | Espresso |
|---|---|---|
| दायरा | पूरा डिवाइस, कई एप्लिकेशन | एकल एप्लिकेशन |
| सिंक्रोनाइज़ेशन | मैनुअल (प्रतीक्षा, स्लीप) | स्वचालित (Idling Resource) |
| गति | धीमा (सेवा के माध्यम से पहुँच) | तेज़ (प्रक्रिया के अंदर काम करता है) |
| सिस्टम UI | समर्थन करता है (सूचनाएँ, त्वरित सेटिंग्स) | समर्थन नहीं करता |
| खोज सटीकता | विशेषताओं द्वारा UiSelector | प्रकार और पदानुक्रम द्वारा ViewMatchers |
| स्थिरता | कम (समय पर निर्भर) | अधिक (स्वचालित प्रतीक्षा) |
व्यवहार में, इन फ्रेमवर्क का उपयोग अक्सर एक साथ किया जाता है: Espresso उच्च स्थिरता के साथ मुख्य एप्लिकेशन के UI परीक्षणों को कवर करता है, जबकि UI Automator का उपयोग उन परिदृश्यों के लिए किया जाता है जो एप्लिकेशन की सीमाओं से परे जाते हैं — OAuth लॉगिन, सिस्टम अनुमतियाँ, Share Intent के साथ काम करना। यह संयोजन न्यूनतम परीक्षण रखरखाव लागत के साथ अधिकतम UI कवरेज प्रदान करता है।
एकीकरण UI Automator का build.gradle में निर्भरता जोड़कर किया जाता है। फ्रेमवर्क AndroidX Test का हिस्सा है और मेनिफेस्ट में अतिरिक्त अनुमतियों की आवश्यकता नहीं है — इंस्ट्रुमेंटेड टेस्ट लॉन्च होने पर Accessibility Service तक पहुँच स्वचालित रूप से कॉन्फ़िगर होती है।
न्यूनतम कॉन्फ़िगरेशन में uiautomator आर्टिफैक्ट और मानक AndroidJUnitRunner टेस्ट रनर शामिल है। UI Automator परीक्षण src/androidTest निर्देशिका में रखे जाते हैं और Android API 18+ चलाने वाले एमुलेटर या भौतिक डिवाइस पर चलाए जाते हैं।
dependencies {
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
androidTestImplementation("androidx.test:runner:1.6.1")
}
UiDevice इंस्टेंस प्राप्त करने के लिए InstrumentationRegistry.getInstrumentation() का उपयोग किया जाता है। UiDevice को setUp() विधि में एक बार बनाया जाना चाहिए और डिवाइस संसाधनों को संरक्षित करने के लिए क्लास के सभी परीक्षणों में पुनः उपयोग किया जाना चाहिए। यह ध्यान रखना महत्वपूर्ण है कि UiDevice थ्रेड-सेफ नहीं है — सभी संचालन परीक्षण विधि के समान थ्रेड में किए जाने चाहिए। प्रत्येक परीक्षण में नया UiDevice बनाने से ओवरहेड होता है और निष्पादन धीमा हो जाता है। यह अनुशंसा की जाती है कि beforeClass विधि में एक बार UiDevice बनाएं और परीक्षण क्लास के सभी परीक्षणों के लिए इसका पुनः उपयोग करें।
Espresso के विपरीत, UI Automator में स्वचालित सिंक्रोनाइज़ेशन नहीं है। तत्वों के प्रकट होने की प्रतीक्षा करने के लिए UiDevice.wait(condition, timeout) विधि का उपयोग Until ऑब्जेक्ट के साथ किया जाता है: Until.findObject(selector), Until.hasObject(selector), Until.gone(selector)। उचित प्रतीक्षा के बिना, रेस कंडीशन के कारण परीक्षण अस्थिर हो जाते हैं — खोज के समय तक कोई तत्व स्क्रीन पर प्रकट नहीं हुआ हो सकता है। स्थिरता के लिए कम से कम 3–5 सेकंड का टाइमआउट सेट करने की अनुशंसा की जाती है।
अक्सर पूछे जाने वाले प्रश्न
UI Automator Accessibility Service स्तर पर काम करता है और किसी भी एप्लिकेशन के साथ बातचीत कर सकता है। Espresso एकल एप्लिकेशन की प्रक्रिया के अंदर काम करता है और UI थ्रेड के साथ स्वचालित सिंक्रोनाइज़ेशन का उपयोग करता है। UI Automator क्रॉस-एप्लिकेशन परिदृश्यों के लिए बेहतर है, जबकि Espresso स्थिर एकल-एप्लिकेशन परीक्षणों के लिए बेहतर है।
हाँ, UI Automator Android API 18+ चलाने वाले सभी डिवाइसों पर काम करता है। इसे रूट एक्सेस की आवश्यकता नहीं है — यह मानक Accessibility Service का उपयोग करता है, जो परीक्षण चलाने पर Instrumentation के माध्यम से सक्रिय होता है।
UI Automator वर्तमान स्क्रीन का पूरा UI घटक ट्री प्राप्त करने के लिए Accessibility Service का उपयोग करता है। फिर UiSelector इस ट्री को पार करता है और निर्दिष्ट मानदंडों: टेक्स्ट, क्लास, ID, content-description या उनके संयोजन द्वारा तत्व ढूंढता है।
हाँ, UiDevice.takeScreenshot(storePath) विधि वर्तमान स्क्रीन का स्क्रीनशॉट लेने और फ़ाइल में सहेजने की अनुमति देती है। यह डीबगिंग के लिए उपयोगी है: जब कोई परीक्षण विफल होता है, तो आप स्क्रीनशॉट सहेज सकते हैं और स्क्रीन स्थिति का विश्लेषण कर सकते हैं।
UI Automator में स्वचालित सिंक्रोनाइज़ेशन नहीं है, इसलिए परीक्षण समय के प्रति संवेदनशील होते हैं। यदि कोई एनिमेशन पूरा नहीं हुआ है या View अभी तक रेंडर नहीं हुआ है, तो findObject तत्व नहीं ढूंढ सकता है। समाधान पर्याप्त टाइमआउट के साथ UiDevice.wait() का उपयोग करना है।
सारांश
UI Automator टूलसेट सभी प्रमुख क्रॉस-एप्लिकेशन परीक्षण परिदृश्यों को कवर करता है और सिस्टम स्तर पर Android ऑटोमेशन के लिए मानक है।
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें