Appium वांछित क्षमताएं Android एमुलेटर

⚡ स्मार्ट सारांश

वांछित क्षमताएं प्रमुख-मूल्य युग्म हैं। Appium क्लाइंट सेशन शुरू करते समय एक संदेश भेजता है, जिसमें सर्वर को बताया जाता है कि स्वचालित परीक्षण किस प्लेटफॉर्म, डिवाइस, ड्राइवर और एप्लिकेशन के विरुद्ध चलाया जाना चाहिए।

  • 🔴 सत्र कॉनtract: क्षमताएं नए सत्र के अनुरोध के JSON बॉडी में स्थानांतरित होती हैं और बाद में उन्हें बदला नहीं जा सकता है।
  • ️ Android आवश्यक वस्तुएँ: appPackage और appActivity क्रमशः एप्लिकेशन और स्क्रीन का नाम देते हैं। Appium लॉन्च करना चाहिए.
  • ✅ प्रतीक्षा के प्रकार: appWaitPackage और appWaitActivity उन स्प्लैश स्क्रीन को कवर करते हैं जो वास्तविक प्रवेश बिंदु से पहले दिखाई देती हैं।
  • 🧪 Appium 2 उपसर्ग: अब हर गैर-मानक क्षमता के लिए appium: vendor उपसर्ग की आवश्यकता होती है, अन्यथा सर्वर इसे अस्वीकार कर देता है।
  • ️ आधुनिक Java ग्राहक: DesiredCapabilities की जगह UiAutomator2Options और XCUITestOptions ने ले ली। Selenium 4.
  • 📊 मान ज्ञात करना: adb dumpsys क्वेरी या PackageManager क्लास पैकेज और गतिविधि के नाम प्रकट करती है।

Appium वांछित क्षमताओं के लिए कुंजी-मूल्य युग्म Android एमुलेटर सत्र

वांछित क्षमताएं क्या हैं?

'वांछित क्षमताएं' हमें स्वचालन के दौरान सर्वर के व्यवहार को संशोधित करने में मदद करती हैं। Appium यह एक हैशमैप या कुंजी-मान युग्म है, जिसका उपयोग किसी कमांड को भेजने के लिए किया जाता है। Appium सर्वर, जहां प्रत्येक क्लाइंट कमांड एक सत्र के संदर्भ में चलता है।

उदाहरण के लिए, एक क्लाइंट JSON ऑब्जेक्ट युक्त POST /session अनुरोध भेजता है। Appium सर्वर.

इसलिए, सर्वर के साथ अनुरोध भेजने या सत्र बनाए रखने के लिए, कुंजी और मान युग्मों के एक समूह का उपयोग किया जाता है। इसे 'वांछित क्षमताएं' कहा जाता है।

import io.appium.java_client.AppiumDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
{
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("deviceName","Android Emulator");
        capabilities.setCapability("platformVersion", "4.4");
}

वांछित क्षमता की महत्वपूर्ण भूमिका

  • 'DesiredCapabilities' उपयोगकर्ता को सर्वर के साथ सत्र अनुरोध को नियंत्रित करने में मदद करती हैं। उदाहरण के लिए, iOS सत्र के लिए हम platformName = iOS क्षमता सेट करते हैं, और एक अन्य सत्र के लिए Android सत्र platformName = Android.
  • 'DesiredCapabilities' का उपयोग WebDriver इंस्टेंस को सेट अप करने के लिए किया जाता है, उदाहरण के लिए Firefoxड्राइवर, क्रोम ड्राइवर या इंटरनेट एक्सप्लोरर ड्राइवर।
  • DesiredCapability बहुत उपयोगी है Selenium ग्रिड। उदाहरण के लिए, इसका उपयोग विभिन्न ब्राउज़रों और विभिन्न ऑपरेटिंग सिस्टमों पर अलग-अलग परीक्षण मामलों को चलाने के लिए किया जाता है। बताई गई क्षमता के आधार पर, ग्रिड हब संबंधित नोड को इंगित करता है। नोड्स को 'सेट' प्रॉपर्टी विधियों का उपयोग करके परिभाषित किया जाता है:
    DesiredCapabilities obj = new DesiredCapabilities(); 
    obj.setBrowserName("firefox"); 
    obj.setVersion("18.0.1"); 
    obj.setPlatform(org.openqa.selenium.Platform.WINDOWS);					
    
  • वांछित क्षमता एक लाइब्रेरी-परिभाषित पैकेज है। 'DesiredCapabilities' का उपयोग करने से पहले, इसे नीचे दी गई लाइब्रेरी से आयात किया जाना चाहिए।
    Org.openqa.selenium.remote.DesiredCapabilities

Appium दोनों का समर्थन करता है Android और iOS, इसलिए एक अलग सेट है Appium प्रत्येक प्लेटफ़ॉर्म के लिए सर्वर क्षमताएँ।

