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 স্ক্রিপ্টের সংগ্রহ থাকে।

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

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

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

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

অ্যাট্রিবিউট বিবরণ
"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 স্ক্রিপ্ট অ্যাক্টিভ থাকে। রোবো টেস্ট, কোনও অ্যাকশন পারফর্ম করার জন্য বেছে নেওয়ার সময়, রোবো স্ক্রিপ্ট অ্যাকশনের সাথে সেটি ম্যাচ করার চেষ্টা চালিয়ে যায়। রোবো স্ক্রিপ্ট রোবাস্টনেস বাড়াতে নিম্নলিখিত কৌশলগুলি ব্যবহার করে:

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

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

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

এই টেকনিক সেইসব পরিস্থিতিতে সাহায্য করে যখন অ্যাপের আচরণ ভার্সনের মধ্যে পরিবর্তিত হয় বা অস্থির হয়, যেমন, যখন একটি বিরতিমূলক ডায়ালগ 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"
    }
  ]
}

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

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

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

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

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

{
  "id": 1000,
  "actions": [
    {
      "description": "Dismiss dialog",
      "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-কে "my.app.package:id/ignored_screen" রিসোর্স আইডি সহ UI উইজেট আছে এমন স্ক্রিনের সব UI উইজেটকে উপেক্ষা করতে বলে। দ্বিতীয় Robo স্ক্রিপ্ট Robo-কে এমন UI উইজেট এড়িয়ে যেতে বলে যার রিসোর্স আইডি Java রেগুলার এক্সপ্রেশন ".*:id/done"-এর সাথে মিলে যায়, এমন স্ক্রিনে যেখানে রিসোর্স আইডি সহ UI উইজেট আছে "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 উইজেটের চাইল্ড ডাইনামিকভাবে লোড হয় এবং বর্তমান স্ক্রিন থেকে অনেকবার সোয়াইপ করার পরে দেখা যেতে পারে। স্ক্রিনের সাইজ এবং এই চাইল্ডে পৌঁছাতে কতবার সোয়াইপ করতে হবে তা বিভিন্ন ডিভাইসের ফর্ম ফ্যাক্টরের জন্য আলাদা আলাদা হয়। তাই চাইল্ডের ডেটা পজিশনের উপর নির্ভর করা অনেক বেশি নির্ভরযোগ্য, যা পরম। এই চাইল্ড ভিউ স্ক্রিনে নিয়ে আসার জন্য কতবার সোয়াইপ করতে হবে তার উপর নির্ভর করা এবং তারপর স্ক্রিনে এর পজিশন ব্যবহার করা হল একটি কম শক্তিশালী পদ্ধতি।

তাই, 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 হলে, দ্বিতীয় মিলে যাওয়া এলিমেন্ট বেছে নেয় এবং পরবর্তী মিলের জন্য এই ক্রম অনুযায়ী চলতে থাকে। ক্রম নির্ধারণ করা হয় বাঁদিক থেকে ডানদিকে, উপর থেকে নিচে। ডিফল্ট মান হল 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 হলে, দ্বিতীয় মিলে যাওয়া এলিমেন্ট বেছে নেয় এবং পরবর্তী মিলের জন্য এই ক্রম অনুযায়ী চলতে থাকে। ক্রম নির্ধারণ করা হয় বাঁদিক থেকে ডানদিকে, উপর থেকে নিচে। ডিফল্ট মান হল 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"
}

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

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

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

অ্যাট্রিবিউট বিবরণ
"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 - টার্গেট 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" --

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

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

পরবর্তী ধাপ