Robo স্ক্রিপ্ট রেফারেন্স গাইড

এই ডকুমেন্ট Robo স্ক্রিপ্ট সম্পর্কে রেফারেন্স তথ্য প্রদান করে, যার মধ্যে গঠন, ক্ষমতা, ব্যবহার, রেকর্ডিং এবং অ্যাকশন অন্তর্ভুক্ত। Robo স্ক্রিপ্ট হল এমন টেস্ট যা মোবাইল অ্যাপের জন্য ম্যানুয়াল কোয়ালিটি অ্যাস্যুরেন্স (QA) টাস্ক অটোমেট করে এবং কন্টিনিউয়াস ইন্টিগ্রেশন (CI) ও প্রি-লঞ্চ টেস্টিং স্ট্র্যাটেজি চালু করে। Robo স্ক্রিপ্ট হল একটি JSON ফাইল যা ইউজার ইন্টারফেস (UI) এবং অন্যান্য অ্যাকশনের ক্রম বর্ণনা করে।

আপনি নিম্নলিখিত উপায়ে Robo স্ক্রিপ্ট তৈরি করতে পারবেন:

  • Robo স্ক্রিপ্ট রেকর্ডিং ফিচার ব্যবহার করুন। (শুধুমাত্র Android-এ উপলভ্য)

  • ম্যানুয়ালি Robo স্ক্রিপ্ট তৈরি করুন। (Android এবং iOS+)

  • Robo স্ক্রিপ্ট রেকর্ড করুন এবং তারপর এটি ম্যানুয়ালি এডিট করুন। (শুধুমাত্র Android-এ উপলভ্য)

Robo স্ক্রিপ্ট ব্যবহার করার ব্যাপারে আরও জানতে, Robo স্ক্রিপ্ট রান করুন দেখুন।

ভূমিকা

অ্যাপ-আন্ডার-টেস্ট Android অ্যাপ্লিকেশন প্যাকেজের (APK) মতো অন্যান্য ইনপুটের পাশাপাশি রোবো টেস্টের জন্য রোবো স্ক্রিপ্ট প্রদান করা হয়।

নিচে Robo স্ক্রিপ্টের একটি উদাহরণ দেওয়া হল যা ব্যবহারকারীকে কোনও অ্যাপে সাইন-ইন করায়, টেস্ট-করা-হচ্ছে-এমন-অ্যাপ চালু হলে এটি ট্রিগার হয়:

[
  {
    "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"
          }
        ]
      }
    ]
  }
]

কোনও ফাইলে একটিই Robo স্ক্রিপ্ট থাকলে এবং সেটির ডিফল্ট app_under_test_shown ট্রিগার করার শর্ত থাকলে, যেমন উপরের উদাহরণে দেখানো হয়েছে, তাহলে আপনি আরও সহজ ফর্ম্যাট ব্যবহার করে ফাইলে Robo স্ক্রিপ্ট নির্দিষ্ট করতে পারবেন - ঠিক যেমন সেটির অ্যাকশনের ক্রম:

[
  {
    "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"
      }
    ]
  }
]

Robo স্ক্রিপ্টের জন্য iOS+ সাপোর্ট

iOS+ (বিটা)-এর জন্য Robo-তে Robo স্ক্রিপ্টের জন্য সীমিত সহায়তা আছে। iOS+-এর জন্য Robo স্ক্রিপ্ট সিনট্যাক্স Android সিনট্যাক্সের মতোই এবং কাজ করে এমন iOS+ ফিচারগুলি তাদের Android কাউন্টারপার্টের মতোই আচরণ করে।

iOS+-এ নিম্নলিখিত অ্যাকশনগুলি কাজ করে:

  • অ্যাসার্শন
  • ক্লিক
  • দীর্ঘ সময় ধরে ক্লিক করুন
  • সোয়াইপ করুন
  • সব এলিমেন্ট এড়িয়ে যান
  • অপেক্ষা
  • স্ক্রিনশট নিন
  • ক্রল বন্ধ করুন

iOS+-এ এলিমেন্ট ডেসক্রিপ্টরে নিম্নলিখিত শনাক্তকরণ অ্যাট্রিবিউট কাজ করে:

  • ক্লাসের নাম
  • পূর্বপুরুষের ক্লাসের নাম
  • কন্টেন্টের বিবরণ (এবং রেগুলার এক্সপ্রেশন)
  • টেক্সট (এবং regex)

iOS+-এ নিম্নলিখিত কনটেক্সট ডেসক্রিপ্টরে ট্রিগার করার শর্ত কাজ করে:

  • পরীক্ষা করা হচ্ছে এমন অ্যাপ দেখানো হয়েছে
  • এলিমেন্ট উপস্থিত আছে
  • নন-রোবো স্ক্রিপ্ট অ্যাকশন করা হয়েছে

গঠন

Robo স্ক্রিপ্টে একাধিক অ্যাট্রিবিউট থাকে যা Robo কীভাবে এটি এক্সিকিউট করে তা বর্ণনা করে। এইসব অ্যাট্রিবিউটের বেশিরভাগই আগে থেকে নির্ধারিত ডিফল্ট ভ্যালু সহ ঐচ্ছিক:

অ্যাট্রিবিউট বিবরণ
id ক্রল আউটপুটে এই রোবো স্ক্রিপ্ট ট্র্যাক করতে সাহায্য করে এমন একটি পূর্ণসংখ্যা। Robo-তে নিজস্ব id সহ বিল্ট-ইন Robo স্ক্রিপ্ট আছে। যদিও বিভিন্ন Robo স্ক্রিপ্টে একই id তাদের আচরণকে প্রভাবিত করে না, ক্রল আউটপুটে এই Robo স্ক্রিপ্ট থেকে অ্যাকশন আলাদা করা চ্যালেঞ্জিং হতে পারে। কোনও দ্বন্দ্ব এড়াতে আপনার Robo স্ক্রিপ্টের জন্য 1000 বা তার বেশি অনন্য id অ্যাসাইন করার সাজেশন দিই।
description id-এর মতো কিন্তু আরও বর্ণনামূলক।
crawlStage ক্রল রোবোর যে পর্যায়ে এই রোবো স্ক্রিপ্ট প্রয়োগ করা হয়। ডিফল্ট হিসেবে, এটি হল প্রধান ক্রল স্টেজ।
priority অন্যান্য Robo স্ক্রিপ্টের তুলনায় এই Robo স্ক্রিপ্টের অগ্রাধিকার। ডিফল্ট হিসেবে, সব রোবো স্ক্রিপ্টের অগ্রাধিকার 1 থাকে।
maxNumberOfRuns ক্রল করার সময় Robo কতবার এই Robo স্ক্রিপ্ট এক্সিকিউট করতে পারবে তা নির্দিষ্ট করে। ডিফল্ট হিসেবে, Robo একবার Robo স্ক্রিপ্ট এক্সিকিউট করতে পারে।
contextDescriptor এই রোবো স্ক্রিপ্ট ট্রিগার করে এমন প্রসঙ্গ বা শর্ত বর্ণনা করে। বাদ দেওয়া হলে, এই Robo স্ক্রিপ্টের ট্রিগার করার শর্ত সবসময় পূরণ করা হয়েছে বলে বিবেচনা করা হয়; অন্যভাবে বলতে গেলে, Robo স্ক্রিপ্ট শর্তহীন।
actions এই Robo স্ক্রিপ্টের সব অ্যাকশন।

একটি ফাইলে এক বা একাধিক Robo স্ক্রিপ্টের সংগ্রহ থাকে।

নিচে দুটি শর্তহীন রোবো স্ক্রিপ্ট সহ একটি ফাইলের উদাহরণ দেওয়া হল, যার প্রতিটিতে একটি করে অ্যাকশন আছে যা ক্রল শুরু হওয়ার সময় একবার এক্সিকিউট করা হয়:

[
  {
    "id": 1000,
    "description": "My first Robo script",
    "actions": [
      {
        "eventType": "DISABLE_KEYBOARD"
      }
    ]
  },
  {
    "id": 1001,
    "description": "My second Robo script",
    "actions": [
      {
        "eventType": "PRESSED_BACK"
      }
    ]
  }
]

কনটেক্সট ডেসক্রিপটর

একটি প্রসঙ্গ বর্ণনাকারী প্রসঙ্গ বা শর্তকে সংজ্ঞায়িত করে যা এক বা একাধিক বৈশিষ্ট্যের সংমিশ্রণ ব্যবহার করে একটি রোবো স্ক্রিপ্টকে ট্রিগার করে:

অ্যাট্রিবিউট বিবরণ
"condition": "always" সবসময় Robo স্ক্রিপ্ট ট্রিগার করে।
"condition": "element_present" স্ক্রিনে elementDescriptors-এর সাথে মেলে এমন UI উইজেট বা visionText-এর মাধ্যমে নির্দিষ্ট করা টেক্সট আছে কিনা তা চেক করে।
"condition": "element_disabled" স্ক্রিনে elementDescriptors-এর সাথে ম্যাচ করে এমন UI উইজেট আছে কিনা এবং সেটির সাথে ইন্টার‍্যাক্ট করা যায় কিনা তা চেক করে।
"condition": "element_checked" elementDescriptors-এর সাথে ম্যাচ করে এমন UI উইজেট স্ক্রিনে আছে কিনা এবং সেটি চেক করা আছে কিনা তা চেক করে।
"condition": "app_under_test_shown" পরীক্ষা করা হচ্ছে এমন অ্যাপ ফোরগ্রাউন্ডে চলছে কিনা তা চেক করে।
"condition": "default_launcher_shown" ডিভাইসের হোম স্ক্রিন দেখা যাচ্ছে কিনা তা চেক করে, যার অর্থ হল কোনও অ্যাপ ফোরগ্রাউন্ডে চলছে না।
"condition": "non_roboscript_action_performed" রোবো টেস্টের মাধ্যমে করা শেষ nonRoboscriptActionCountটি পরপর অ্যাকশন রোবো স্ক্রিপ্ট অ্যাকশন কিনা তা চেক করে।
negateCondition true-এ সেট করা থাকলে, condition-কে বাতিল করে। যেমন, আপনি এই অ্যাট্রিবিউট ব্যবহার করে চেক করতে পারেন যে স্ক্রিনে UI উইজেট নেই অথবা টেস্ট করা হচ্ছে এমন অ্যাপ ফোরগ্রাউন্ডে চলছে না।
elementDescriptors স্ক্রিনে UI উইজেট শনাক্ত করে এমন এক বা একাধিক এলিমেন্ট ডেসক্রিপ্টর। এটি element_present, element_disabled এবং element_checked শর্তাবলীর সাথে কম্বিনেশন হিসেবে ব্যবহার করা হয়। visionText-এর সাথে পারস্পরিকভাবে এক্সক্লুসিভ। আরও তথ্যের জন্য, এলিমেন্ট ডেসক্রিপ্টর দেখুন।
visionText অপটিকাল ক্যারেক্টার রেকগনিশন (OCR) API ব্যবহার করে স্ক্রিনে দেখানো টেক্সট শনাক্ত করা হয়। visionText, element_present শর্তের সাথে একত্রে ব্যবহার করা হয়। elementDescriptors-এর সাথে মিউচুয়ালি এক্সক্লুসিভ।
nonRoboscriptActionCount আগে করা পরপর নন-রোবো স্ক্রিপ্ট অ্যাকশনের সংখ্যা। প্রতিটি nonRoboscriptActionCount Robo অ্যাকশনের পরে Robo স্ক্রিপ্ট ট্রিগার করতে non_roboscript_action_performed শর্তের সাথে এটি ব্যবহার করা হয়। ডিফল্ট হিসেবে, এটি 1।

নিচে Robo স্ক্রিপ্টের একটি উদাহরণ দেওয়া হল যা স্ক্রিনে রিসোর্স আইডি "my.app.package:id/page_header" সহ UI উইজেট উপস্থিত থাকার কারণে ট্রিগার হয়:

{
  "id": 1000,
  "contextDescriptor": {
    "condition": "element_present",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/page_header"
      }
    ]
  },
  "actions": [
    {
      "eventType": "VIEW_CLICKED",
      "elementDescriptors": [
        {
          "text": "Settings"
        }
      ]
    }
  ]
}

নিচে Robo স্ক্রিপ্টের একটি উদাহরণ দেওয়া হল যা "Privacy Policy" অপটিক্যাল ক্যারেক্টার রেকগনিশন (OCR) দ্বারা শনাক্ত করা হলে ট্রিগার হয়:

{
  "id": 1000,
  "description": "Vision text Robo script",
  "contextDescriptor": {
    "condition": "element_present",
    "visionText": "Privacy Policy"
  },
  "actions": [
    {
      "eventType": "VIEW_CLICKED",
      "visionText": "Privacy Policy"
    }
  ]
}

নিচে Robo স্ক্রিপ্টের একটি উদাহরণ দেওয়া হল যা প্রতিটি নন-স্ক্রিপ্ট Robo অ্যাকশনের পরে ৫ সেকেন্ড অপেক্ষা করে:

{
  "contextDescriptor": {
    "condition": "non_roboscript_action_performed"
  },
  "maxNumberOfRuns" : 1000,
  "actions" : [
    {
      "eventType" : "WAIT",
      "delayTime" : 5000
    }]
}

ক্রিয়াসমূহ

Robo স্ক্রিপ্টের প্রতিটি অ্যাকশন এক বা একাধিক অ্যাট্রিবিউট-ভ্যালু পেয়ারের বান্ডেল হিসেবে দেখানো হয়, যা নিম্নলিখিত সারণীতে বর্ণনা করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
eventType অ্যাকশনের ধরন নির্দিষ্ট করে, যেমন, ক্লিক, টেক্সট এডিট ইত্যাদি। প্রতিটি অ্যাকশনের জন্য প্রয়োজন।
elementDescriptors UI উইজেট শনাক্ত করে এমন ডেসক্রিপ্টর। টার্গেট UI উইজেট আছে এমন সব অ্যাকশনের জন্য প্রয়োজন, যেমন কোনও নির্দিষ্ট বোতামে ক্লিক করা।
optional true-এ সেট করা থাকলে, এই অ্যাকশনটি করা না গেলে এড়িয়ে যাওয়া হয়। যেমন, স্ক্রিনে টার্গেট UI উইজেট খুঁজে না পেলে এই অ্যাকশন এড়িয়ে যাওয়া হয়– তবে এর ফলে Robo স্ক্রিপ্ট বন্ধ হয়ে যায় না। ডিফল্ট হিসেবে, ভ্যালু হল false।
replacementText টার্গেট UI উইজেটে ইনপুট করার জন্য টেক্সট। টেক্সট এডিট করার অ্যাকশনের জন্য প্রয়োজন।
swipeDirection সোয়াইপের দিক নির্দিষ্ট করে। সোয়াইপ অ্যাকশনের জন্য প্রয়োজন।
delayTime কতক্ষণ অপেক্ষা করতে হবে তা মিলিসেকেন্ডে উল্লেখ করে। অপেক্ষা করার অ্যাকশনের জন্য প্রয়োজন।
pointTapXCoordinate ও pointTapYCoordinate ট্যাপ করা পয়েন্টের পিক্সেল X ও Y কোঅর্ডিনেট। pointTapXPercent এবং pointTapYPercent-এর সাথে পরস্পর স্বতন্ত্র। পয়েন্ট ট্যাপ অ্যাকশনের জন্য প্রয়োজন।
pointTapXPercent ও pointTapYPercent ট্যাপ করা পয়েন্টের X ও Y কোঅর্ডিনেটের শতাংশ। pointTapXCoordinate এবং pointTapYCoordinate-এর সাথে পরস্পর স্বতন্ত্র। পয়েন্ট ট্যাপ অ্যাকশনের জন্য প্রয়োজন।