नीचे दी गई तालिका में कुछ सामान्य रूप से उपयोग किए जाने वाले उदाहरण दिखाए गए हैं। Android क्षमताओं और उपयोग किए जाने वाले मूल्यों का निर्धारण।

क्षमताओं विवरण मूल्य/उपयोग
ऐप पैकेज वांछित को कॉल करें Java पैकेज में Android जिसे उपयोगकर्ता चलाना चाहता है

मान= com.example.myapp/

Obj.setCapability(“appPackage”, “com.whatsapp”);

ऐपएक्टिविटी वह एप्लिकेशन गतिविधि जिसे उपयोगकर्ता पैकेज से लॉन्च करना चाहता है।

मान= MainActivity, .सेटिंग्स

Obj.setCapability(“appActivity”, “com.whatsapp.Main”);

ऐपवेटपैकेज वह पैकेज जिसके लिए एप्लिकेशन को प्रतीक्षा करनी होगी मान=com.example.android.myapp
ऐपप्रतीक्षागतिविधि कोई Android वह गतिविधि जिसके लिए उपयोगकर्ता को प्रतीक्षा करनी होगी

मान= स्प्लैशएक्टिविटी

क्षमताएँ.setCapability(“appWaitActivity”, “com.example.game.SplashActivity”)

नोट: कृपया देखें Appium दस्तावेज़ीकरण और अधिक देखने के लिए Android क्षमताओं.

नीचे दी गई तालिका में iOS की कुछ सामान्य रूप से उपयोग की जाने वाली क्षमताएं और उनके उपयोग के लिए मान दर्शाए गए हैं।

क्षमताओं विवरण मान
लॉन्चटाइमआउट उपकरण के लिए प्रतीक्षा करने हेतु कुल समय (एमएस में)। 2000
तुमने किया किसी कनेक्टेड भौतिक डिवाइस की विशिष्ट डिवाइस संख्या की पहचान करने के लिए 166aestu4

नोट: कृपया देखें Appium क्षमता मार्गदर्शिका iOS की और अधिक क्षमताओं को देखने के लिए।

वांछित क्षमताओं में किस प्रकार परिवर्तन आया Appium 2

ऊपर दिए गए उदाहरण निम्नलिखित से लिए गए हैं: Appium एक युग अभी भी क्षमता समूह का आकार दिखाता है, लेकिन दो नियम बदल गए हैं और दोनों ही आधुनिक सत्र को शुरू होने से रोकेंगे।

सबसे पहले, W3C वेबड्राइवर विनिर्देश केवल कुछ ही मानक क्षमताओं को परिभाषित करता है, जिनमें से platformName और browserName यहां ध्यान देने वाली बात यह है कि अन्य सभी क्षमताएं विक्रेता द्वारा विस्तारित की गई हैं और उनमें एक कॉलन पर समाप्त होने वाला नेमस्पेस उपसर्ग होना चाहिए। Appium's उपसर्ग है appium:. इतना deviceName हो जाता है appium:deviceName और platformVersion हो जाता है appium:platformVersion. Appium 2 की भी आवश्यकता है appium:automationNameक्योंकि ड्राइवर सर्वर के साथ बंडल होने के बजाय अलग से इंस्टॉल किए जाते हैं।

दूसरा, उपसर्ग को दोहराना थकाऊ हो जाता है, इसलिए Appium एकल स्वीकार करता है appium:options एक ऐसी क्षमता जिसका मान एक ऑब्जेक्ट है। उस ऑब्जेक्ट के भीतर की क्षमताओं को किसी उपसर्ग की आवश्यकता नहीं होती है, और जहां ऑब्जेक्ट के अंदर और बाहर दोनों जगह नाम दिखाई देता है, वहां आंतरिक मान मान्य होता है।

{
    "platformName": "iOS",
    "appium:options": {
        "automationName": "XCUITest",
        "platformVersion": "16.0",
        "app": "/path/to/your.app",
        "deviceName": "आईफोन 12",
        "noReset": true
    }
}

⚠️ संस्करण नोट: पर Java पक्ष, Selenium 4 और Appium Java क्लाइंट 8 ने इसे अप्रचलित कर दिया DesiredCapabilities पहले दिखाई गई क्लास। ड्राइवर-विशिष्ट बिल्डर्स से विरासत में प्राप्त। BaseOptions इसे बदल दें — UiAutomator2Options एसटी Android और XCUITestOptions iOS के लिए — एक-से-एक मानचित्र के साथping प्रत्येक पुराने से setCapability कॉल। ऊपर दिया गया मूल कोड ऐतिहासिक उदाहरण के रूप में यहां रखा गया है।

Extracपैकेज और गतिविधियों की जानकारी

