इस दस्तावेज़ में रोबो स्क्रिप्ट के बारे में रेफ़रंस के तौर पर जानकारी दी गई है. इसमें संरचना, क्षमताएं, इस्तेमाल, रिकॉर्डिंग, और कार्रवाइयों के बारे में जानकारी शामिल है. रोबो स्क्रिप्ट ऐसी जांच होती हैं जो मोबाइल ऐप्लिकेशन के लिए मैन्युअल क्वालिटी अश्योरेंस (QA) के टास्क अपने-आप होती हैं. साथ ही, ये टेस्ट लगातार इंटिग्रेशन (सीआई) और प्री-लॉन्च टेस्टिंग रणनीतियों को चालू करते हैं. रोबो स्क्रिप्ट एक JSON फ़ाइल होती है, जो यूज़र इंटरफ़ेस (यूआई) और दूसरी कार्रवाइयों के क्रम के बारे में बताती है.
रोबो स्क्रिप्ट को इन तरीकों से बनाया जा सकता है:
रोबो स्क्रिप्ट रिकॉर्डिंग की सुविधा का इस्तेमाल करें. (सिर्फ़ Android वर्शन पर)
रोबो स्क्रिप्ट को मैन्युअल तरीके से बनाएं. (Android और iOS+)
रोबो स्क्रिप्ट रिकॉर्ड करें और फिर उसमें मैन्युअल तरीके से बदलाव करें. (सिर्फ़ Android वर्शन पर)
रोबो स्क्रिप्ट का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, रोबो स्क्रिप्ट चलाना लेख पढ़ें.
शुरुआती जानकारी
रोबो स्क्रिप्ट को ऐप्लिकेशन-अंडर-टेस्ट Android ऐप्लिकेशन पैकेज (APK) जैसे दूसरे इनपुट के साथ-साथ, रोबो टेस्ट में भी उपलब्ध कराया जाता है.
रोबो स्क्रिप्ट का एक उदाहरण नीचे दिया गया है, जो उपयोगकर्ता को ऐप्लिकेशन में साइन इन करने के लिए कहती है, जो ऐप्लिकेशन-अंडर-टेस्ट के लॉन्च होने पर ट्रिगर होती है:
[
{
"crawlStage": "crawl",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "user123",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/username"
}
]
},
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "12345",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/password"
}
]
},
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/login"
}
]
}
]
}
]
अगर किसी फ़ाइल में एक रोबो स्क्रिप्ट है और उसकी डिफ़ॉल्ट app_under_test_shown
ट्रिगर करने की शर्त है, जैसा कि ऊपर दिए गए उदाहरण में बताया गया है, तो आप किसी फ़ाइल में रोबो स्क्रिप्ट को आसान फ़ॉर्मैट का इस्तेमाल करके तय कर सकते हैं - वह भी इसकी कार्रवाइयों के नतीजे के रूप में:
[
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "user123",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/username"
}
]
},
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "12345",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/password"
}
]
},
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/login"
}
]
}
]
रोबो स्क्रिप्ट के लिए iOS+ सहायता
iOS+ (बीटा) के लिए Robo रोबो स्क्रिप्ट के लिए सीमित काम करता है. iOS+ के लिए Robo स्क्रिप्ट सिंटैक्स, Android सिंटैक्स की तरह होता है. साथ ही, iOS+ के साथ काम करने वाली सुविधाएं अपने Android वर्शन की तरह ही काम करती हैं.
iOS+ पर ये कार्रवाइयां की जा सकती हैं:
- दावा
- क्लिक करें
- देर तक क्लिक करें
- स्वाइप
- सभी एलिमेंट को अनदेखा करें
- इंतज़ार करें
- स्क्रीनशॉट लेने के लिए
- क्रॉल करना बंद करें
एलिमेंट डिस्क्रिप्टर में पहचाने जा सकने वाले नीचे दिए गए एट्रिब्यूट iOS+ में काम करते हैं:
- कक्षा का नाम
- पहले से मौजूद क्लास का नाम
- कॉन्टेंट की जानकारी और रेगुलर एक्सप्रेशन
- टेक्स्ट (और रेगुलर एक्सप्रेशन)
नीचे दी गई कॉन्टेक्स्ट डिस्क्रिप्टर में ट्रिगर करने की शर्तें iOS+ में काम करती हैं:
- टेस्ट में ऐप्लिकेशन दिखाया गया
- एलिमेंट मौजूद है
- नॉन-रोबो स्क्रिप्ट पर कार्रवाई की गई
बनावट
रोबो स्क्रिप्ट में ऐसे कई एट्रिब्यूट होते हैं जो बताते हैं कि रोबो इसे कैसे एक्ज़ीक्यूट करता है. पहले से तय डिफ़ॉल्ट वैल्यू के लिए, इनमें से ज़्यादातर एट्रिब्यूट ज़रूरी नहीं हैं:
एट्रिब्यूट | जानकारी |
id
|
यह एक पूर्णांक संख्या है, जो क्रॉल आउटपुट में इस रोबो स्क्रिप्ट को ट्रैक करने में मदद करती है.
रोबो ने खुद के id के साथ, रोबो स्क्रिप्ट बनाई है. हालांकि,
अलग-अलग रोबो स्क्रिप्ट में मौजूद एक ही id के काम करने के तरीके पर, कोई असर नहीं पड़ता. हालांकि, क्रॉल आउटपुट में इन रोबो स्क्रिप्ट में बताई गई कार्रवाइयों के बीच अंतर करना मुश्किल हो सकता है. हमारा सुझाव है कि रोबो स्क्रिप्ट के लिए,
1000 या उससे ज़्यादा का यूनीक id असाइन करें, ताकि किसी तरह की गड़बड़ी से बचा जा सके.
|
description
|
id के समान लेकिन ज़्यादा जानकारी देने वाला.
|
crawlStage
|
रोबो, क्रॉल करने का वह स्टेज है जिस पर यह रोबो स्क्रिप्ट लागू होती है. डिफ़ॉल्ट रूप से, यह क्रॉल करने का मुख्य चरण होता है. |
priority
|
अन्य रोबो स्क्रिप्ट की तुलना में इस रोबो स्क्रिप्ट की प्राथमिकता.
डिफ़ॉल्ट रूप से, सभी रोबो स्क्रिप्ट की प्राथमिकता 1 होती है.
|
maxNumberOfRuns
|
इससे पता चलता है कि क्रॉल करने के दौरान, रोबो इस रोबो स्क्रिप्ट को कितनी बार एक्ज़ीक्यूट कर सकता है. डिफ़ॉल्ट रूप से, रोबो किसी रोबो स्क्रिप्ट को एक बार चला सकता है. |
contextDescriptor
|
उस कॉन्टेक्स्ट या स्थिति के बारे में बताता है जो इस रोबो स्क्रिप्ट को ट्रिगर करता है. अगर इसे छोड़ दिया जाता है, तो इस रोबो स्क्रिप्ट की ट्रिगर करने की शर्त को हमेशा पूरा माना जाता है. दूसरे शब्दों में, रोबो स्क्रिप्ट बिना किसी शर्त के होती है. |
actions
|
इस रोबो स्क्रिप्ट की सभी कार्रवाइयां. |
किसी एक फ़ाइल में, एक या उससे ज़्यादा रोबो स्क्रिप्ट का कलेक्शन होता है.
यहां एक फ़ाइल का उदाहरण दिया गया है, जिसमें बिना किसी शर्त के दो रोबो स्क्रिप्ट हैं. हर स्क्रिप्ट में एक ऐसी कार्रवाई है जो क्रॉल की शुरुआत में एक बार पूरी होती है:
[
{
"id": 1000,
"description": "My first Robo script",
"actions": [
{
"eventType": "DISABLE_KEYBOARD"
}
]
},
{
"id": 1001,
"description": "My second Robo script",
"actions": [
{
"eventType": "PRESSED_BACK"
}
]
}
]
कॉन्टेक्स्ट डिस्क्रिप्टर
कॉन्टेक्स्ट डिस्क्रिप्टर उस कॉन्टेक्स्ट या शर्त के बारे में बताता है जो किसी एक या कई एट्रिब्यूट के कॉम्बिनेशन का इस्तेमाल करके रोबो स्क्रिप्ट को ट्रिगर करता है:
एट्रिब्यूट | जानकारी |
---|---|
"condition": "always"
|
हमेशा रोबो स्क्रिप्ट ट्रिगर करता है. |
"condition": "element_present"
|
यह जांच करता है कि elementDescriptors या
visionText से तय किए गए टेक्स्ट से मेल खाने वाला यूज़र इंटरफ़ेस (यूआई) विजेट, स्क्रीन पर मौजूद है या नहीं.
|
"condition": "element_disabled"
|
यह जांच करता है कि elementDescriptors से मेल खाने वाला यूज़र इंटरफ़ेस (यूआई) विजेट,
स्क्रीन पर मौजूद है और उससे इंटरैक्ट नहीं किया जा सकता.
|
"condition": "element_checked"
|
यह जांच करता है कि elementDescriptors से मेल खाने वाला यूज़र इंटरफ़ेस (यूआई) विजेट स्क्रीन पर मौजूद है या नहीं और उसे चुना गया है.
|
"condition": "app_under_test_shown"
|
यह जांचता है कि ऐप्लिकेशन की जांच के तहत यह सुविधा फ़ोरग्राउंड में चल रही है या नहीं. |
"condition": "default_launcher_shown"
|
यह जांचता है कि डिवाइस की होम स्क्रीन दिखाई गई है या नहीं. इसका मतलब है कि फ़ोरग्राउंड में कोई ऐप्लिकेशन नहीं चल रहा है. |
"condition": "non_roboscript_action_performed"
|
यह जांच करता है कि रोबो टेस्ट के ज़रिए लगातार की गई पिछली nonRoboscriptActionCount कार्रवाइयां, रोबो स्क्रिप्ट कार्रवाइयां नहीं हैं.
|
negateCondition
|
अगर इसे true पर सेट किया जाता है, तो condition को अस्वीकार कर दिया जाता है. उदाहरण
के लिए, इस एट्रिब्यूट का इस्तेमाल करके यह पता लगाया जा सकता है कि स्क्रीन पर यूज़र इंटरफ़ेस (यूआई) विजेट
मौजूद नहीं है या नहीं. इसके अलावा, यह भी देखा जा सकता है कि फ़ोरग्राउंड में ऐप्लिकेशन का टेस्ट,
फ़ोरग्राउंड में तो नहीं चल रहा है.
|
elementDescriptors
|
एक या एक से ज़्यादा एलिमेंट डिस्क्रिप्टर, जो स्क्रीन पर यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करते हैं.
इसका इस्तेमाल element_present ,
element_disabled , और element_checked
शर्तों के साथ किया जाता है. visionText के साथ म्यूचुअली एक्सक्लूसिव. ज़्यादा जानकारी के लिए
एलिमेंट डिस्क्रिप्टर देखें.
|
visionText
|
ऑप्टिकल कैरेक्टर रिकग्निशन (ओसीआर) एपीआई की मदद से, स्क्रीन पर दिख रहे टेक्स्ट का पता लगाया जाता है. visionText का इस्तेमाल,
element_present शर्त के साथ किया जाता है. elementDescriptors के साथ म्यूचुअली एक्सक्लूसिव.
|
nonRoboscriptActionCount
|
नॉन-रोबो स्क्रिप्ट से पहले की गई लगातार की गई कार्रवाइयों की संख्या. इसे non_roboscript_action_performed शर्त के साथ इस्तेमाल किया जाता है, ताकि हर nonRoboscriptActionCount रोबो ऐक्शन के बाद रोबो स्क्रिप्ट ट्रिगर हो. डिफ़ॉल्ट रूप से, यह
1 है.
|
यहां रोबो स्क्रिप्ट का एक उदाहरण दिया गया है, जो यूज़र इंटरफ़ेस (यूआई) विजेट से ट्रिगर होती है. इस विजेट को स्क्रीन पर, संसाधन आईडी "my.app.package:id/page_header"
मौजूद होने पर ट्रिगर किया जाता है:
{
"id": 1000,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/page_header"
}
]
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"text": "Settings"
}
]
}
]
}
यहां रोबो स्क्रिप्ट का एक उदाहरण दिया गया है, जो ऑप्टिकल कैरेक्टर रिकग्निशन (ओसीआर) की मदद से पहचानी गई "Privacy Policy"
से ट्रिगर होती है:
{
"id": 1000,
"description": "Vision text Robo script",
"contextDescriptor": {
"condition": "element_present",
"visionText": "Privacy Policy"
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"visionText": "Privacy Policy"
}
]
}
नीचे रोबो स्क्रिप्ट का एक उदाहरण दिया गया है, जो बिना स्क्रिप्ट वाली रोबो कार्रवाई के बाद पांच सेकंड तक इंतज़ार करता है:
{
"contextDescriptor": {
"condition": "non_roboscript_action_performed"
},
"maxNumberOfRuns" : 1000,
"actions" : [
{
"eventType" : "DELAYED_MESSAGE_POSTED",
"delayTime" : 5000
}]
}
कार्रवाइयां
रोबो स्क्रिप्ट में होने वाली हर कार्रवाई को एक या एक से ज़्यादा एट्रिब्यूट-वैल्यू पेयर के बंडल के तौर पर दिखाया जाता है. इन पेयर के बारे में इस टेबल में बताया गया है:
एट्रिब्यूट | जानकारी |
eventType
|
इससे पता चलता है कि कार्रवाई किस तरह की है. उदाहरण के लिए, क्लिक, टेक्स्ट में बदलाव करना वगैरह. हर कार्रवाई के लिए ज़रूरी है. |
elementDescriptors
|
यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करने वाली जानकारी. यह उन सभी कार्रवाइयों के लिए ज़रूरी है जिनमें टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट है. जैसे, किसी खास बटन पर क्लिक करना. |
optional
|
अगर इसे true पर सेट किया जाता है, तो नहीं किए जा सकने पर यह कार्रवाई स्किप कर दी जाती है. उदाहरण के लिए, इस कार्रवाई को तब स्किप किया जाता है, जब स्क्रीन पर इसे टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट नहीं मिलता. रोबो स्क्रिप्ट को शामिल किए बिना, इसे स्किप किया जा सकता है. डिफ़ॉल्ट रूप से, यह वैल्यू false होती है.
|
replacementText
|
टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट में डाला जाने वाला टेक्स्ट. टेक्स्ट में बदलाव करने की कार्रवाइयों के लिए ज़रूरी है. |
swipeDirection
|
स्वाइप की दिशा बताता है. स्वाइप करने पर होने वाली कार्रवाइयों के लिए ज़रूरी है. |
delayTime
|
बताता है कि कितने समय तक इंतज़ार करना है. यह जानकारी मिलीसेकंड में दी जाती है. इंतज़ार से जुड़ी कार्रवाइयों के लिए ज़रूरी है. |
pointTapXCoordinate और pointTapYCoordinate
|
टैप किए गए पॉइंट के पिक्सल X और Y निर्देशांक. pointTapXPercent और pointTapYPercent के साथ
म्यूचुअली एक्सक्लूसिव.
पॉइंट पर टैप करने से जुड़ी कार्रवाइयों के लिए ज़रूरी है.
|
pointTapXPercent और pointTapYPercent
|
टैप किए गए पॉइंट के X और Y कोऑर्डिनेट का प्रतिशत. pointTapXCoordinate और
pointTapYCoordinate के साथ खास तौर पर. पॉइंट पर टैप करने से जुड़ी कार्रवाइयों के लिए ज़रूरी है.
|
यहां रोबो स्क्रिप्ट का एक उदाहरण दिया गया है, जिसमें टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट के बिना दो कार्रवाइयां हैं, जिसका मतलब है कि ये कार्रवाइयां किसी खास यूज़र इंटरफ़ेस (यूआई) विजेट पर काम नहीं करतीं:
[
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
},
{
"eventType": "PRESSED_BACK"
}
]
एलिमेंट डिस्क्रिप्टर
एलिमेंट डिस्क्रिप्टर, यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करता है. इसके लिए, नीचे दिए गए, पहचान बताने वाले एक या उससे ज़्यादा एट्रिब्यूट का इस्तेमाल किया जाता है:
एट्रिब्यूट | जानकारी |
className
|
– |
ancestorClassName
|
एलिमेंट के यूज़र इंटरफ़ेस (यूआई) हैरारकी के एंसेस्टर का क्लास नाम. एंसेस्टर, एलिमेंट के यूज़र इंटरफ़ेस (यूआई) की हैरारकी में कोई भी पैरंट नोड होता है. इसमें एलिमेंट भी शामिल होता है. |
resourceId
|
– |
resourceIdRegex
|
resourceId से मेल खाने वाला Java रेगुलर एक्सप्रेशन.
|
contentDescription
|
– |
contentDescriptionRegex
|
contentDescription से मेल खाने वाला Java रेगुलर एक्सप्रेशन.
|
text (यह स्क्रीन पर दिखता है)
|
– |
textRegex
|
text से मेल खाने वाला Java रेगुलर एक्सप्रेशन.
|
groupViewChildPosition ,
recyclerViewChildPosition या
adapterViewChildPosition
|
पैरंट विजेट के टाइप के आधार पर, यह यूज़र इंटरफ़ेस (यूआई) विजेट की चाइल्ड पोज़िशन दिखाता है. |
अक्सर, इन एट्रिब्यूट की वैल्यू तय नहीं होती. उदाहरण के लिए, ऐसा हो सकता है कि किसी बटन में टेक्स्ट और कॉन्टेंट की जानकारी न हो. भले ही कुछ एट्रिब्यूट की वैल्यू मौजूद हों,
हो सकता है कि वे किसी ऐप्लिकेशन की स्क्रीन पर यूनीक न हों (इसमें resourceId
शामिल है).
उदाहरण के लिए, किसी सूची के आइटम के बीच अंतर करना, आम तौर पर सिर्फ़
उनके पैरंट विजेट में उनकी अलग-अलग चाइल्ड पोज़िशन का इस्तेमाल करके किया जा सकता है. इसका मतलब है कि
आम तौर पर, यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करने के लिए, सिर्फ़ एक एलिमेंट डिस्क्रिप्टर का इस्तेमाल
नहीं किया जाता. इसलिए, किसी कार्रवाई के elementDescriptors
एट्रिब्यूट में एलिमेंट डिस्क्रिप्टर का क्रम होता है. ये क्रम इस तरह दिए जाते हैं कि पहला, टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट के हिसाब से हो और दूसरा, टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट के पैरंट विजेट से मेल खाता हो. किसी कार्रवाई के टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट को तब मैच किया जाता है, जब इसके सभी एलिमेंट डिस्क्रिप्टर, उससे जुड़े यूज़र इंटरफ़ेस (यूआई) विजेट
सब-हैरारकी से मेल खाते हों.
यहां टेक्स्ट में बदलाव और क्लिक ऐक्शन वाली रोबो स्क्रिप्ट का उदाहरण दिया गया है. इन दोनों में, दिए गए एलिमेंट डिस्क्रिप्टर का इस्तेमाल करके, टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करना ज़रूरी है:
[
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "John",
"elementDescriptors": [
{
"className": "android.support.v7.widget.AppCompatEditText",
"groupViewChildPosition": 0,
"resourceId": "com.google.samples.apps.topeka:id/first_name"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 0
},
{
"className": "android.support.design.widget.TextInputLayout",
"groupViewChildPosition": 1
}
]
},
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"className": "android.support.design.widget.FloatingActionButton",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/done"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/content"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 0,
"resourceId": "com.google.samples.apps.topeka:id/sign_in_content"
}
]
}
]
प्लान लागू करने के विकल्प
अगर आपके पास रोबो स्क्रिप्ट में, कार्रवाइयों की सूची को किसी JSON ऑब्जेक्ट के साथ प्रीफ़िक्स करने का विकल्प है, तो उस रोबो स्क्रिप्ट को लागू करने के विकल्प तय किए जा सकते हैं. यह कॉन्फ़िगरेशन हेडर, roboscript
कीवर्ड से शुरू होता है. इसके बाद, पसंद के हिसाब से एक्ज़ीक्यूशन के विकल्पों को JSON तरीके से दिखाया जाता है.
रोबो स्क्रिप्ट में, इन्हें चलाने के ये विकल्प काम करते हैं:
executionMode
- रोबो स्क्रिप्ट के चलने पर, एक्ज़ीक्यूशन के विकल्प लागू होते हैं:strict
- अगर इसेtrue
पर सेट किया जाता है, तो रोबो स्क्रिप्ट कुछ हद तक मैच करने, मौजूदा कार्रवाई को स्किप करने, और निलंबन की सुविधा का इस्तेमाल नहीं करती है. इसका मतलब है कि रोबो स्क्रिप्ट को सामान्य इंस्ट्रुमेंटेशन टेस्ट के तौर पर एक्ज़ीक्यूट किया जाता है. यह प्रोग्राम तब फ़ेल हो जाता है, जब इसकी कोई भी कार्रवाई पूरी न हो पाए. डिफ़ॉल्ट रूप से, यहfalse
है.dismiss_popups
- अगर इसेtrue
पर सेट किया जाता है, तो रोबो टेस्ट रोबो स्क्रिप्ट कोstrict
मोड में करते समय भी अनचाहे डायलॉग को खारिज कर देता है.strict
मोड में न होने पर, इस विकल्प का कोई असर नहीं पड़ता. डिफ़ॉल्ट रूप से, यहfalse
है.notify
- रोबो स्क्रिप्ट कोfalse
पर सेट करने से, यह लागू होने की शुरुआत और आखिर में स्क्रीन पर सूचनाएं नहीं दिखाती है. डिफ़ॉल्ट रूप से, यहtrue
है.
postscript
- रोबो स्क्रिप्ट पूरी होने के बाद, इसे लागू करने के विकल्प लागू होते हैं:terminate
- अगरtrue
पर सेट किया जाता है, तो रोबो स्क्रिप्ट पूरी होने के बाद, रोबो टेस्ट क्रॉल करना बंद कर देता है. डिफ़ॉल्ट रूप से, यहfalse
है.
यहां रोबो स्क्रिप्ट का एक उदाहरण दिया गया है, जिसे strict
मोड में लागू किया गया है और इसके लिए स्क्रीन पर सूचनाएं नहीं दिखती हैं. यह स्क्रिप्ट तीन सेकंड तक स्लीप मोड में रहती है, जिसके बाद क्रॉल रुक जाता है:
"roboscript": {
"executionMode": {
"strict": true,
"notify": false
},
"postscript": {
"terminate": true
}
}
[
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
टेंप्लेट के पैरामीटर
टेंप्लेट पैरामीटर, रोबो स्क्रिप्ट में मौजूद एक प्लेसहोल्डर होता है. इसे तब असल वैल्यू से बदल दिया जाता है, जब रोबो टेस्ट उस रोबो स्क्रिप्ट को एक्ज़ीक्यूशन के लिए लोड करता है. टेंप्लेट पैरामीटर के शुरू में डबल अंडरस्कोर लगा होता है. इसके बाद प्रतिशत का निशान होता है. इसके बाद, प्रतिशत के निशान के बाद डबल अंडरस्कोर लगा होता है.
रोबो स्क्रिप्ट, नीचे दिए गए टेंप्लेट पैरामीटर के साथ काम करते हैं:
__%APP_PACKAGE_NAME%__
- ऐप्लिकेशन की जांच में लगे पैकेज का नाम.
यहां रोबो स्क्रिप्ट का एक उदाहरण दिया गया है, जो ऐप्लिकेशन की जांच के तहत आने वाली प्रोसेस को रोकता है:
[
{
"eventType": "ADB_SHELL_COMMAND",
"command": "am force-stop __%APP_PACKAGE_NAME%__"
}
]
टिप्पणियां
रोबो स्क्रिप्ट में, टिप्पणी की पंक्तियां शामिल हो सकती हैं. ये ऐसी पंक्तियां होती हैं जो #
या //
से शुरू होती हैं.
कुछ टिप्पणियों वाली रोबो स्क्रिप्ट का एक उदाहरण नीचे दिया गया है:
# Confirm a user account.
[
{
// Click the DONE button.
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
]
मिलने वाली अनुमतियां
डिफ़ॉल्ट रूप से, जब तक रोबो स्क्रिप्ट की सभी कार्रवाइयां पूरी नहीं हो जातीं (या कम से कम इंतज़ार नहीं किया जाता), तब तक रोबो स्क्रिप्ट चालू रहती है. रोबो टेस्ट, कार्रवाई करने के लिए रोबो स्क्रिप्ट ऐक्शन को मैच करने की कोशिश करता रहता है. रोबो स्क्रिप्ट, मज़बूती बढ़ाने के लिए इन तकनीकों का इस्तेमाल करती है:
तकनीक | जानकारी |
कुछ हद तक मैच करने की सुविधा | अगर रोबो स्क्रिप्ट की मौजूदा कार्रवाई पूरी तरह मैच नहीं हो पाती है, तो मैचिंग की शर्तों में ढील दी जाती है और फिर से मैच करने की कोशिश की जाती है. पार्शियल मैचिंग
रोबो स्क्रिप्ट ऐक्शन के टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट से मैच करते समय,
बाहरी एलिमेंट डिस्क्रिप्टर का इस्तेमाल नहीं करती.
अगर कुछ हद तक मैच हो जाता है, तो रोबो स्क्रिप्ट से जुड़ी उससे जुड़ी कार्रवाई हमेशा की तरह की जाती है. यह तकनीक, उन स्थितियों पर काम करती है जिनमें ऐप्लिकेशन का स्ट्रक्चर बदलता है. उदाहरण के लिए, ऐप्लिकेशन के वर्शन के बीच में, जब स्क्रीन एलिमेंट का क्रम बदला जाता है. |
मौजूदा कार्रवाई को छोड़ें | अगर रोबो स्क्रिप्ट की मौजूदा कार्रवाई पूरी तरह या कुछ हद तक मैच नहीं हो पाती है, तो रोबो, रोबो स्क्रिप्ट के बाद होने वाली कार्रवाई से मैच करने की कोशिश करता है. अगर इसके बाद की कार्रवाई पूरी तरह या कुछ हद तक मैच होती है, तो रोबो टेस्ट मौजूदा रोबो स्क्रिप्ट ऐक्शन को छोड़कर आगे नहीं बढ़ता है.
यह तकनीक, उन स्थितियों पर काम करती है जब ऐप्लिकेशन के काम करने का तरीका अलग-अलग वर्शन के बीच बदलता है या ठीक से काम नहीं करता. उदाहरण के लिए, जब रोबो स्क्रिप्ट को रिकॉर्ड करने और उसे फिर से चलाने के दौरान अलग-अलग स्क्रीन पर रुक-रुककर चलने वाला कोई डायलॉग दिख सकता है. |
निलंबित | अगर रोबो स्क्रिप्ट की मौजूदा या बाद की कार्रवाइयों का पूरी तरह या कुछ हिस्सा मैच नहीं होता है, तो रोबो स्क्रिप्ट कुछ समय के लिए निलंबित कर दी जाती है. इसके बाद, रोबो टेस्ट अपनी दूसरी रणनीतियों का इस्तेमाल करके कोई कार्रवाई चुनता है. इस कार्रवाई के पूरा होने के बाद, रोबो टेस्ट, रोबो स्क्रिप्ट को फिर से चलाना शुरू कर देता है.
जब तक रोबो स्क्रिप्ट की मौजूदा या बाद की कार्रवाइयों का मिलान नहीं हो पाता, तब तक रोबो स्क्रिप्ट कितनी भी कार्रवाइयों के लिए निलंबित रहती है. इसलिए, यह ज़रूरी नहीं है कि रोबो स्क्रिप्ट, रोबो टेस्ट के लिए एक प्रस्ताव पेश करें. साथ ही, रोबो स्क्रिप्ट ऐक्शन को स्टैंडर्ड रोबो टेस्ट ऐक्शन के साथ भी शामिल किया जा सकता है. यह तकनीक, उन स्थितियों पर काम करती है जब ऐप्लिकेशन के काम करने के तरीके में बदलाव नहीं होता या जब ऐप्लिकेशन के अलग-अलग वर्शन के बीच काफ़ी बड़े बदलाव होते हैं, तो रोबो टेस्ट में स्टैंडर्ड ऐक्शन की मदद से "अंतराल भरें" की ज़रूरत होती है. |
प्राथमिकताएं
अगर रोबो स्क्रिप्ट अपने maxNumberOfRuns
तक पहुंच जाती है, तो उसे किसी दिए गए क्रॉल में ट्रिगर नहीं किया जा सकता. अगर मौजूदा कॉन्टेक्स्ट की वजह से एक से ज़्यादा रोबो स्क्रिप्ट ट्रिगर होती हैं, तो प्राथमिकता नीचे दी गई रोबो स्क्रिप्ट को चुनकर दी जाती है. रोबो स्क्रिप्ट इस क्रम में होगी:
- इसमें
contextDescriptor
एट्रिब्यूट है. - इसमें सबसे ज़्यादा
priority
होती है (डिफ़ॉल्ट रूप से, सभी रोबो स्क्रिप्ट का1
में सेpriority
एक जैसा परफ़ॉर्म करता है). - अगर रोबो स्क्रिप्ट की प्राथमिकताएं एक जैसी होती हैं, तो यह रोबो स्क्रिप्ट की सूची में सबसे पहले दिखता है.
नीचे एक ऐसी फ़ाइल का उदाहरण दिया गया है जिसमें तीन रोबो स्क्रिप्ट हैं, जो एक ही कार्रवाई करती हैं और एक ही शर्त से ट्रिगर होती हैं - फ़ोरग्राउंड में ऐप्लिकेशन का टेस्ट फ़ोरग्राउंड में होना:
[
{
"id": 1000,
"description": "Robo script 1",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
},
{
"id": 1001,
"description": "Robo script 2",
"priority": "2",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
},
{
"id": 1002,
"description": "Robo script 3",
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
]
}
]
जब ऐप्लिकेशन अंडर-टेस्ट फ़ोरग्राउंड में होता है, तब रोबो नीचे बताई गई चीज़ों को क्रम से ट्रिगर करता है:
"Robo script 2"
, क्योंकि इसकी प्राथमिकता सबसे ज़्यादा है."Robo script 1"
क्योंकि यह उसी प्राथमिकता वाली बाकी लागू रोबो स्क्रिप्ट में पहले दिखता है.- आखिरी लागू रोबो स्क्रिप्ट के तौर पर
"Robo script 3"
.
बार-बार दौड़ना
डिफ़ॉल्ट रूप से, क्रॉल के दौरान रोबो, रोबो स्क्रिप्ट को ज़्यादा से ज़्यादा एक बार ट्रिगर करता है. इसमें maxNumberOfRuns
एट्रिब्यूट की मदद से बदलाव किया जा सकता है.
नीचे रोबो स्क्रिप्ट का एक उदाहरण दिया गया है, जो ऐप्लिकेशन के टेस्ट को बैकग्राउंड में 10 बार तक ला सकता है:
{
"id": 1000,
"maxNumberOfRuns": 10,
"contextDescriptor": {
"condition": "app_under_test_shown"
},
"actions": [
{
"eventType": "GO_HOME"
}
]
}
क्रॉल करने की स्थिति
रोबो स्क्रिप्ट, किसी रोबो क्रॉल के अलग-अलग स्टेज पर लागू होती हैं:
क्रॉल करने की स्थिति | जानकारी |
pre_crawl
|
रोबो के लॉन्च होने और अंडर-टेस्ट में ऐप्लिकेशन को क्रॉल करना शुरू करने से पहले. |
post_crawl
|
जब रोबो, ऐप्लिकेशन के टेस्ट के नतीजों को क्रॉल कर लेता है. |
crawl
|
क्रॉल करने का मुख्य स्टेज, जब रोबो, टेस्ट में ऐप्लिकेशन को क्रॉल करता है. |
close_screen
|
जब रोबो किसी स्क्रीन से वापस (बैकट्रैक) वापस जाने की कोशिश करता है, तब इस स्क्रीन पर होने वाली सभी कार्रवाइयों के बारे में पता लगाया जाता है. डिफ़ॉल्ट रूप से, रोबो वापस बटन को दबाता है. कुछ मामलों में इसे पसंद नहीं किया जाता है. |
अगर रोबो स्क्रिप्ट के crawlStage
एट्रिब्यूट की जानकारी नहीं दी गई है, तो इसका मतलब है कि यह crawl
है.
नीचे रोबो स्क्रिप्ट का एक उदाहरण दिया गया है, जो टेस्ट में शामिल ऐप्लिकेशन के उपयोगकर्ता के डेटा को, रोबो के क्रॉल करने से पहले मिटा देता है:
{
"id": 1000,
"crawlStage": "pre_crawl",
"actions": [
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
]
}
यहां रोबो स्क्रिप्ट का एक उदाहरण दिया गया है, जिसमें रोबो को पुष्टि करने वाले डायलॉग के ज़रिए वापस (बैकट्रैक) वापस लौटने की कोशिश करने पर, "Cancel"
पर क्लिक करने का निर्देश दिया जाता है:
{
"id": 1000,
"crawlStage": "close_screen",
"maxNumberOfRuns": 999,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_dialog"
}
]
},
"actions": [
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"text": "Cancel"
}
]
}
]
}
शर्तें पूरी होने पर ट्रिगर होने वाली कार्रवाइयां
रोबो स्क्रिप्ट में, शर्तों के साथ की जाने वाली कार्रवाइयां हो सकती हैं. कंडिशनल ऐक्शन में तीन अतिरिक्त एट्रिब्यूट होते हैं, जो यह बताते हैं कि रोबो उन्हें कैसे परफ़ॉर्म करता है:
एट्रिब्यूट | जानकारी |
priority
|
रोबो स्क्रिप्ट में, कंडिशनल ऐक्शन की तुलना में कंडिशनल ऐक्शन की प्राथमिकता. डिफ़ॉल्ट रूप से, शर्त वाली सभी कार्रवाइयों की प्राथमिकता 1 होती है.
|
maxNumberOfRuns
|
इस कंडिशनल ऐक्शन को रोबो स्क्रिप्ट वाले किसी एक एक्ज़ीक्यूशन के दौरान कितनी बार किया जा सकता है. डिफ़ॉल्ट रूप से, शर्त वाली सभी कार्रवाइयां, रोबो स्क्रिप्ट वाली किसी एक कार्रवाई में ज़्यादा से ज़्यादा एक बार की जा सकती हैं. |
contextDescriptor
|
शर्तों के हिसाब से की जाने वाली इस कार्रवाई को ट्रिगर करने वाला संदर्भ/शर्त. इसका स्ट्रक्चर और रोबो स्क्रिप्ट केContextDescriptor जैसी ही सुविधाएं हैं |
ट्रिगर होने पर, रोबो स्क्रिप्ट दिखाए जाने के क्रम में, बिना शर्त वाली अपनी कार्रवाइयां एक-एक करके करती है. अगर रोबो स्क्रिप्ट में कंडिशनल ऐक्शन हैं, तो बिना शर्त वाली कार्रवाई करने से पहले हर बार इन कार्रवाइयों को चुना जाता है. अगर किसी शर्त के आधार पर कोई कार्रवाई ट्रिगर होती है और उसे उसकी प्राथमिकता और दौड़ने की बची हुई संख्या के आधार पर चुना जाता है, तो रोबो स्क्रिप्ट यह कार्रवाई करती है. ऐसा नहीं होने पर, रोबो स्क्रिप्ट बिना किसी शर्त के यह कार्रवाई करती है. मान्य होने के लिए, रोबो स्क्रिप्ट में बिना शर्त वाली कम से कम एक कार्रवाई होनी चाहिए.
यहां उदाहरण के तौर पर, बिना किसी शर्त के
{
"id": 1000,
"actions": [
{
"description": "Dismiss popup",
"maxNumberOfRuns": 100,
"contextDescriptor": {
"condition": "default_launcher_shown",
"negateCondition": true
},
"eventType": "GO_HOME"
},
{
"description": "Screen off",
"eventType": "ADB_SHELL_COMMAND",
"command": "input keyevent 26"
},
{
"description": "Wait for 10 seconds",
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 10000
},
{
"description": "Screen on",
"eventType": "ADB_SHELL_COMMAND",
"command": "input keyevent 82"
},
{
"description": "Wait for 10 seconds",
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 10000
}
}
कार्रवाइयों को अनदेखा करें
रोबो स्क्रिप्ट में किसी खास स्क्रीन पर खास यूज़र इंटरफ़ेस (यूआई) विजेट या सभी यूज़र इंटरफ़ेस (यूआई) विजेट को अनदेखा करने के लिए, रोबो के निर्देश हो सकते हैं. इन निर्देशों को eventType
ELEMENT_IGNORED
वाली "कार्रवाइयों" को अनदेखा करने के तौर पर दिखाया गया है. साथ ही, इसी तरह ALL_ELEMENTS_IGNORED
वाली कार्रवाइयों को अनदेखा किया गया है.
जब भी कार्रवाइयों को अनदेखा करने वाली रोबो स्क्रिप्ट का contextDescriptor
एट्रिब्यूट किसी स्क्रीन से मेल खाता है, तो रोबो इसकी कार्रवाई को अनदेखा करके टारगेट किए गए किसी भी यूज़र इंटरफ़ेस (यूआई) विजेट से इंटरैक्ट नहीं करता (जब तक कि रोबो की कोई दूसरी स्क्रिप्ट, अनदेखा किए गए यूआई विजेट में से किसी एक पर कार्रवाई नहीं करती).
रोबो स्क्रिप्ट में अनदेखा करने, सशर्त, और बिना शर्त वाली
कार्रवाइयों का मिला-जुला रूप हो सकता है. रोबो स्क्रिप्ट से जुड़ी दूसरी कार्रवाइयों के उलट, कार्रवाइयों को अनदेखा करना तब लागू होता है, जब तक उनके रोबो स्क्रिप्ट में मौजूद contextDescriptor
रोबो क्रॉल के दौरान स्क्रीन से मैच होता है, भले ही priority
और maxNumberOfRuns
एट्रिब्यूट की वैल्यू कुछ भी हो.
दो रोबो स्क्रिप्ट वाली फ़ाइल का एक उदाहरण नीचे दिया गया है. पहली रोबो स्क्रिप्ट, रोबो को स्क्रीन पर मौजूद सभी यूज़र इंटरफ़ेस (यूआई) विजेट को अनदेखा करती है. इसमें रिसॉर्स आईडी "my.app.package:id/ignored_screen"
वाला यूज़र इंटरफ़ेस (यूआई) विजेट होता है. दूसरी रोबो स्क्रिप्ट,
Robo को यूज़र इंटरफ़ेस (यूआई) के विजेट को अनदेखा करने का काम करती है. इन विजेट के संसाधन आईडी, Java रेगुलर एक्सप्रेशन ".*:id/done"
से मेल खाते हैं. स्क्रीन पर, संसाधन आईडी वाले यूज़र इंटरफ़ेस (यूआई) विजेट की सुविधा होती है
"my.app.package:id/main_screen"
:
[
{
"id": 1000,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/ignored_screen"
}
]
},
"actions": [
{
"eventType": "ALL_ELEMENTS_IGNORED"
}
]
},
{
"id": 1001,
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/main_screen"
}
]
},
"actions": [
{
"eventType": "ELEMENT_IGNORED",
"elementDescriptors": [
{
"resourceIdRegex": ".*:id/done"
}
]
}
]
}
]
RecyclerView और AdapterView के लिए सहायता
RecyclerView और AdapterView के विजेट, डाइनैमिक तौर पर लोड होते हैं. इन्हें मौजूदा स्क्रीन से कई स्वाइप करके, अलग दिखाया जा सकता है. बच्चे के डिवाइस के नाप या आकार के हिसाब से, स्क्रीन का साइज़ और उसे कितनी बार स्वाइप किया जा सकता है, यह अलग-अलग होता है. इसलिए, बच्चे के डिवाइस के डेटा की पोज़िशन पर भरोसा करना ज़्यादा सटीक होता है. बच्चे को स्क्रीन पर लाने और स्क्रीन की पोज़िशन सेट करने के लिए, स्वाइप की संख्या का इस्तेमाल करना ज़्यादा मुश्किल है.
इसलिए, रोबो स्क्रिप्ट, RecyclerView के उन बच्चों के पूरे डेटा की पोज़िशन को कैप्चर करती है जो रोबो स्क्रिप्ट ऐक्शन को recyclerViewChildPosition
के तौर पर टारगेट करते हैं. रोबो स्क्रिप्ट, उन AdapterView चिल्ड्रेन के पूरे डेटा पोज़िशन को भी कैप्चर करती है जो रोबो स्क्रिप्ट ऐक्शन को adapterViewChildPosition
के तौर पर टारगेट करते हैं.
बच्चों के लिए RecyclerView और AdapterView पर कार्रवाइयां, इस तरीके से की जाती हैं:
रोबो टेस्ट से यह पक्का होता है कि स्क्रीन पर इससे जुड़ा चाइल्ड, RecyclerView या AdapterView में पोज़िशनिंग ऐक्शन के ज़रिए दिखाया गया है.
रोबो टेस्ट, रिकॉर्ड की गई कार्रवाई को सीधे चाइल्ड एलिमेंट पर करता है, क्योंकि यह स्क्रीन पर पहले से ही दिखता है.
AdapterView
(android.widget.GridView
) चाइल्ड पर क्लिक ऐक्शन का एक उदाहरण यहां दिया गया है:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"className": "com.google.samples.apps.topeka.widget.AvatarView",
"adapterViewChildPosition": 5,
"resourceId": "com.google.samples.apps.topeka:id/avatar",
"contentDescription": "Avatar 6"
},
{
"className": "android.widget.GridView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/avatars"
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 1
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 0
}
]
}
नीचे RecyclerView
(android.support.v7.widget.RecyclerView
) चाइल्ड पर क्लिक ऐक्शन का एक उदाहरण दिया गया है:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"className": "android.support.v7.widget.AppCompatTextView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/category_title"
},
{
"className": "android.widget.FrameLayout",
"recyclerViewChildPosition": 8,
"resourceId": "com.google.samples.apps.topeka:id/category_item"
},
{
"className": "android.support.v7.widget.RecyclerView",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/categories"
},
{
"className": "android.widget.FrameLayout",
"groupViewChildPosition": 1,
"resourceId": "com.google.samples.apps.topeka:id/category_container"
},
{
"className": "android.widget.LinearLayout",
"groupViewChildPosition": 0
}
]
}
Android Studio में रोबो स्क्रिप्ट रिकॉर्ड करें और उसे टेस्ट लैब में चलाएं
Android Studio में रोबो स्क्रिप्ट बनाई जा सकती है. इससे स्क्रिप्ट, JSON फ़ाइल के तौर पर सेव हो जाती है. इसके बाद, JSON फ़ाइल को ऐप्लिकेशन की मदद से, Firebase टेस्ट लैब में अपलोड किया जा सकता है और उसी हिसाब से टेस्ट किया जा सकता है.
जब अटैच की गई स्क्रिप्ट के साथ रोबो टेस्ट किया जाता है, तब रोबो पहले की कार्रवाइयों की जांच करता है. इसके बाद, वह ऐप्लिकेशन को एक्सप्लोर करता है.
Android Studio में रोबो स्क्रिप्ट JSON फ़ाइल बनाने के लिए, Android Studio में टेस्ट लैब का इस्तेमाल करके रोबो स्क्रिप्ट रिकॉर्ड करना में दिया गया तरीका अपनाएं.
रोबो स्क्रिप्ट कार्रवाइयां
यह सामान्य वैकल्पिक एट्रिब्यूट सभी कार्रवाइयों पर लागू होता है:
description
- यह रोबो स्क्रिप्ट ऐक्शन को रोबो के टेस्ट आउटपुट में लागू होने का ट्रैक रखने में मदद करता है.
दावा
अगर दावा की गई शर्त सही है, तो रोबो स्क्रिप्ट अगली कार्रवाई जारी रखती है, जो कि एक और दावा हो सकता है. अगर ऐसा नहीं होता है, तो दावा न हो पाने की वजह से, रोबो स्क्रिप्ट चलने से रोक दिया जाता है.
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
एट्रिब्यूट | जानकारी |
"eventType": "ASSERTION"
|
-- |
contextDescriptor
|
दावा किए गए संदर्भ या शर्त के बारे में बताता है. इसका स्ट्रक्चर और रोबो स्क्रिप्ट के कॉन्टेक्स्टडिस्क्रिप्टर जैसी ही सुविधाएं हैं. |
यहां रोबो स्क्रिप्ट के दावे का एक उदाहरण दिया गया है, जिसमें यह जांच की जाती है कि ऐप्लिकेशन-अंडर-टेस्ट फ़ोरग्राउंड में है:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "app_under_test_shown"
}
}
रोबो स्क्रिप्ट के लिए किए जाने वाले दावे का उदाहरण नीचे दिया गया है. इससे पता चलता है कि रिसॉर्स आईडी "com.google.samples.apps.topeka:id/done"
वाला यूज़र इंटरफ़ेस (यूआई) विजेट, स्क्रीन पर मौजूद है या नहीं:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
}
रोबो स्क्रिप्ट के लिए किए जाने वाले दावे का एक उदाहरण नीचे दिया गया है. यह इस बात की जांच करता है कि स्क्रीन पर ओसीआर का इस्तेमाल करके, "Settings"
का पता नहीं लगाया गया है:
{
"eventType": "ASSERTION",
"contextDescriptor": {
"condition": "element_present",
"negateCondition": true,
"visionText": "Settings"
}
}
क्लिक करें
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
एट्रिब्यूट | जानकारी |
---|---|
eventType
|
यह बताता है कि रोबो स्क्रिप्ट ऐक्शन किस तरह का है. |
"eventType": "VIEW_CLICKED"
|
ऐप्लिकेशन अंडर-टेस्ट के टारगेट एलिमेंट पर क्लिक करता है. |
"eventType": "SOFT_KEYBOARD_CLICK"
|
सॉफ़्ट कीबोर्ड के टारगेट एलिमेंट पर क्लिक करता है. |
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK"
|
सॉफ़्ट कीबोर्ड के रैंडम एलिमेंट पर ज़्यादा से ज़्यादा
maxNumberOfRuns बार क्लिक करता है.
|
"eventType": "LIST_ITEM_CLICKED"
|
Android Studio में रोबो स्क्रिप्ट रिकॉर्डर, सूची के आइटम पर क्लिक करने के लिए इसका इस्तेमाल करता है. |
elementDescriptors
|
यह Android यूज़र इंटरफ़ेस (यूआई) की हैरारकी का इस्तेमाल करके, क्लिक किए गए यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करता है.
visionText के साथ म्यूचुअली एक्सक्लूसिव.
|
visionText
|
ओसीआर का इस्तेमाल करके क्लिक किए गए एलिमेंट की पहचान करता है. elementDescriptors के साथ म्यूचुअली एक्सक्लूसिव.
|
maxNumberOfRuns
|
यह बताता है कि जब eventType , SOFT_KEYBOARD_RANDOM_CLICK है, तो सॉफ़्ट कीबोर्ड के किसी रैंडम एलिमेंट पर कितनी बार क्लिक करना है.
डिफ़ॉल्ट वैल्यू 1 है.
|
यहां रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जो रिसॉर्स आईडी "com.google.samples.apps.topeka:id/done"
वाले बटन पर क्लिक करता है:
{
"eventType": "VIEW_CLICKED",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/done"
}
]
}
रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण यहां दिया गया है. यह ओसीआर का इस्तेमाल करके, स्क्रीन पर मिले "Privacy Policy"
पर क्लिक करता है:
{
"eventType": "VIEW_CLICKED",
"visionText": "Privacy Policy"
}
रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण यहां दिया गया है, जो कॉन्टेंट की जानकारी "Emoji button"
वाले सॉफ़्ट कीबोर्ड एलिमेंट पर क्लिक करता है:
{
"eventType": "SOFT_KEYBOARD_CLICK",
"elementDescriptors": [
{
"contentDescription": "Emoji button"
}
]
}
रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण नीचे दिया गया है, जो किसी भी सॉफ़्ट कीबोर्ड एलिमेंट पर पांच बार तक क्लिक करता है:
{
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
"maxNumberOfRuns": 5
}
सॉफ़्ट कीबोर्ड बंद करें
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
"eventType": "DISABLE_KEYBOARD"
|
-- |
रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण नीचे दिया गया है, जो सॉफ़्ट कीबोर्ड को बंद करता है:
{
"eventType": "DISABLE_KEYBOARD"
}
adb शेल कमांड लागू करें
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
"eventType": "ADB_SHELL_COMMAND"
|
-- |
command
|
Android डीबग ब्रिज (adb) शेल कमांड को एक्ज़ीक्यूट करना है. |
यह एट्रिब्यूट ज़रूरी नहीं है:
expectedOutputRegex
- Java रेगुलर एक्सप्रेशन के तौर पर, कमांड का अनुमानित आउटपुट. अगर आउटपुट मैच नहीं करता है, तो रोबो स्क्रिप्ट ऐक्शन नहीं होता है. डिफ़ॉल्ट रूप से, वह एक खाली स्ट्रिंग होती है. इसका मतलब है कि आउटपुट की जांच नहीं की जाती है.
यहां रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जो टेस्ट में शामिल ऐप्लिकेशन के उपयोगकर्ता का डेटा मिटा देता है:
{
"eventType": "ADB_SHELL_COMMAND",
"command": "pm clear __%APP_PACKAGE_NAME%__"
}
अनुमतियां दें
इस कार्रवाई को Android Studio में रोबो स्क्रिप्ट रिकॉर्डर की मदद से रिकॉर्ड किया गया है, ताकि Espresso Test Recorder के साथ पीछे से काम करने की सुविधा का पता चल सके. रोबो टेस्ट हर क्रॉल की शुरुआत में ऐप्लिकेशन-अंडर-टेस्ट को सभी अनुमतियां दे देता है. इसलिए, यह कार्रवाई नहीं की जाती. अपनी रोबो स्क्रिप्ट में इस कार्रवाई का इस्तेमाल न करें.
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
"eventType": "PERMISSIONS_REQUEST"
|
-- |
स्क्रीन पर मौजूद सभी एलिमेंट को अनदेखा करना
इस कार्रवाई से, रोबो किसी भी स्क्रीन पर मौजूद उन सभी एलिमेंट को अनदेखा कर देता है जो रोबो स्क्रिप्ट को ट्रिगर करते हैं.
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
"eventType": "ALL_ELEMENTS_IGNORED"
|
-- |
नीचे रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जिसकी वजह से रोबो, स्क्रीन के सभी एलिमेंट को अनदेखा करता है:
{
"eventType": "ALL_ELEMENTS_IGNORED"
}
किसी एलिमेंट को अनदेखा करना
इस कार्रवाई से रोबो, बताए गए elementDescriptors
से मेल खाने वाले एलिमेंट (या एलिमेंट) को अनदेखा कर देता है.
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
"eventType": "ELEMENT_IGNORED"
|
-- |
elementDescriptors
|
Android यूज़र इंटरफ़ेस (यूआई) हैरारकी का इस्तेमाल करके, अनदेखा किए गए यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करता है. |
यह एट्रिब्यूट ज़रूरी नहीं है:
ignoreChildren
- अगरtrue
पर सेट किया जाता है, तो रोबो अनदेखा किए गए यूज़र इंटरफ़ेस(यूआई) विजेट के सभी डिसेंडेंट को भी अनदेखा कर देता है. डिफ़ॉल्ट रूप से, यहfalse
है.
नीचे रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जिसमें रोबो उन सभी एलिमेंट को अनदेखा करता है जिनके कॉन्टेंट की जानकारी "Avatar"
से शुरू होती है:
{
"eventType": "ELEMENT_IGNORED",
"elementDescriptors": [
{
"contentDescriptionRegex": "Avatar.*"
}
]
}
टेक्स्ट डालें
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
---|---|
eventType
|
यह बताता है कि रोबो स्क्रिप्ट ऐक्शन किस तरह का है. |
"eventType": "VIEW_TEXT_CHANGED"
|
दिए गए टेक्स्ट को टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट में इनपुट करता है. |
"eventType": "ENTER_TEXT"
|
दिए गए टेक्स्ट को टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट में डालता है और फिर
KEYCODE_ENTER इवेंट को इस यूज़र इंटरफ़ेस (यूआई) विजेट में भेजता है.
|
elementDescriptors
|
Android यूज़र इंटरफ़ेस (यूआई) की हैरारकी का इस्तेमाल करके, टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करता है. |
replacementText
|
टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट में डाला जाने वाला टेक्स्ट. |
रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण नीचे दिया गया है, जो रिसॉर्स आईडी "com.google.samples.apps.topeka:id/first_name"
वाले यूज़र इंटरफ़ेस (यूआई) विजेट में "John"
डालता है:
{
"eventType": "VIEW_TEXT_CHANGED",
"replacementText": "John",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
देर तक क्लिक करें
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
"eventType": "VIEW_LONG_CLICKED"
|
-- |
elementDescriptors
|
Android यूज़र इंटरफ़ेस (यूआई) की हैरारकी का इस्तेमाल करके, टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करता है. visionText के साथ
खास.
|
visionText
|
ओसीआर का इस्तेमाल करके, देर तक क्लिक किए गए एलिमेंट की पहचान करता है. elementDescriptors के साथ म्यूचुअली एक्सक्लूसिव.
|
यह एट्रिब्यूट ज़रूरी नहीं है:
delayTime
- इससे पता चलता है कि किसी लंबे क्लिक को दबाकर रखने की अवधि कितनी मिलीसेकंड में होती है.
यहां रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जो कॉन्टेंट के ब्यौरे "Avatar 8"
वाले यूज़र इंटरफ़ेस (यूआई) विजेट पर पांच सेकंड तक क्लिक करता है:
{
"eventType": "VIEW_LONG_CLICKED",
"elementDescriptors": [
{
"contentDescription": "Avatar 8"
}
],
"delayTime": 5000
}
एक पॉइंट के जेस्चर का इस्तेमाल करें
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
---|---|
"eventType": "ONE_POINT_GESTURE"
|
-- |
coordinates
|
एक पॉइंट वाले जेस्चर के लिए दो निर्देशांक, जो प्रतिशत या पिक्सल के तौर पर "(x1,y1)->(x2,y2)" फ़ॉर्मैट में होते हैं. |
यह एट्रिब्यूट ज़रूरी नहीं है:
dragAndDrop
- अगरtrue
पर सेट है, तो एक पॉइंट वाले जेस्चर की मदद से, 'खींचें और छोड़ें' कार्रवाई की जाती है. डिफ़ॉल्ट रूप से, यहfalse
है.
नीचे रोबो स्क्रिप्ट के एक पॉइंट वाले जेस्चर ऐक्शन का उदाहरण दिया गया है, जिसमें नीचे की ओर स्वाइप करने की सुविधा होती है:
{
"eventType": "ONE_POINT_GESTURE",
"coordinates": "(50%,25%)->(50%,75%)"
}
दो पॉइंट वाले जेस्चर का इस्तेमाल करें
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
---|---|
"eventType": "TWO_POINT_GESTURE"
|
-- |
coordinates
|
दो पॉइंट वाले जेस्चर के लिए चार निर्देशांक, जो प्रतिशत या पिक्सल के रूप में "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" फ़ॉर्मैट में होते हैं. |
नीचे रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जो पिंच आउट जेस्चर करता है:
{
"eventType": "TWO_POINT_GESTURE",
"coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}
IME से कार्रवाई करें
इस कार्रवाई से, तय किए गए टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट के लिए, इनपुट के तरीके के एडिटर (IME) पर 'आगे बढ़ें', 'हो गया', और 'खोजें' बटन पर मौजूदा कार्रवाई बटन दबाया जाता है.
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
---|---|
"eventType": "PRESSED_EDITOR_ACTION"
|
-- |
elementDescriptors
|
Android यूज़र इंटरफ़ेस (यूआई) की हैरारकी का इस्तेमाल करके, टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करता है. |
यहां रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जो संसाधन आईडी "com.google.samples.apps.topeka:id/first_name"
वाले यूज़र इंटरफ़ेस (यूआई) विजेट पर IME ऐक्शन करता है:
{
"eventType": "PRESSED_EDITOR_ACTION",
"elementDescriptors": [
{
"resourceId": "com.google.samples.apps.topeka:id/first_name"
}
]
}
'वापस जाएं' बटन दबाएं
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
eventType
|
यह बताता है कि रोबो स्क्रिप्ट ऐक्शन किस तरह का है. |
"eventType": "PRESSED_BACK"
|
डिवाइस पर KEYCODE_BACK इवेंट भेजता है.
|
"eventType": "PRESSED_BACK_EMULATOR_28"
|
Android Studio में रोबो स्क्रिप्ट रिकॉर्डर इसका इस्तेमाल एम्युलेटर एपीआई 28 पर वापस जाने के लिए करता है. |
रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण नीचे दिया गया है, जो वापस दबाता है:
{
"eventType": "PRESSED_BACK"
}
होम बटन दबाएं
ऐसा करने से, डिवाइस पर KEYCODE_HOME
इवेंट भेजा जाता है.
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
"eventType": "GO_HOME"
|
-- |
नीचे रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जो होम बटन को दबाता है:
{
"eventType": "GO_HOME"
}
किसी एलिमेंट को स्क्रोल करके देखना
इस कार्रवाई से, रोबो टेस्ट को, बताए गए elementDescriptors
से मेल खाने वाले यूज़र इंटरफ़ेस (यूआई) विजेट को स्क्रोल करके फ़ॉरवर्ड करना होता है. ऐसा तब तक होता है, जब तक स्क्रीन पर childElementDescriptors
से मेल खाने वाला यूज़र इंटरफ़ेस (यूआई) विजेट मौजूद नहीं होता या स्क्रोल किए गए विजेट को स्क्रोल नहीं किया जा सकता या स्क्रोल करने की तय सीमा पूरी नहीं हो जाती.
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
"eventType": "ELEMENT_SCROLL_INTO_VIEW"
|
-- |
elementDescriptors
|
Android यूज़र इंटरफ़ेस (यूआई) की हैरारकी का इस्तेमाल करके, स्क्रोल किए गए यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करता है. |
childElementDescriptors
|
यह Android यूज़र इंटरफ़ेस (यूआई) हैरारकी का इस्तेमाल करके, स्क्रोल करने के लिए यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करता है. |
यहां रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जो संसाधन आईडी "my.app.package:id/scrollable_card_container"
वाले यूज़र इंटरफ़ेस (यूआई) विजेट को तब तक स्क्रोल करता है, जब तक स्क्रीन पर "Orange"
टेक्स्ट वाला यूज़र इंटरफ़ेस (यूआई) विजेट मौजूद नहीं होता (या इससे ज़्यादा स्क्रोल नहीं किए जा सकते या 50 से ज़्यादा स्क्रोल नहीं किए जा सकते):
{
"eventType": "ELEMENT_SCROLL_INTO_VIEW",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/scrollable_card_container"
}
],
"childElementDescriptors": [
{
"text": "Orange"
}
]
}
स्वाइप
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
---|---|
"eventType": "VIEW_SWIPED"
|
-- |
swipeDirection
|
स्वाइप की दिशा बताता है:
|
elementDescriptors
|
Android यूज़र इंटरफ़ेस (यूआई) की हैरारकी का इस्तेमाल करके, टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करता है. |
यहां रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जो रिसॉर्स आईडी "my.app.package:id/custom_content"
वाले यूज़र इंटरफ़ेस (यूआई) विजेट को ऊपर की ओर स्वाइप करता है:
{
"eventType": "VIEW_SWIPED",
"swipeDirection": "Up",
"elementDescriptors": [
{
"resourceId": "my.app.package:id/custom_content"
}
]
}
स्क्रीनशॉट लेने के लिए
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
"eventType": "TAKE_SCREENSHOT"
|
-- |
screenshotName
|
स्क्रीनशॉट फ़ाइल का नाम बताता है. |
रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण नीचे दिया गया है, जो स्क्रीनशॉट लेता है:
{
"eventType": "TAKE_SCREENSHOT",
"screenshotName": "my_screenshot"
}
स्क्रीन पर किसी बिंदु पर टैप करें
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
---|---|
"eventType": "POINT_TAP"
|
-- |
pointTapXCoordinate
|
टैप किए गए पॉइंट का पिक्सल X कोऑर्डिनेट. इन्हें pointTapXPercent और pointTapYPercent के साथ, दोनों के लिए खास तौर पर उपलब्ध कराया जाता है.
|
pointTapYCoordinate
|
टैप किए गए पॉइंट का पिक्सल Y कोऑर्डिनेट. इन्हें pointTapXPercent और pointTapYPercent के साथ, दोनों के लिए खास तौर पर उपलब्ध कराया जाता है.
|
pointTapXPercent
|
टैप किए गए पॉइंट का प्रतिशत X निर्देशांक. इन्हें pointTapXCoordinate और pointTapYCoordinate के साथ, दोनों के लिए खास तौर पर उपलब्ध कराया जाता है.
|
pointTapYPercent
|
टैप किए गए पॉइंट का प्रतिशत Y निर्देशांक. इन्हें pointTapXCoordinate और pointTapYCoordinate के साथ, दोनों के लिए खास तौर पर उपलब्ध कराया जाता है.
|
यहां रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जो स्क्रीन के बीच में टैप करता है:
{
"eventType": "POINT_TAP",
"pointTapXPercent": 50,
"pointTapYPercent": 50
}
एलिमेंट में किसी पॉइंट पर टैप करें
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
"eventType": "POINT_TAP_ELEMENT"
|
-- |
pointTapXPercent
|
लक्ष्य एलीमेंट में प्रतिशत X निर्देशांक. |
pointTapYPercent
|
टारगेट एलिमेंट में Y निर्देशांक का प्रतिशत. |
elementDescriptors
|
Android यूज़र इंटरफ़ेस (यूआई) हैरारकी का इस्तेमाल करके, टारगेट यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करता है. |
रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण नीचे दिया गया है, जो सीकबार के स्लाइडर को दाईं ओर ले जाता है:
{
"eventType": "POINT_TAP_ELEMENT",
"pointTapXPercent": 80,
"pointTapYPercent": 50,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/my_seekbar"
}
]
}
क्रॉल करना बंद करें
इस कार्रवाई से रोबो टेस्ट रुक जाता है.
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
---|---|
"eventType": "TERMINATE_CRAWL"
|
-- |
रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण नीचे दिया गया है, जो रोबो टेस्ट को रोकता है:
{
"eventType": "TERMINATE_CRAWL"
}
इंतज़ार करें
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
"eventType": "DELAYED_MESSAGE_POSTED"
|
-- |
delayTime
|
बताता है कि कितने समय तक इंतज़ार करना है. यह जानकारी मिलीसेकंड में दी जाती है. |
यहां रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जो तीन सेकंड तक इंतज़ार करता है:
{
"eventType": "DELAYED_MESSAGE_POSTED",
"delayTime": 3000
}
किसी एलिमेंट का इंतज़ार करें
इस कार्रवाई से, तय किए गए टाइम आउट तक, स्क्रीन पर किसी एलिमेंट के दिखने का रोबो टेस्ट इंतज़ार करता है.
इस टेबल में ज़रूरी एट्रिब्यूट दिए गए हैं:
विशेषता | जानकारी |
"eventType": "WAIT_FOR_ELEMENT"
|
-- |
delayTime
|
इंतज़ार का समय मिलीसेकंड में बताता है. |
elementDescriptors
|
Android यूज़र इंटरफ़ेस (यूआई) हैरारकी का इस्तेमाल करके, उस यूज़र इंटरफ़ेस (यूआई) विजेट की पहचान करता है जिसकी इंतज़ार कर रहा है. |
यहां रोबो स्क्रिप्ट ऐक्शन का एक उदाहरण दिया गया है, जो स्क्रीन पर संसाधन आईडी "my.app.package:id/confirmation_button"
वाले यूज़र इंटरफ़ेस (यूआई) विजेट के लिए, 30 सेकंड तक इंतज़ार करता है:
{
"eventType": "WAIT_FOR_ELEMENT",
"delayTime": 30000,
"elementDescriptors": [
{
"resourceId": "my.app.package:id/confirmation_button"
}
]
}