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

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

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

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

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

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

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

ভূমিকা

পরীক্ষা করা হচ্ছে এমন অ্যাপের Android অ্যাপ্লিকেশন প্যাকেজ (APK)-এর মতো অন্যান্য ইনপুটের সাথে Robo স্ক্রিপ্ট Robo টেস্টকে প্রদান করা হয়।

নিচে একটি 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+-এ এলিমেন্ট ডেসক্রিপ্টরে নিম্নলিখিত শনাক্তকারী অ্যাট্রিবিউট কাজ করে:

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

iOS+ ভার্সনে নিম্নলিখিত প্রসঙ্গ বর্ণনাকারীতে ট্রিগার করার শর্ত কাজ করে:

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

গঠন

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

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

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

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

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

প্রসঙ্গের বিবরণ

কন্টেক্সট ডেসক্রিপ্টর, সেইসব প্রসঙ্গ বা শর্তাবলীকে সংজ্ঞায়িত করে যা একাধিক অ্যাট্রিবিউট ব্যবহার করে Robo script ট্রিগার করে:

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

UI উইজেট দ্বারা ট্রিগার করা রোবো স্ক্রিপ্টের একটি উদাহরণ নিচে দেওয়া হল যেখানে রিসোর্স আইডি "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" অপটিকাল ক্যারেক্টার রিকগনিশন (OCR) দ্বারা শনাক্ত করা হয়েছে:

{
  "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" : "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 উইজেট সাব-হায়ারার্কির সাথে ম্যাচ করে।

নিচে টেক্সট পরিবর্তন ও ক্লিক অ্যাকশন সহ একটি Robo স্ক্রিপ্টের উদাহরণ দেওয়া হল। এই দু'টি ক্ষেত্রেই আপনাকে প্রদত্ত এলিমেন্ট ডেসক্রিপ্টর ব্যবহার করে টার্গেট 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"
      }
    ]
  }
]

এক্সিকিউশন বিকল্প

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

Robo স্ক্রিপ্ট নিম্নলিখিত এক্সিকিউশন বিকল্পে কাজ করে:

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

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

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

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

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

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

  • __%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"
      }
    ]
  }
]

কেপেবিলিটি

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

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

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

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

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

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

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

অগ্রাধিকার

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

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

নিচে এমন একটি ফাইলের উদাহরণ দেওয়া হল যাতে তিনটি 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 অ্যাট্রিবিউটের মাধ্যমে এটি অ্যাডজাস্ট করা যেতে পারে।

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

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

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

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

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

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

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

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

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

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

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

ট্রিগার করা হলে, কোনও রোবো স্ক্রিপ্ট তার শর্তহীন অ্যাকশনগুলি এক এক করে সেগুলি যেভাবে দেখানো হয়েছে সেই ক্রমে পারফর্ম করে। কোনও রোবো স্ক্রিপ্টে শর্তসাপেক্ষ অ্যাকশন থাকলে, সেগুলি প্রতিবার কোনও শর্তহীন অ্যাকশন পারফর্ম করার আগে বিবেচনা করা হয়। যদি কোনও কন্ডিশনাল অ্যাকশন ট্রিগার করা হয় এবং এর অগ্রাধিকার ও বাকি থাকা রান সংখ্যার ভিত্তিতে বেছে নেওয়া হয়, তাহলে 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 স্ক্রিপ্টের contextDescriptor কোনও Robo ক্রলের সময় কোনও স্ক্রিনের সাথে ম্যাচ করে, priority এবং maxNumberOfRuns অ্যাট্রিবিউটের মান যাই হোক না কেন।