নিচে টার্গেট UI উইজেট ছাড়া দুটি অ্যাকশন সহ রোবো স্ক্রিপ্টের উদাহরণ দেওয়া হল, যার অর্থ হল এইসব অ্যাকশন নির্দিষ্ট UI উইজেটে কাজ করে না:

[
  {
    "eventType": "WAIT",
    "delayTime": 3000
  },
  {
    "eventType": "PRESSED_BACK"
  }
]

এলিমেন্ট ডেসক্রিপ্টর

এলিমেন্ট ডেসক্রিপ্টর নিম্নলিখিত শনাক্তকরণ অ্যাট্রিবিউটের মধ্যে এক বা একাধিক ব্যবহার করে UI উইজেট শনাক্ত করে:

অ্যাট্রিবিউট বিবরণ
className –
ancestorClassName এলিমেন্টের UI হায়ারার্কি অ্যানসেস্টরের ক্লাস নেম। এলিমেন্টের UI হায়ারার্কিতে যেকোনও প্যারেন্ট নোড হল পূর্বসূরি, যার মধ্যে এলিমেন্ট নিজেই অন্তর্ভুক্ত।
resourceId –
resourceIdRegex resourceId-এর সাথে ম্যাচ করার জন্য Java রেগুলার এক্সপ্রেশন।
contentDescription –
contentDescriptionRegex contentDescription-এর সাথে ম্যাচ করার জন্য Java রেগুলার এক্সপ্রেশন।
text (যা স্ক্রিনে দেখা যায়) –
textRegex text-এর সাথে ম্যাচ করার জন্য Java রেগুলার এক্সপ্রেশন।
groupViewChildPosition, recyclerViewChildPosition, অথবা adapterViewChildPosition UI উইজেটের পেরেন্ট উইজেটের ধরনের উপর নির্ভর করে তার চাইল্ড পজিশন দেখায়।

প্রায়ই, এইসব অ্যাট্রিবিউট সংজ্ঞায়িত করা থাকে না, যেমন, কোনও বোতামে টেক্সট ও কন্টেন্টের বিবরণ নাও থাকতে পারে। কিছু অ্যাট্রিবিউট ভ্যালু থাকলেও, সেগুলি কোনও অ্যাপ স্ক্রিনে (resourceId সহ) অনন্য নাও হতে পারে।

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

নিচে টেক্সট পরিবর্তন ও ক্লিক অ্যাকশন সহ রোবো স্ক্রিপ্টের উদাহরণ দেওয়া হল, যেখানে আপনাকে প্রদত্ত এলিমেন্ট ডেসক্রিপ্টর ব্যবহার করে টার্গেট UI উইজেট শনাক্ত করতে হবে:

[
  {
    "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"
      }
    ]
  }
]

এক্সিকিউশন সংক্রান্ত বিকল্প

আপনি চাইলে, Robo স্ক্রিপ্টে অ্যাকশনের তালিকার আগে JSON অবজেক্ট যোগ করতে পারেন। এই অবজেক্ট Robo স্ক্রিপ্ট চালানোর বিকল্পগুলি নির্দিষ্ট করে। এই কনফিগারেশন হেডার roboscript কীওয়ার্ড দিয়ে শুরু হয় এবং তারপরে পছন্দসই এক্সিকিউশন বিকল্পের JSON উপস্থাপনা থাকে।

Robo স্ক্রিপ্ট নিম্নলিখিত এক্সিকিউশন বিকল্পগুলি সমর্থন করে:

  • executionMode - Robo স্ক্রিপ্ট চলাকালীন প্রয়োগ করা এক্সিকিউশন বিকল্প:
    • strict - true-এ সেট করা থাকলে, Robo স্ক্রিপ্ট আংশিক ম্যাচিং, বর্তমান অ্যাকশন এড়িয়ে যাওয়া এবং সাসপেনশন প্রয়োগ করে না। অর্থাৎ, Robo স্ক্রিপ্ট একটি সাধারণ ইন্সট্রুমেন্টেশন টেস্ট হিসেবে এক্সিকিউট করা হয় এবং এর কোনও অ্যাকশন পারফর্ম করা না গেলেই এটি ব্যর্থ হয়। ডিফল্ট হিসেবে, এটি false।
    • dismiss_popups - true-এ সেট করা থাকলে, রোবো টেস্ট, রোবো স্ক্রিপ্ট পারফর্ম করার সময়, এমনকি strict মোডেও, যেকোনও অপ্রত্যাশিত ডায়ালগ বাতিল করে দেয়। strict মোডে না থাকলে এই বিকল্পের কোনও প্রভাব থাকবে না। ডিফল্ট হিসেবে, এটি false।
    • notify - false-এ সেট করা থাকলে, Robo স্ক্রিপ্ট তার এক্সিকিউশনের শুরুতে এবং শেষে অন-স্ক্রিন বিজ্ঞপ্তি দেখায় না। ডিফল্ট হিসেবে, এটি true।
  • postscript - রোবো স্ক্রিপ্ট সম্পূর্ণ হওয়ার পরে প্রয়োগ করা এক্সিকিউশন বিকল্প:
    • terminate - true-এ সেট করা থাকলে, Robo স্ক্রিপ্ট সম্পূর্ণ হওয়ার পরে Robo টেস্ট ক্রল করা বন্ধ করে দেয়। ডিফল্ট হিসেবে, এটি false।

নিচে Robo স্ক্রিপ্টের উদাহরণ দেওয়া হল যা অন-স্ক্রিন বিজ্ঞপ্তি ছাড়াই strict মোডে চালানো হয়। এটি তিন সেকেন্ড অপেক্ষা করে, তারপর ক্রল বন্ধ হয়ে যায়:

"roboscript": {
  "executionMode": {
    "strict": true,
    "notify": false
  },
  "postscript": {
    "terminate": true
  }
}
[
  {
    "eventType": "WAIT",
    "delayTime": 3000
  }
]

টেমপ্লেট প্যারামিটার

টেমপ্লেট প্যারামিটার হল Robo স্ক্রিপ্টের একটি প্লেসহোল্ডার যা Robo টেস্ট, Robo স্ক্রিপ্ট এক্সিকিউট করার জন্য লোড করার সময় আসল ভ্যালু দিয়ে পরিবর্তন করা হয়। টেমপ্লেট প্যারামিটারের শুরুতে ডবল আন্ডারস্কোর ও তারপরে শতাংশ চিহ্ন থাকে, এবং শেষে শতাংশ চিহ্ন ও তারপরে ডবল আন্ডারস্কোর থাকে।

Robo স্ক্রিপ্ট নিম্নলিখিত টেমপ্লেট প্যারামিটার সাপোর্ট করে:

  • __%APP_PACKAGE_NAME%__ - টেস্ট করা হচ্ছে এমন অ্যাপের প্যাকেজের নাম।

নিচে Robo স্ক্রিপ্টের একটি উদাহরণ দেওয়া হল যা টেস্ট-করা-অ্যাপের প্রসেস বন্ধ করে দেয়:

[
  {
    "eventType": "ADB_SHELL_COMMAND",
    "command": "am force-stop __%APP_PACKAGE_NAME%__"
  }
]

কমেন্ট

Robo স্ক্রিপ্টে কমেন্ট লাইন থাকতে পারে, যেগুলি # বা // দিয়ে শুরু হয়।

নিচে কয়েকটি কমেন্ট সহ Robo স্ক্রিপ্টের উদাহরণ দেওয়া হল:

# Confirm a user account.
[
  {
    // Click the DONE button.
    "eventType": "VIEW_CLICKED",
    "elementDescriptors": [
      {
        "resourceId": "com.google.samples.apps.topeka:id/done"
      }
    ]
  }
]

কেপেবিলিটি

ডিফল্ট হিসেবে, Robo স্ক্রিপ্টের সব অ্যাকশন সম্পূর্ণ (বা অন্তত চেষ্টা) না হওয়া পর্যন্ত Robo স্ক্রিপ্ট অ্যাক্টিভ থাকে। রোবো টেস্ট, কোনও অ্যাকশন পারফর্ম করার জন্য বেছে নেওয়ার সময়, রোবো স্ক্রিপ্ট অ্যাকশনের সাথে ম্যাচ করার চেষ্টা চালিয়ে যায়। রোবো স্ক্রিপ্ট রোবাস্টনেস বাড়াতে নিম্নলিখিত কৌশলগুলি ব্যবহার করে:

কৌশল বিবরণ
আংশিক ম্যাচিং বর্তমান রোবো স্ক্রিপ্ট অ্যাকশন সম্পূর্ণভাবে ম্যাচ না করলে, ম্যাচিংয়ের মাপকাঠি শিথিল করা হয় এবং ম্যাচিংয়ের জন্য আবার চেষ্টা করা হয়। আংশিক ম্যাচিং রোবো স্ক্রিপ্ট অ্যাকশনের টার্গেট UI উইজেট ম্যাচ করার সময় সবচেয়ে বাইরের এলিমেন্ট ডেসক্রিপ্টর বিবেচনা করে না।

আংশিক ম্যাচিং সফল হলে, সংশ্লিষ্ট রোবো স্ক্রিপ্ট অ্যাকশন স্বাভাবিকভাবে পারফর্ম করা হয়। এই টেকনিক এমন পরিস্থিতিতে সাহায্য করে যেখানে অ্যাপের স্ট্রাকচার পরিবর্তন হয়, যেমন, অ্যাপের বিভিন্ন ভার্সনের মধ্যে, যখন স্ক্রিনের এলিমেন্ট আবার সাজানো হয়।

বর্তমান অ্যাকশন এড়িয়ে যান বর্তমান Robo স্ক্রিপ্ট অ্যাকশন সম্পূর্ণ বা আংশিকভাবে ম্যাচ না করলে, Robo পরবর্তী Robo স্ক্রিপ্ট অ্যাকশন ম্যাচ করার চেষ্টা করে। পরবর্তী অ্যাকশন সম্পূর্ণ বা আংশিকভাবে মিলে গেলে, রোবো টেস্ট বর্তমান রোবো স্ক্রিপ্ট অ্যাকশনটি এড়িয়ে যায় (এবং কখনও ফিরে আসে না) এবং পরবর্তী অ্যাকশনটি পারফর্ম করে।

এই টেকনিক সেইসব পরিস্থিতিতে সাহায্য করে যখন অ্যাপের আচরণ ভার্সনের মধ্যে পরিবর্তিত হয় বা অস্থির হয়, যেমন, যখন একটি বিরতিহীন ডায়ালগ Robo স্ক্রিপ্টের রেকর্ডিং বনাম রিপ্লে করার সময় বিভিন্ন স্ক্রিনে দেখা যেতে পারে।

সাসপেন্ড করা হয়েছে বর্তমান বা পরবর্তী রোবো স্ক্রিপ্ট অ্যাকশন সম্পূর্ণ বা আংশিকভাবে ম্যাচ না করলে, রোবো স্ক্রিপ্ট সাময়িকভাবে সাসপেন্ড করা হয় এবং রোবো টেস্ট অন্য স্ট্র্যাটেজি ব্যবহার করে পারফর্ম করার জন্য অ্যাকশন বেছে নেয়। এই অ্যাকশন সম্পূর্ণ হওয়ার পরে, রোবো টেস্ট আবার রোবো স্ক্রিপ্ট এক্সিকিউট করা শুরু করে।

বর্তমান বা পরবর্তী রোবো স্ক্রিপ্ট অ্যাকশন ম্যাচ না করা পর্যন্ত, যেকোনও সংখ্যক অ্যাকশনের জন্য রোবো স্ক্রিপ্ট সাসপেন্ড করা থাকে। তাই, রোবো টেস্টের জন্য রোবো স্ক্রিপ্টকে ভূমিকা হিসেবে ব্যবহার করার প্রয়োজন নেই এবং আপনি স্ট্যান্ডার্ড রোবো টেস্ট অ্যাকশনের সাথে রোবো স্ক্রিপ্ট অ্যাকশনকে মিশিয়ে দিতে পারেন। এই টেকনিক সেইসব পরিস্থিতিতে সাহায্য করে যখন অ্যাপের আচরণে কোনও সমস্যা হয়, অথবা অ্যাপের ভার্সনের মধ্যে পরিবর্তন এতটাই বেশি হয় যে রোবো টেস্টকে তার স্ট্যান্ডার্ড অ্যাকশনের মাধ্যমে "শূন্যস্থান পূরণ" করতে হয়।

অগ্রাধিকার

কোনও রোবো স্ক্রিপ্ট তার maxNumberOfRuns-এ পৌঁছে গেলে, প্রদত্ত ক্রলে এটি আর ট্রিগার করা যাবে না। বর্তমান প্রসঙ্গে একাধিক রোবো স্ক্রিপ্ট ট্রিগার করা হলে, নিম্নলিখিত ক্রমে রোবো স্ক্রিপ্ট বেছে নিয়ে অগ্রাধিকার দেওয়া হয়:

  1. contextDescriptor অ্যাট্রিবিউট আছে।
  2. সর্বোচ্চ priority আছে (ডিফল্ট হিসেবে, সব Robo স্ক্রিপ্টের একই এক্সিকিউশন priority 1 আছে)।
  3. Robo স্ক্রিপ্টের অগ্রাধিকার একই হলে, Robo স্ক্রিপ্টের তালিকায় এটি সবচেয়ে আগে দেখা যায়।

নিচে তিনটি রোবো স্ক্রিপ্ট সহ একটি ফাইলের উদাহরণ দেওয়া হল যেগুলি একই অ্যাকশন পারফর্ম করে এবং একই শর্তে ট্রিগার হয় - টেস্ট করা হচ্ছে এমন অ্যাপ ফোরগ্রাউন্ডে থাকে:

[
  {
    "id": 1000,
    "description": "Robo script 1",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "WAIT",
        "delayTime": 3000
      }
    ]
  },
  {
    "id": 1001,
    "description": "Robo script 2",
    "priority": "2",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "WAIT",
        "delayTime": 3000
      }
    ]
  },
  {
    "id": 1002,
    "description": "Robo script 3",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "WAIT",
        "delayTime": 3000
      }
    ]
  }
]

পরীক্ষা করা হচ্ছে এমন অ্যাপ ফোরগ্রাউন্ডে থাকলে, Robo নিম্নলিখিতগুলি ট্রিগার করে, এই ক্রমে:

  1. "Robo script 2" কারণ এটির অগ্রাধিকার সবচেয়ে বেশি।
  2. "Robo script 1" কারণ এটি একই অগ্রাধিকার সহ বাকি প্রযোজ্য Robo স্ক্রিপ্টের মধ্যে আগে দেখা যায়।
  3. শেষ প্রযোজ্য রোবো স্ক্রিপ্ট হিসেবে "Robo script 3"।

বারবার রান করা

ডিফল্ট হিসেবে, ক্রল করার সময় Robo সর্বাধিক একবার Robo স্ক্রিপ্ট ট্রিগার করে। এটি maxNumberOfRuns অ্যাট্রিবিউটের মাধ্যমে অ্যাডজাস্ট করা যেতে পারে।

নিচে Robo স্ক্রিপ্টের একটি উদাহরণ দেওয়া হল যা টেস্ট করা হচ্ছে এমন অ্যাপকে ব্যাকগ্রাউন্ডে ১০ বার পর্যন্ত নিয়ে আসে:

{
  "id": 1000,
  "maxNumberOfRuns": 10,
  "contextDescriptor": {
    "condition": "app_under_test_shown"
  },
  "actions": [
    {
      "eventType": "GO_HOME"
    }
  ]
}

ক্রল করার পর্যায়

কোনও Robo ক্রলের বিভিন্ন পর্যায়ে Robo স্ক্রিপ্ট প্রযোজ্য হয়:

ক্রল করার ধাপ বিবরণ
pre_crawl Robo লঞ্চ হওয়ার আগে এবং টেস্ট-করা-অ্যাপ ক্রল করা শুরু করার আগে।
post_crawl পরীক্ষা করা হচ্ছে এমন অ্যাপ Robo ক্রল করা শেষ করার পরে। A post_crawl রোবো স্ক্রিপ্টের সময়সীমা ১৫ সেকেন্ডের বেশি হলে চলবে না, অন্যথায় টাইমআউট হয়ে ক্রল বন্ধ হয়ে যেতে পারে।
crawl প্রধান ক্রল স্টেজ, যখন Robo অ্যাপ-আন্ডার-টেস্ট ক্রল করে।
close_screen যখন Robo কোনও স্ক্রিনে ফিরে আসার (ব্যাকট্র্যাক) চেষ্টা করে, যখন এই স্ক্রিনে সম্ভাব্য সব অ্যাকশন এক্সপ্লোর করা হয়। ডিফল্ট হিসেবে, Robo 'ফিরে যান' বোতাম প্রেস করে, যা কিছু পরিস্থিতিতে অবাঞ্ছিত।

Robo স্ক্রিপ্টের crawlStage অ্যাট্রিবিউট নির্দিষ্ট করা না থাকলে, এটি crawl হিসেবে ধরে নেওয়া হয়।

নিচে Robo স্ক্রিপ্টের একটি উদাহরণ দেওয়া হল যা Robo ক্রল করা শুরু করার আগে পরীক্ষা করা হচ্ছে এমন অ্যাপের ব্যবহারকারীর ডেটা মুছে দেয়:

{
  "id": 1000,
  "crawlStage": "pre_crawl",
  "actions": [
    {
      "eventType": "ADB_SHELL_COMMAND",
      "command": "pm clear __%APP_PACKAGE_NAME%__"
    }
  ]
}

নিচে Robo স্ক্রিপ্টের একটি উদাহরণ দেওয়া হল যা Robo-কে নির্দেশ দেয় যে কনফার্মেশন ডায়ালগ থেকে "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"
        }
      ]
    }
  ]
}

শর্তসাপেক্ষ অ্যাকশন

Robo স্ক্রিপ্টে শর্তসাপেক্ষ অ্যাকশন থাকতে পারে। শর্তাধীন অ্যাকশনের তিনটি অতিরিক্ত অ্যাট্রিবিউট আছে যা Robo কীভাবে সেগুলি পারফর্ম করে তা বর্ণনা করে:

অ্যাট্রিবিউট বিবরণ
priority এই শর্তাধীন অ্যাকশনের অগ্রাধিকার, এর মধ্যে থাকা রোবো স্ক্রিপ্টের অন্যান্য শর্তাধীন অ্যাকশনের তুলনায়। ডিফল্ট হিসেবে, সব শর্তাধীন অ্যাকশনের অগ্রাধিকার 1 হিসেবে সেট করা থাকে।
maxNumberOfRuns এই শর্তাধীন অ্যাকশনটি কতবার সম্পাদন করা যেতে পারে, যখন এটি ধারণকারী রোবো স্ক্রিপ্ট একবার কার্যকর করা হয়। ডিফল্ট হিসেবে, সমস্ত শর্তাধীন অ্যাকশন তাদের ধারণকারী রোবো স্ক্রিপ্টের একটি একক এক্সিকিউশনে সর্বাধিক একবার সম্পাদন করা যেতে পারে।
contextDescriptor এই শর্তাধীন অ্যাকশন ট্রিগার করে এমন প্রসঙ্গ/শর্ত। এটির স্ট্রাকচার একই রকম এবং Robo স্ক্রিপ্টের contextDescriptor-এর মতো একই ধরনের ক্ষমতা প্রদান করে

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

নিচে শর্তহীন রোবো স্ক্রিপ্টের উদাহরণ দেওয়া হল যেখানে শর্তাধীন অ্যাকশন আছে। রোবো স্ক্রিপ্ট চালানোর সময় কোনও পপ-আপ ডায়ালগ দেখা গেলে এটি তা বাতিল করে দেয়:

{
  "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": "WAIT",
      "delayTime": 10000
    },
    {
      "description": "Screen on",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 82"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "WAIT",
      "delayTime": 10000
    }
}

অ্যাকশন উপেক্ষা করা হচ্ছে

Robo স্ক্রিপ্টে Robo-র জন্য নির্দিষ্ট UI উইজেট বা কোনও নির্দিষ্ট স্ক্রিনে সব UI উইজেট এড়িয়ে যাওয়ার নির্দেশ থাকতে পারে। এইসব নির্দেশাবলী eventType ELEMENT_IGNORED এবং ALL_ELEMENTS_IGNORED-এর সাথে "অ্যাকশন" উপেক্ষা করার মতো করে দেখানো হয়।

যখনই কোনও রোবো স্ক্রিপ্টের contextDescriptor অ্যাট্রিবিউটে ইগনোর করার অ্যাকশন থাকে এবং সেটি কোনও স্ক্রিনের সাথে মিলে যায়, তখন রোবো ইগনোর করার অ্যাকশনের মাধ্যমে টার্গেট করা কোনও UI উইজেটের সাথে ইন্টার‍্যাক্ট করে না (যদি না অন্য কোনও রোবো স্ক্রিপ্ট অ্যাকশন রোবোকে ইগনোর করা কোনও UI উইজেটে অ্যাকশন পারফর্ম করতে বাধ্য করে)।

একটি Robo স্ক্রিপ্টে ইগনোর করা, শর্তসাপেক্ষ এবং শর্তহীন অ্যাকশনের মিশ্রণ থাকতে পারে। অন্যান্য Robo স্ক্রিপ্ট অ্যাকশনের মতো, ইগনোর অ্যাকশন ততক্ষণ পর্যন্ত প্রয়োগ করা হয় যতক্ষণ না তাদের ধারণ করা Robo স্ক্রিপ্টের contextDescriptor, Robo ক্রল চলাকালীন একটি স্ক্রিনের সাথে মেলে, priority এবং maxNumberOfRuns অ্যাট্রিবিউটের মান যাই হোক না কেন।

দুটি Robo স্ক্রিপ্ট সহ ফাইলের উদাহরণ নিচে দেওয়া হল। প্রথম Robo স্ক্রিপ্ট, Robo-কে "my.app.package:id/ignored_screen" রিসোর্স আইডি সহ UI উইজেট আছে এমন স্ক্রিনের সব UI উইজেটকে উপেক্ষা করতে বলে। দ্বিতীয় Robo স্ক্রিপ্ট Robo-কে এমন UI উইজেট এড়িয়ে যেতে বলে যার রিসোর্স আইডি Java regex ".*:id/done"-এর সাথে মিলে যায়, এমন স্ক্রিনে যেখানে রিসোর্স আইডি "my.app.package:id/main_screen" সহ UI উইজেট আছে:

[
  {
    "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 উইজেটের চিলড্রেন ডায়নামিকভাবে লোড হয় এবং বর্তমান স্ক্রিন থেকে অনেকবার সোয়াইপ করার পরে দেখা যেতে পারে। যেহেতু স্ক্রিনের সাইজ এবং এই চাইল্ডে পৌঁছানোর জন্য প্রয়োজনীয় সোয়াইপের সংখ্যা, বিভিন্ন ডিভাইসের ফর্ম ফ্যাক্টরের জন্য আলাদা হয়, তাই চাইল্ডের ডেটা পজিশনের উপর নির্ভর করা অনেক বেশি নির্ভরযোগ্য, যা পরম। এই চাইল্ড ভিউ স্ক্রিনে নিয়ে আসার জন্য কতবার সোয়াইপ করতে হবে তার উপর নির্ভর করা এবং তারপর স্ক্রিনে এর পজিশন ব্যবহার করা হল একটি কম শক্তিশালী পদ্ধতি।

তাই, Robo স্ক্রিপ্ট RecyclerView চিলড্রেনের অ্যাবসোলিউট ডেটা পজিশন ক্যাপচার করে যা Robo স্ক্রিপ্ট অ্যাকশনের টার্গেট হিসেবে recyclerViewChildPosition-এ দেখানো হয়েছে। Robo স্ক্রিপ্ট AdapterView চিলড্রেনের অ্যাবসোলিউট ডেটা পজিশনও ক্যাপচার করে যা Robo স্ক্রিপ্ট অ্যাকশনের টার্গেট হিসেবে adapterViewChildPosition।

RecyclerView এবং AdapterView চিলড্রেনে অ্যাকশন নিম্নলিখিত ধাপে পারফর্ম করা হয়:

  1. রোবো টেস্ট নিশ্চিত করে যে সংশ্লিষ্ট চাইল্ড স্ক্রিনে দেখানো হয়েছে তার RecyclerView বা AdapterView-এ পজিশনিং অ্যাকশনের মাধ্যমে।

  2. রোবো টেস্ট সরাসরি চাইল্ড এলিমেন্টে রেকর্ড করা অ্যাকশন পারফর্ম করে, কারণ এটি আগে থেকেই স্ক্রিনে দেখানো হয়।

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-তে Robo স্ক্রিপ্ট রেকর্ড করে Test Lab-এ রান করা

আপনি Android Studio-তে Robo স্ক্রিপ্ট তৈরি করতে পারেন, যা স্ক্রিপ্টকে JSON ফাইল হিসেবে সেভ করে। তারপর আপনি অ্যাপ্লিকেশনের সাথে JSON ফাইল Firebase Test Lab-এ আপলোড করতে এবং সেই অনুযায়ী টেস্ট চালাতে পারবেন।

স্ক্রিপ্ট অ্যাটাচ করা অবস্থায় রোবো টেস্ট রান করলে, রোবো টেস্ট প্রথমে আপনার প্রি-স্ক্রিপ্টেড অ্যাকশন অনুসরণ করে এবং তারপর স্বাভাবিকভাবে অ্যাপ এক্সপ্লোর করে।

Android Studio-তে Robo স্ক্রিপ্ট JSON ফাইল তৈরি করতে, Android Studio-তে Test Lab ব্যবহার করে Robo স্ক্রিপ্ট রেকর্ড করুন-এ দেওয়া ধাপগুলি অনুসরণ করুন।

Robo স্ক্রিপ্ট অ্যাকশন

নিম্নলিখিত সাধারণ ঐচ্ছিক অ্যাট্রিবিউট সব অ্যাকশনের ক্ষেত্রে প্রযোজ্য:

  • description - রোবো টেস্ট আউটপুটে এই রোবো স্ক্রিপ্ট অ্যাকশনের এক্সিকিউশন ট্র্যাক করতে সাহায্য করে।

অ্যাসার্শন

অ্যাসার্ট করা শর্তটি সত্য হলে, Robo স্ক্রিপ্ট পরবর্তী অ্যাকশনে চলতে থাকে, যা অন্য একটি অ্যাসার্শন হতে পারে। অন্যথায়, অ্যাসারশন ব্যর্থ হওয়ার কারণে Robo স্ক্রিপ্ট এক্সিকিউশন বন্ধ হয়ে যায়।

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "ASSERTION" --
contextDescriptor দাবি করা প্রসঙ্গ বা শর্ত বর্ণনা করে। এটির গঠন একই রকম এবং Robo স্ক্রিপ্টের contextDescriptor-এর মতো একই ধরনের ক্ষমতা অফার করে।

নিচে Robo স্ক্রিপ্ট অ্যাসারশনের একটি উদাহরণ দেওয়া হল যা চেক করে যে পরীক্ষা করা হচ্ছে এমন অ্যাপটি ফোরগ্রাউন্ডে আছে কিনা:

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "app_under_test_shown"
  }
}

নিচে Robo স্ক্রিপ্ট অ্যাসারশনের একটি উদাহরণ দেওয়া হল যা চেক করে যে রিসোর্স আইডি "com.google.samples.apps.topeka:id/done" সহ UI উইজেট স্ক্রিনে উপস্থিত আছে কিনা:

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "element_present",
    "elementDescriptors": [
      {
        "resourceId": "com.google.samples.apps.topeka:id/done"
      }
    ]
  }
}

নিচে Robo স্ক্রিপ্ট অ্যাসারশনের একটি উদাহরণ দেওয়া হল যা চেক করে যে OCR ব্যবহার করে স্ক্রিনে "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-তে Robo স্ক্রিপ্ট রেকর্ডার দ্বারা তালিকা আইটেমে ক্লিক করার জন্য ব্যবহার করা হয়।
elementDescriptors Android UI হায়ারার্কি ব্যবহার করে ক্লিক করা UI উইজেট শনাক্ত করে। visionText-এর সাথে পারস্পরিকভাবে এক্সক্লুসিভ।
visionText OCR ব্যবহার করে ক্লিক করা এলিমেন্ট শনাক্ত করে। elementDescriptors-এর সাথে মিউচুয়ালি এক্সক্লুসিভ।
matchIndex visionText ব্যবহার করে টার্গেট এলিমেন্ট শনাক্ত করা হলে, ম্যাচ করা টার্গেট এলিমেন্টের ঘটনার ইন্ডেক্স নির্দিষ্ট করে। এটি 0 হলে, Robo স্ক্রিপ্ট অ্যাকশন প্রথম মিলে যাওয়া এলিমেন্ট বেছে নেয়, এটি 1 হলে, Robo স্ক্রিপ্ট অ্যাকশন দ্বিতীয় মিলে যাওয়া এলিমেন্ট বেছে নেয়, এবং এইভাবে চলতে থাকে। বাঁদিক থেকে ডানদিকে, উপর থেকে নিচে এইভাবে ক্রম নির্ধারণ করা হয়। ডিফল্ট মান হল 0 (প্রথম মিলটি বেছে নেওয়া হয়)।
maxNumberOfRuns eventType, SOFT_KEYBOARD_RANDOM_CLICK হলে, সফ্ট কীবোর্ডের কোনও র‍্যান্ডম এলিমেন্টে কতবার ক্লিক করতে হবে তা নির্দিষ্ট করে। ডিফল্ট ভ্যালু হল 1।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা "com.google.samples.apps.topeka:id/done" রিসোর্স আইডি সহ একটি বোতামে ক্লিক করে:

{
  "eventType": "VIEW_CLICKED",
  "elementDescriptors": [
    {
      "resourceId": "com.google.samples.apps.topeka:id/done"
    }
  ]
}

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা OCR ব্যবহার করে স্ক্রিনে শনাক্ত করা "Search" শব্দের দ্বিতীয় বার উপস্থিতিতে ক্লিক করে:

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Search",
  "matchIndex": 1
}

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা "Emoji button" কন্টেন্ট বিবরণ সহ সফ্ট কীবোর্ড এলিমেন্টে ক্লিক করে:

{
  "eventType": "SOFT_KEYBOARD_CLICK",
  "elementDescriptors": [
    {
      "contentDescription": "Emoji button"
    }
  ]
}

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা সফ্ট কীবোর্ডের যেকোনও এলিমেন্টে পাঁচবার পর্যন্ত ক্লিক করে:

{
  "eventType": "SOFT_KEYBOARD_RANDOM_CLICK",
  "maxNumberOfRuns": 5
}

সফ্ট কীবোর্ড বন্ধ করুন

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "DISABLE_KEYBOARD" --

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা সফ্ট কীবোর্ড বন্ধ করে দেয়:

{
  "eventType": "DISABLE_KEYBOARD"
}

adb শেল কমান্ড এক্সিকিউট করুন

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "ADB_SHELL_COMMAND" --
command Android ডিবাগ ব্রিজ (adb) শেল কমান্ড এক্সিকিউট করতে হবে।

নিম্নলিখিত অ্যাট্রিবিউটটি ঐচ্ছিক:

  • expectedOutputRegex - জাভা রেগুলার এক্সপ্রেশন হিসেবে কমান্ডের প্রত্যাশিত আউটপুট। আউটপুট ম্যাচ না করলে, Robo স্ক্রিপ্ট অ্যাকশন কাজ করে না। ডিফল্ট হিসেবে, এটি একটি খালি স্ট্রিং, যার অর্থ হল আউটপুট চেক করা হয়নি।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা পরীক্ষা করা হচ্ছে এমন অ্যাপের ব্যবহারকারীর ডেটা মুছে দেয়:

{
  "eventType": "ADB_SHELL_COMMAND",
  "command": "pm clear __%APP_PACKAGE_NAME%__"
}

অনুমতি দিন

Espresso টেস্ট রেকর্ডার-এর সাথে ব্যাকওয়ার্ড কম্প্যাটিবিলিটির জন্য Android Studio-তে Robo স্ক্রিপ্ট রেকর্ডার এই অ্যাকশন রেকর্ড করে। রোবো টেস্ট প্রতিটি ক্রলের শুরুতে টেস্ট-করা-অ্যাপকে সব অনুমতি দেয়, এবং তাই, এই অ্যাকশনটি একটি নো-অপ। আপনার রোবো স্ক্রিপ্টে এই অ্যাকশনটি ব্যবহার করবেন না।

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "PERMISSIONS_REQUEST" --

স্ক্রিনের সব এলিমেন্ট এড়িয়ে যান

এই অ্যাকশন Robo-কে এমন যেকোনও স্ক্রিনের সব এলিমেন্টকে উপেক্ষা করতে বাধ্য করে যা Robo স্ক্রিপ্টকে ট্রিগার করে।

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "ALL_ELEMENTS_IGNORED" --

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা Robo-কে স্ক্রিনের সব এলিমেন্ট এড়িয়ে যেতে বাধ্য করে:

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

কোনও এলিমেন্ট এড়িয়ে যান

এই অ্যাকশন Robo-কে নির্দিষ্ট করা elementDescriptors-এর সাথে ম্যাচ করা এলিমেন্ট (বা এলিমেন্টগুলি) উপেক্ষা করতে বাধ্য করে।

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "ELEMENT_IGNORED" --
elementDescriptors Android UI হায়ারার্কি ব্যবহার করে উপেক্ষা করা UI উইজেট শনাক্ত করে।

নিম্নলিখিত অ্যাট্রিবিউটটি ঐচ্ছিক:

  • ignoreChildren - true-এ সেট করা থাকলে, Robo, এড়িয়ে যাওয়া UI উইজেটের সব ডিসেন্ডেন্টকেও এড়িয়ে যায়। ডিফল্ট হিসেবে, এটি false।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল, যার মাধ্যমে Robo সেইসব এলিমেন্টকে উপেক্ষা করে, যেগুলির কন্টেন্টের বিবরণ "Avatar" দিয়ে শুরু হয়:

{
  "eventType": "ELEMENT_IGNORED",
  "elementDescriptors": [
    {
      "contentDescriptionRegex": "Avatar.*"
    }
  ]
}

ইনপুট টেক্সট

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
eventType রোবো স্ক্রিপ্ট অ্যাকশনের ধরন নির্দিষ্ট করে।
"eventType": "VIEW_TEXT_CHANGED" টার্গেট UI উইজেটে প্রদত্ত টেক্সট ইনপুট করে।
"eventType": "ENTER_TEXT" টার্গেট UI উইজেটে প্রদত্ত টেক্সট ইনপুট করে এবং তারপর এই UI উইজেটে একটি KEYCODE_ENTER ইভেন্ট পাঠায়।
elementDescriptors Android UI হায়ারার্কি ব্যবহার করে টার্গেট UI উইজেট শনাক্ত করে।
replacementText টার্গেট UI উইজেটে ইনপুট করার জন্য টেক্সট।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা "John" ইনপুট করে "com.google.samples.apps.topeka:id/first_name" রিসোর্স আইডি সহ UI উইজেটে:

{
  "eventType": "VIEW_TEXT_CHANGED",
  "replacementText": "John",
  "elementDescriptors": [
    {
      "resourceId": "com.google.samples.apps.topeka:id/first_name"
    }
  ]
}

দীর্ঘ সময় ধরে ক্লিক করুন

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Android UI হায়ারার্কি ব্যবহার করে টার্গেট UI উইজেট শনাক্ত করে। visionText-এর সাথে পারস্পরিকভাবে এক্সক্লুসিভ।
visionText OCR ব্যবহার করে অনেকক্ষণ ধরে ক্লিক করা এলিমেন্ট শনাক্ত করে। elementDescriptors-এর সাথে মিউচুয়ালি এক্সক্লুসিভ।
matchIndex visionText ব্যবহার করে টার্গেট এলিমেন্ট শনাক্ত করা হলে, ম্যাচ করা টার্গেট এলিমেন্টের ঘটনার ইন্ডেক্স নির্দিষ্ট করে। এটি 0 হলে, Robo স্ক্রিপ্ট অ্যাকশন প্রথম মিলে যাওয়া এলিমেন্ট বেছে নেয়, এটি 1 হলে, Robo স্ক্রিপ্ট অ্যাকশন দ্বিতীয় মিলে যাওয়া এলিমেন্ট বেছে নেয়, এবং এইভাবে চলতে থাকে। বাঁদিক থেকে ডানদিকে, উপর থেকে নিচে এইভাবে ক্রম নির্ধারণ করা হয়। ডিফল্ট মান হল 0 (প্রথম মিলটি বেছে নেওয়া হয়)।

নিম্নলিখিত অ্যাট্রিবিউটটি ঐচ্ছিক:

  • delayTime - দীর্ঘ ক্লিক কতক্ষণ ধরে প্রেস করে রাখা হয়েছে তা মিলিসেকেন্ডে নির্দিষ্ট করে।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা "Avatar 8" কন্টেন্ট বিবরণ সহ UI উইজেটে পাঁচ সেকেন্ড-দীর্ঘ ক্লিক করে:

{
  "eventType": "VIEW_LONG_CLICKED",
  "elementDescriptors": [
    {
      "contentDescription": "Avatar 8"
    }
  ],
  "delayTime": 5000
}

এক-পয়েন্ট জেসচার করুন

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "ONE_POINT_GESTURE" --
coordinates এক-পয়েন্ট জেসচারের জন্য দুটি কোঅর্ডিনেট, "(x1,y1)->(x2,y2)" হিসেবে ফর্ম্যাট করা শতাংশ বা পিক্সেল হিসেবে।

নিম্নলিখিত অ্যাট্রিবিউটটি ঐচ্ছিক:

  • dragAndDrop - true-এ সেট করা থাকলে, ওয়ান-পয়েন্ট জেসচার টেনে নিয়ে রাখার অ্যাকশন পারফর্ম করে। ডিফল্ট হিসেবে, এটি false।

নিচে Robo স্ক্রিপ্ট ওয়ান-পয়েন্ট জেসচার অ্যাকশনের উদাহরণ দেওয়া হল যা নিচের দিকে সোয়াইপ করে:

{
  "eventType": "ONE_POINT_GESTURE",
  "coordinates": "(50%,25%)->(50%,75%)"
}

দুটি পয়েন্ট ব্যবহার করে জেসচার করুন

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "TWO_POINT_GESTURE" --
coordinates দুটি পয়েন্টের জেসচারের জন্য চারটি কোঅর্ডিনেট, যা "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" হিসেবে শতাংশ বা পিক্সেল হিসেবে ফর্ম্যাট করা হয়েছে।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের উদাহরণ দেওয়া হল যা পিঞ্চ আউট জেসচার পারফর্ম করে:

{
  "eventType": "TWO_POINT_GESTURE",
  "coordinates": "(50%,50%)->(25%,50%),(50%,50%)->(75%,50%)"
}

IME অ্যাকশন পারফর্ম করুন

এই অ্যাকশন নির্দিষ্ট টার্গেট UI উইজেটের জন্য ইনপুট পদ্ধতি এডিটরে (IME) বর্তমান অ্যাকশন বোতাম প্রেস করে, যেমন, পরবর্তী, হয়ে গেছে এবং সার্চ।

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors Android UI হায়ারার্কি ব্যবহার করে টার্গেট UI উইজেট শনাক্ত করে।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা "com.google.samples.apps.topeka:id/first_name" রিসোর্স আইডি সহ UI উইজেটে 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-তে Robo স্ক্রিপ্ট রেকর্ডার দ্বারা এমুলেটর API 28-এ ফিরে যাওয়ার বোতাম প্রেস করার জন্য ব্যবহার করা হয়।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা 'ফিরে যান' বোতাম প্রেস করে:

{
  "eventType": "PRESSED_BACK"
}

হোম প্রেস করুন

এই অ্যাকশন ডিভাইসে KEYCODE_HOME ইভেন্ট পাঠায়।

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "GO_HOME" --

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা হোম বোতাম প্রেস করে:

{
  "eventType": "GO_HOME"
}

স্ক্রল করে কোনও এলিমেন্ট সামনে নিয়ে আসুন

এই অ্যাকশনটি রোবো টেস্টকে নির্দিষ্ট elementDescriptors-এর সাথে মেলে এমন UI উইজেটকে স্ক্রল করতে বাধ্য করে যতক্ষণ না নির্দিষ্ট childElementDescriptors-এর সাথে মেলে এমন UI উইজেট স্ক্রিনে উপস্থিত হয়, অথবা স্ক্রল করা উইজেটটি আর স্ক্রল করা যায় না, অথবা ৫০টি স্ক্রলের সর্বাধিক সংখ্যায় পৌঁছায়।

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors Android UI হায়ারার্কি ব্যবহার করে স্ক্রল করা UI উইজেট শনাক্ত করে।
childElementDescriptors Android UI হায়ারার্কি ব্যবহার করে স্ক্রল করার জন্য UI উইজেট শনাক্ত করে।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা UI উইজেট স্ক্রল করে রিসোর্স আইডি "my.app.package:id/scrollable_card_container" সহ যতক্ষণ না UI উইজেট টেক্সট "Orange" সহ স্ক্রিনে দেখা যায় (অথবা আর স্ক্রল করা যায় না, অথবা সর্বাধিক ৫০ বার স্ক্রল করা হয়ে যায়):

{
  "eventType": "ELEMENT_SCROLL_INTO_VIEW",
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/scrollable_card_container"
    }
  ],
  "childElementDescriptors": [
    {
      "text": "Orange"
    }
  ]
}

সোয়াইপ করুন

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "VIEW_SWIPED" --
swipeDirection সোয়াইপের দিক নির্দিষ্ট করে:
  • Left
  • Right
  • Up
  • Down
  • Forward - টার্গেট UI উইজেটের উল্লম্ব বা অনুভূমিক স্ক্রল করার ক্ষমতার উপর নির্ভর করে Down অথবা Right।
  • Backward - টার্গেট UI উইজেটের উল্লম্ব বা অনুভূমিক স্ক্রল করার ক্ষমতার উপর নির্ভর করে Up বা Left হবে।
elementDescriptors Android UI হায়ারার্কি ব্যবহার করে টার্গেট UI উইজেট শনাক্ত করে।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা "my.app.package:id/custom_content" রিসোর্স আইডি সহ UI উইজেট উপরের দিকে সোয়াইপ করে:

{
  "eventType": "VIEW_SWIPED",
  "swipeDirection": "Up",
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/custom_content"
    }
  ]
}

স্ক্রিনশট নিন

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "TAKE_SCREENSHOT" --
screenshotName স্ক্রিনশট ফাইলের নাম নির্দিষ্ট করে।

স্ক্রিনশট নেয় এমন Robo স্ক্রিপ্ট অ্যাকশনের উদাহরণ নিচে দেওয়া হল:

{
  "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-এর সাথে পরস্পর স্বতন্ত্র।

স্ক্রিনের মাঝখানে ট্যাপ করে এমন Robo স্ক্রিপ্ট অ্যাকশনের উদাহরণ নিচে দেওয়া হল:

{
  "eventType": "POINT_TAP",
  "pointTapXPercent": 50,
  "pointTapYPercent": 50
}

কোনও এলিমেন্টের মধ্যে একটি পয়েন্টে ট্যাপ করুন

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent টার্গেট এলিমেন্টের মধ্যে X স্থানাঙ্কের শতাংশ।
pointTapYPercent টার্গেট এলিমেন্টের মধ্যে Y স্থানাঙ্কের শতাংশ।
elementDescriptors Android UI হায়ারার্কি ব্যবহার করে টার্গেট UI উইজেট শনাক্ত করে।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা সিকবারের স্লাইডারকে ডানদিকে সরায়:

{
  "eventType": "POINT_TAP_ELEMENT",
  "pointTapXPercent": 80,
  "pointTapYPercent": 50,
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/my_seekbar"
    }
  ]
}

ক্রল বন্ধ করুন

এই অ্যাকশন Robo টেস্ট বন্ধ করে দেয়।

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "TERMINATE_CRAWL" --

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা Robo টেস্ট বন্ধ করে দেয়:

{
  "eventType": "TERMINATE_CRAWL"
}

অপেক্ষা

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "WAIT" (or "DELAYED_MESSAGE_POSTED") --
delayTime কতক্ষণ অপেক্ষা করতে হবে তা মিলিসেকেন্ডে উল্লেখ করে।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা তিন সেকেন্ডের জন্য অপেক্ষা করে:

{
  "eventType": "WAIT",
  "delayTime": 3000
}

কোনও এলিমেন্টের জন্য অপেক্ষা করা

এই অ্যাকশনটি রোবো টেস্টকে স্ক্রিনে কোনও এলিমেন্ট দেখানোর জন্য নির্দিষ্ট টাইমআউট পর্যন্ত অপেক্ষা করতে বাধ্য করে।

নিম্নলিখিত সারণীতে প্রয়োজনীয় অ্যাট্রিবিউট তালিকাভুক্ত করা হয়েছে:

অ্যাট্রিবিউট বিবরণ
"eventType": "WAIT_FOR_ELEMENT" --
delayTime মিলিসেকেন্ডে, অপেক্ষার টাইমআউট নির্দিষ্ট করে।
elementDescriptors Android UI হায়ারার্কি ব্যবহার করে অপেক্ষা করা UI উইজেট শনাক্ত করে।

নিচে Robo স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা স্ক্রিনে রিসোর্স আইডি "my.app.package:id/confirmation_button" সহ UI উইজেট দেখানোর জন্য ৩০ সেকেন্ড পর্যন্ত অপেক্ষা করে:

{
  "eventType": "WAIT_FOR_ELEMENT",
  "delayTime": 30000,
  "elementDescriptors": [
    {
      "resourceId": "my.app.package:id/confirmation_button"
    }
  ]
}

পরবর্তী ধাপ