पैकेज बंडल की गई फाइलें या क्लास होती हैं। वे मॉड्यूलर प्रोग्रामिंग को एक संगठित संरचना प्रदान करते हैं। Javaविभिन्न पैकेजों को एक ही JAR फ़ाइल में संग्रहित किया जाता है, और उपयोगकर्ता पूर्ण निष्पादन के लिए उस JAR को कॉल कर सकता है। मोबाइल एप्लिकेशन विकास में भी इसी तरह की अवधारणा का पालन किया जाता है।

में Android ऑपरेटिंग सिस्टम में, सभी एप्लिकेशन इस रूप में स्थापित होते हैं: Java पैकेज। तो, पूर्व के लिएtracटी पैकेज पथ जानकारी, Android पैकेज मैनेजर वर्ग का उपयोग किया जाता है।

यह डिवाइस पर पहले से इंस्टॉल किए गए और बाद में इंस्टॉल किए गए एप्लिकेशन के लिए पैकेज और गतिविधि की जानकारी प्राप्त करता है।

आप getPackageManager() मेथड को कॉल करके PackageManager क्लास का इंस्टेंस प्राप्त कर सकते हैं। यह मेथड इंस्टॉल किए गए एप्लिकेशन के पैकेज और संबंधित अनुमतियों तक पहुंच और उनमें बदलाव कर सकता है।

उदाहरण के लिए:

PackageManager pManager = getPackageManager();
List<ApplicationInfo> list = pManager.getInstalledApplications(PackageManager.GET_META_DATA)

adb का उपयोग करके appPackage और appActivity कैसे खोजें

ऊपर दिया गया PackageManager तरीका किसी एप्लिकेशन के अंदर से काम करता है। एक टेस्टर के रूप में आपके पास आमतौर पर केवल इंस्टॉल किया गया बिल्ड होता है, इसलिए तेज़ तरीका क्वेरी के माध्यम से होता है। एशियाई विकास बैंक किसी कनेक्टेड डिवाइस या एमुलेटर के विरुद्ध।

एप्लिकेशन को डिवाइस पर मैन्युअल रूप से खोलें, फिर platform-tools फ़ोल्डर में टर्मिनल से नीचे दिए गए कमांड में से एक को चलाएँ। यह कमांड वर्तमान में फ़ोकस में मौजूद विंडो का मान प्रिंट करता है, और मान को इस प्रकार फ़ॉर्मेट किया जाता है। package/activity.

adb shell dumpsys window | find "mCurrentFocus"
adb shell dumpsys window windows | grep -i "mCurrentFocus"

पहले फॉर्म का प्रयोग करें Windows कमांड प्रॉम्प्ट में और दूसरे को यूनिक्स शेल या गिट बैश में पढ़ें। परिणाम को दो भागों में पढ़ें: स्लैश से पहले का सब कुछ मान है। appPackageऔर इसके बाद जो कुछ भी है, वह उसका मूल्य है। appActivity.

दो सावधानियां लागू होती हैं। फोकस की गई गतिविधि वह है जो उस समय स्क्रीन पर होती है, जो हमेशा वह गतिविधि नहीं होती जिससे एप्लिकेशन शुरू होता है - यदि ड्राइवर आरंभीकरण के दौरान कोई सत्र विफल हो जाता है, तो ऐप को नए सिरे से लॉन्च करें और मान को दोबारा पढ़ें। और यदि पहले स्प्लैश स्क्रीन दिखाई देती है, तो प्रवेश गतिविधि उस गतिविधि से भिन्न होगी जिसके विरुद्ध आप अंततः दावा करना चाहते हैं, और यही स्थिति है। appWaitActivity के लिए मौजूद है।

एक दृश्य विकल्प यह है uiautomatorviewerजो वर्तमान स्क्रीन पदानुक्रम को कैप्चर करता है और प्रत्येक नोड के पैकेज और क्लास को दिखाता है।

वांछित क्षमताओं से संबंधित सामान्य त्रुटियाँ और उन्हें ठीक करने के तरीके

अधिकांश असफल Appium एक भी टेस्ट स्टेप चलने से पहले ही सेशन समाप्त हो जाते हैं, और इसका कारण लगभग हमेशा टेस्ट की बजाय कैपेबिलिटी सेट में होता है। नीचे दी गई तालिका प्रत्येक संदेश को उसके सामान्य समाधान से जोड़ती है।