নিচে দুটি Robo স্ক্রিপ্ট সহ ফাইলের একটি উদাহরণ দেওয়া হল। প্রথম Robo script, Robo-কে এমন স্ক্রিনের সব UI উইজেট উপেক্ষা করতে বলে, যে স্ক্রিনে "my.app.package:id/ignored_screen" রিসোর্স আইডি সহ একটি UI উইজেট থাকে। দ্বিতীয় রোবো স্ক্রিপ্ট রোবোকে এমন 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 স্ক্রিপ্ট, Robo স্ক্রিপ্ট অ্যাকশনের টার্গেট হিসেবে recyclerViewChildPosition-এর RecyclerView চিলড্রেনের অ্যাবসলিউট ডেটা পজিশন ক্যাপচার করে। এছাড়াও, Robo স্ক্রিপ্ট, Robo স্ক্রিপ্ট অ্যাকশনের টার্গেট হিসেবে AdapterView চিলড্রেনের অ্যাবসলিউট ডেটা পজিশন ক্যাপচার করে, যেমন adapterViewChildPosition।

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

  1. Robo টেস্ট নিশ্চিত করে যে সংশ্লিষ্ট বাচ্চাকে স্ক্রিনে দেখানো হচ্ছে সেটির কন্টেনিং 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-তে একটি রোবো স্ক্রিপ্ট তৈরি করতে পারেন, যা স্ক্রিপ্টটিকে JSON ফাইল হিসেবে সেভ করে। তারপরে, আপনি Firebase Test Lab-এ JSON ফাইল আপলোড করতে পারবেন এবং সেই অনুযায়ী পরীক্ষা চালাতে পারবেন।

অ্যাটাচ করা স্ক্রিপ্ট সহ Robo টেস্ট চালালে, Robo টেস্ট প্রথমে আপনার আগে থেকে স্ক্রিপ্ট করা অ্যাকশনগুলি ধাপে ধাপে চেক করে এবং তারপরে অ্যাপটি স্বাভাবিকভাবে এক্সপ্লোর করে।

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

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

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

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

অ্যাসার্শন

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

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

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

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

{
  "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 Robo স্ক্রিপ্ট অ্যাকশনের ধরন নির্দিষ্ট করে।
"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
}

নিচে রোবো স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা কন্টেন্টের বিবরণ সহ একটি সফ্ট কীবোর্ড এলিমেন্টে ক্লিক করে "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 Debug Bridge (adb) শেল কমান্ড এক্সিকিউট করতে।

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

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

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

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

অনুমতি দিন

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

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

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

স্ক্রিনের সব এলিমেন্ট উপেক্ষা করা

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

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

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

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

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

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

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

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

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

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

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

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

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

ইনপুট টেক্সট

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

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

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

{
  "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 স্ক্রিপ্ট অ্যাকশনের একটি উদাহরণ দেওয়া হল যা কন্টেন্টের বিবরণ সহ UI উইজেটে পাঁচ সেকেন্ড-দীর্ঘ ক্লিক পারফর্ম করে "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)" ফর্ম্যাটে ফর্ম্যাট করা হয়েছে।

নিচে 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 Robo স্ক্রিপ্ট অ্যাকশনের ধরন নির্দিষ্ট করে।
"eventType": "PRESSED_BACK" ডিভাইসে একটি KEYCODE_BACK ইভেন্ট পাঠায়।
"eventType": "PRESSED_BACK_EMULATOR_28" Android Studio-তে Robo স্ক্রিপ্ট রেকর্ডার দ্বারা এমুলেটর API 28-এ ব্যাক প্রেস করার জন্য ব্যবহৃত হয়।

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

{
  "eventType": "PRESSED_BACK"
}

হোম বোতাম প্রেস করুন

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

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

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

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

{
  "eventType": "GO_HOME"
}

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

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

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

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

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

{
  "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 - Down অথবা Right টার্গেট UI উইজেটের উল্লম্ব বা অনুভূমিক স্ক্রল করার সুবিধা অনুযায়ী।
  • Backward - Up অথবা Left টার্গেট UI-এর উল্লম্ব বা অনুভূমিক স্ক্রল করার সুবিধা উইজেটের উপর নির্ভর করে।
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 স্ক্রিনশট ফাইলের নাম নির্দিষ্ট করে।

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

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

ক্রল বন্ধ করা

এই অ্যাকশন নিলে রোবো টেস্ট বন্ধ হয়ে যায়।

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

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

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

{
  "eventType": "TERMINATE_CRAWL"
}

অপেক্ষা

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

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

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

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

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

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

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

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

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

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

পরবর্তী ধাপ