मैसेज संभावित कारण फिक्स
अमान्य या असमर्थित वेबड्राइवर क्षमता विक्रेता उपसर्ग के बिना एक गैर-मानक क्षमता भेजी गई थी इसमें appium: जोड़ें, या इसे appium:options के अंदर ले जाएं।
वांछित क्षमताओं में या तो automationName या platformName शामिल होना चाहिए। Appium 2 ड्राइवर का चयन नहीं कर सकते platformName और appium:automationName को स्पष्ट रूप से सेट करें
ऐप शुरू नहीं हो पा रहा है। मूल त्रुटि: ऐप शुरू करने के लिए उपयोग की जाने वाली गतिविधि मौजूद नहीं है। appActivity मैनिफेस्ट से मेल नहीं खाता है ऊपर दिए गए dumpsys कमांड का उपयोग करके मान को दोबारा पढ़ें।
सत्र प्रारंभ नहीं हुआ: कोई उपकरण नहीं मिला कोई एमुलेटर या हैंडसेट संलग्न नहीं है लॉन्च करने से पहले adb devices कमांड से डिवाइस की पुष्टि करें।
टाइमआउट के बाद नया सेशन नहीं बनाया जा सका। एक स्प्लैश स्क्रीन प्रवेश प्रक्रिया में देरी करती है। appWaitActivity सेट करें और appWaitDuration बढ़ाएँ
एप्लिकेशन की स्थिति रन के बीच रीसेट नहीं होती है। डिफ़ॉल्ट रीसेट व्यवहार को ओवरराइड कर दिया गया था। Revआप जिस रन को चाहते हैं उसके लिए appium:noReset और appium:fullReset देखें

जब कोई सेशन शुरू होने से मना कर दे, तो पढ़ें Appium क्लाइंट स्टैक के बजाय सर्वर लॉग tracई. सर्वर बताता है कि वह किस क्षमता को पूरा नहीं कर सका, और उस पंक्ति में समाधान का नाम दिया गया है।

अक्सर पूछे जाने वाले प्रश्न

नहीं। platformName और browserName मानक W3C क्षमताएं हैं और इनमें कोई उपसर्ग नहीं जोड़ा जाता है। अन्य सभी Appium डिवाइस का नाम और प्लेटफ़ॉर्म संस्करण सहित क्षमता, एक विक्रेता एक्सटेंशन है और इसके लिए appium: उपसर्ग की आवश्यकता होती है।

डिवाइस क्लाउड में मशीन लर्निंग टूल बिल्ड और टारगेट डिवाइस से क्षमताओं का एक सेट सुझाते हैं, और उन मानों को चिह्नित करते हैं जो समान सत्रों में विफल रहे। आउटपुट को एक ड्राफ्ट के रूप में मानें और ड्राइवर दस्तावेज़ के अनुसार प्रत्येक नाम की पुष्टि करें।

कोपायलट सामान्य क्षमता ब्लॉकों को पूरा करता है, लेकिन इसे कई चीजों पर प्रशिक्षित किया गया था। Appium 1 कोड अक्सर उपसर्ग को छोड़ देता है या अप्रचलित DesiredCapabilities क्लास का सुझाव देता है। प्रत्येक सुझाव की वर्तमान गाइड से तुलना करें।

appPackage पैकेज का नाम बताता है Appium लॉन्च करता है। appWaitPackage पैकेज का नाम देता है। Appium नियंत्रण वापस करने से पहले प्रकट होने की प्रतीक्षा करता है, जो तब मायने रखता है जब कोई लॉन्चर या स्प्लैश स्क्रीन पहले एक अलग पैकेज लोड करती है।

platformName को iOS पर सेट किया गया है और appium:automationName को XCUITest पर सेट किया गया है। XCUITest ड्राइवर को appium:app, appium:bundleId या browserName में से कम से कम एक की आवश्यकता होती है, अन्यथा यह होम स्क्रीन पर एक सत्र खोलता है।

सर्वर क्लाइंट द्वारा अगला कमांड भेजने के लिए जितने सेकंड तक प्रतीक्षा करता है, वह समय सीमा है। यदि प्रतीक्षा अवधि समाप्त हो जाती है, तो सर्वर मान लेता है कि क्लाइंट चला गया है और सत्र को बंद कर देता है, जो अक्सर एक यादृच्छिक विफलता जैसा प्रतीत होता है।

noReset सामान्य रीसेट प्रक्रिया को छोड़ देता है, जिससे ऐप का डेटा सेशन के दौरान सुरक्षित रहता है। fullReset प्रक्रिया में अतिरिक्त चरण शामिल होते हैं, जैसे कि ऐप को अनइंस्टॉल करना और फिर से इंस्टॉल करना, ताकि परिणाम बार-बार एक जैसे हों। ये दोनों डिफ़ॉल्ट रूप से false पर सेट होते हैं और इन्हें एक साथ चालू नहीं करना चाहिए।

नहीं। क्षमताएं सत्र शुरू करने के लिए पैरामीटर हैं और एक बार सत्र बन जाने के बाद स्थिर हो जाती हैं। जहां कोई ड्राइवर सत्र के बीच में व्यवहार को बदलने की अनुमति देता है, वहां वह सेटिंग्स एपीआई के माध्यम से एक सेटिंग उपलब्ध कराता है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: