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

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

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

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

  • রোবো স্ক্রিপ্টটি ম্যানুয়ালি তৈরি করুন। (অ্যান্ড্রয়েড এবং আইওএস+)

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

রোবো স্ক্রিপ্ট ব্যবহার সম্পর্কে আরও জানতে, ‘একটি রোবো স্ক্রিপ্ট চালান’ দেখুন।

ভূমিকা

রোবো পরীক্ষার জন্য, পরীক্ষাধীন অ্যাপের অ্যান্ড্রয়েড অ্যাপ্লিকেশন প্যাকেজ (APK)-এর মতো অন্যান্য ইনপুটের পাশাপাশি রোবো স্ক্রিপ্টও সরবরাহ করা হয়।

নিম্নলিখিতটি একটি রোবো স্ক্রিপ্টের উদাহরণ যা একজন ব্যবহারকারীকে একটি অ্যাপে সাইন ইন করায় এবং পরীক্ষাধীন অ্যাপটি চালু হলে এটি সক্রিয় হয়:

[
  {
    "crawlStage": "crawl",
    "contextDescriptor": {
      "condition": "app_under_test_shown"
    },
    "actions": [
      {
        "eventType": "VIEW_TEXT_CHANGED",
        "replacementText": "user123",
        "elementDescriptors": [
          {
            "resourceId": "my.app.package:id/username"
          }
        ]
      },
      {
        "eventType": "VIEW_TEXT_CHANGED",
        "replacementText": "12345",
        "elementDescriptors": [
          {
            "resourceId": "my.app.package:id/password"
          }
        ]
      },
      {
        "eventType": "VIEW_CLICKED",
        "elementDescriptors": [
          {
            "resourceId": "my.app.package:id/login"
          }
        ]
      }
    ]
  }
]

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

[
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "user123",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/username"
      }
    ]
  },
  {
    "eventType": "VIEW_TEXT_CHANGED",
    "replacementText": "12345",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/password"
      }
    ]
  },
  {
    "eventType": "VIEW_CLICKED",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/login"
      }
    ]
  }
]

রোবো স্ক্রিপ্টের জন্য iOS+ সমর্থন

রোবো ফর আইওএস+ (বিটা)-তে রোবো স্ক্রিপ্টের জন্য সীমিত সমর্থন রয়েছে। আইওএস+ এর জন্য রোবো স্ক্রিপ্টের সিনট্যাক্স অ্যান্ড্রয়েড সিনট্যাক্সের অনুরূপ, এবং সমর্থিত আইওএস+ ফিচারগুলো তাদের অ্যান্ড্রয়েড প্রতিরূপের মতোই কাজ করে।

iOS+ এ নিম্নলিখিত অ্যাকশনগুলো সমর্থিত:

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

iOS+ এ এলিমেন্ট ডেসক্রিপ্টরের নিম্নলিখিত শনাক্তকারী অ্যাট্রিবিউটগুলো সমর্থিত:

  • ক্লাসের নাম
  • পূর্বপুরুষ শ্রেণীর নাম
  • বিষয়বস্তুর বিবরণ (এবং রেজেক্স)
  • টেক্সট (এবং রেজেক্স)

iOS+ এ কনটেক্সট ডেসক্রিপ্টরের নিম্নলিখিত ট্রিগারিং শর্তগুলো সমর্থিত:

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

কাঠামো

একটি রোবো স্ক্রিপ্টের বেশ কিছু অ্যাট্রিবিউট থাকে, যা বর্ণনা করে রোবোটি কীভাবে স্ক্রিপ্টটি সম্পাদন করবে। এই অ্যাট্রিবিউটগুলোর বেশিরভাগই ঐচ্ছিক এবং এগুলোর পূর্বনির্ধারিত ডিফল্ট মান রয়েছে:

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

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

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

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

প্রসঙ্গ বর্ণনাকারী

একটি কনটেক্সট ডেসক্রিপ্টর এক বা একাধিক অ্যাট্রিবিউটের সমন্বয়ে সেই প্রেক্ষাপট বা শর্তকে সংজ্ঞায়িত করে, যা একটি রোবো স্ক্রিপ্টকে ট্রিগার করে।

বৈশিষ্ট্য বর্ণনা
"condition": "always" সর্বদা একটি রোবো স্ক্রিপ্ট চালু করে।
"condition": "element_present" স্ক্রিনে elementDescriptors অথবা visionText দ্বারা নির্দিষ্ট করা টেক্সটের সাথে মেলে এমন একটি 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" এটি যাচাই করে যে রোবো টেস্ট দ্বারা সম্পাদিত শেষ nonRoboscriptActionCount সংখ্যক ধারাবাহিক অ্যাকশনগুলো রোবো স্ক্রিপ্ট অ্যাকশন নয়।
negateCondition যদি ' true সেট করা হয়, তাহলে condition বাতিল হয়ে যায়। উদাহরণস্বরূপ, স্ক্রিনে কোনো UI উইজেট উপস্থিত নেই, অথবা পরীক্ষাধীন অ্যাপটি ফোরগ্রাউন্ডে চলছে না—এটি পরীক্ষা করার জন্য আপনি এই অ্যাট্রিবিউটটি ব্যবহার করতে পারেন।
elementDescriptors এক বা একাধিক এলিমেন্ট ডেসক্রিপ্টর যা স্ক্রিনে থাকা একটি UI উইজেটকে শনাক্ত করে। এটি element_present , element_disabled , এবং element_checked কন্ডিশনগুলোর সাথে একত্রে ব্যবহৃত হয়। এটি visionText সাথে পারস্পরিকভাবে বর্জনীয়। আরও তথ্যের জন্য, এলিমেন্ট ডেসক্রিপ্টরস দেখুন।
visionText স্ক্রিনের টেক্সট অপটিক্যাল ক্যারেক্টার রিকগনিশন (OCR) API ব্যবহার করে শনাক্ত করা হয়। visionText element_present কন্ডিশনের সাথে একত্রে ব্যবহৃত হয়। elementDescriptors সাথে পারস্পরিকভাবে বর্জনীয়।
nonRoboscriptActionCount পূর্বে সম্পাদিত ধারাবাহিক নন-রোবোস্ক্রিপ্ট অ্যাকশনের সংখ্যা। এটি non_roboscript_action_performed শর্তের সাথে একত্রে ব্যবহৃত হয়, যাতে প্রতি nonRoboscriptActionCount রোবো অ্যাকশনের পর একটি রোবোস্ক্রিপ্ট ট্রিগার করা যায়। ডিফল্টরূপে, এর মান 1

নিম্নলিখিতটি এমন একটি রোবো স্ক্রিপ্টের উদাহরণ যা স্ক্রিনে "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"
        }
      ]
    }
  ]
}

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

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

নিম্নলিখিতটি এমন একটি রোবো স্ক্রিপ্টের উদাহরণ যা প্রতিটি নন-স্ক্রিপ্ট রোবো অ্যাকশনের পরে ৫ সেকেন্ড অপেক্ষা করে:

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

কর্ম

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

বৈশিষ্ট্য বর্ণনা
eventType ক্রিয়ার ধরণ নির্দিষ্ট করে, যেমন—ক্লিক, টেক্সট সম্পাদনা, ইত্যাদি। প্রতিটি ক্রিয়ার জন্য এটি আবশ্যক।
elementDescriptors UI উইজেট শনাক্তকারী বর্ণনাকারী। যেসব কাজের একটি UI উইজেট লক্ষ্য থাকে, যেমন কোনো নির্দিষ্ট বোতামে ক্লিক করা, সেসব কাজের জন্য এটি আবশ্যক।
optional যদি ' true সেট করা হয়, তাহলে এই কাজটি সম্পাদন করা সম্ভব না হলে তা এড়িয়ে যাওয়া হয়। উদাহরণস্বরূপ, যখন কোনো স্ক্রিনে এর নির্দিষ্ট UI উইজেটটি খুঁজে পাওয়া যায় না, তখন এই কাজটি এড়িয়ে যাওয়া হয়—এবং এতে সংশ্লিষ্ট রোবো স্ক্রিপ্টটি ব্যর্থ হয় না। ডিফল্টরূপে, এর মান 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 মেলানোর জন্য জাভা রেগুলার এক্সপ্রেশন।
contentDescription
contentDescriptionRegex contentDescription মেলানোর জন্য জাভা রেগুলার এক্সপ্রেশন।
(স্ক্রিনে প্রদর্শিত) text
textRegex text মেলানোর জন্য জাভা রেগুলার এক্সপ্রেশন।
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"
      }
    ]
  }
]

কার্যকর করার বিকল্পগুলি

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

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

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

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

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

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

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

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

  • __%APP_PACKAGE_NAME%__ - পরীক্ষাধীন অ্যাপটির প্যাকেজ নাম।

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

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

মন্তব্য

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

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

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

সক্ষমতা

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

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

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

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

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

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

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

অগ্রাধিকার

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

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

নিম্নলিখিতটি এমন একটি ফাইলের উদাহরণ যেখানে তিনটি রোবো স্ক্রিপ্ট রয়েছে, যেগুলো একই কাজ করে এবং একই শর্তে সক্রিয় হয় — অর্থাৎ, পরীক্ষাধীন অ্যাপটি ফোরগ্রাউন্ডে থাকা।

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

যখন পরীক্ষাধীন অ্যাপটি ফোরগ্রাউন্ডে থাকে, তখন রোবো ক্রমানুসারে নিম্নলিখিতগুলি ট্রিগার করে:

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

বারবার চালানো

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

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

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

ক্রল স্টেজ

একটি নির্দিষ্ট রোবো ক্রলের বিভিন্ন পর্যায়ে রোবো স্ক্রিপ্টগুলো প্রয়োগ করা যায়:

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

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

নিম্নলিখিতটি একটি রোবো স্ক্রিপ্টের উদাহরণ যা রোবো ক্রল করা শুরু করার আগে পরীক্ষাধীন অ্যাপটির ব্যবহারকারীর ডেটা মুছে ফেলে:

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

নিম্নলিখিতটি একটি রোবো স্ক্রিপ্টের উদাহরণ যা রোবোকে নির্দেশ দেয় যে, যখনই এটি কোনো কনফার্মেশন ডায়ালগ থেকে ফিরে যাওয়ার (ব্যাকট্র্যাক) চেষ্টা করবে, তখন যেন "Cancel" বোতামে ক্লিক করে:

{
  "id": 1000,
  "crawlStage": "close_screen",
  "maxNumberOfRuns": 999,
  "contextDescriptor": {
    "condition": "element_present",
    "elementDescriptors": [
      {
        "resourceId": "my.app.package:id/confirmation_dialog"
      }
    ]
  },
  "actions": [
    {
      "eventType": "VIEW_CLICKED",
      "elementDescriptors": [
        {
          "text": "Cancel"
        }
      ]
    }
  ]
}

শর্তসাপেক্ষ ক্রিয়া

একটি রোবো স্ক্রিপ্টে শর্তসাপেক্ষ ক্রিয়া থাকতে পারে। শর্তসাপেক্ষ ক্রিয়াগুলির তিনটি অতিরিক্ত অ্যাট্রিবিউট থাকে যা বর্ণনা করে যে রোবো কীভাবে সেগুলি সম্পাদন করে:

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

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

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

{
  "id": 1000,
  "actions": [
    {
      "description": "Dismiss popup",
      "maxNumberOfRuns": 100,
      "contextDescriptor": {
        "condition": "default_launcher_shown",
        "negateCondition": true
      },
      "eventType": "GO_HOME"
    },
    {
      "description": "Screen off",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 26"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "WAIT",
      "delayTime": 10000
    },
    {
      "description": "Screen on",
      "eventType": "ADB_SHELL_COMMAND",
      "command": "input keyevent 82"
    },
    {
      "description": "Wait for 10 seconds",
      "eventType": "WAIT",
      "delayTime": 10000
    }
}

উপেক্ষা করার ক্রিয়া

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

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

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

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

[
  {
    "id": 1000,
    "contextDescriptor": {
      "condition": "element_present",
      "elementDescriptors": [
        {
          "resourceId": "my.app.package:id/ignored_screen"
        }
      ]
    },
    "actions": [
      {
        "eventType": "ALL_ELEMENTS_IGNORED"
      }
    ]
  },
  {
    "id": 1001,
    "contextDescriptor": {
      "condition": "element_present",
      "elementDescriptors": [
        {
          "resourceId": "my.app.package:id/main_screen"
        }
      ]
    },
    "actions": [
      {
        "eventType": "ELEMENT_IGNORED",
        "elementDescriptors": [
          {
            "resourceIdRegex": ".*:id/done"
          }
        ]
      }
    ]
  }
]

RecyclerView এবং AdapterView সমর্থন

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

সুতরাং, রোবো স্ক্রিপ্ট তার ক্রিয়াকলাপের লক্ষ্যবস্তু RecyclerView চাইল্ডগুলোর পরম ডেটা অবস্থানকে recyclerViewChildPosition হিসেবে ধারণ করে। এছাড়াও, রোবো স্ক্রিপ্ট তার ক্রিয়াকলাপের লক্ষ্যবস্তু AdapterView চাইল্ডগুলোর পরম ডেটা অবস্থানকে adapterViewChildPosition হিসেবে ধারণ করে।

RecyclerView এবং AdapterView-এর চাইল্ডগুলোর উপর অ্যাকশনগুলো নিম্নলিখিত ধাপে সম্পন্ন করা হয়:

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

অ্যান্ড্রয়েড স্টুডিওতে একটি রোবো স্ক্রিপ্ট রেকর্ড করুন এবং Test Lab এটি চালান।

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

যখন আপনি স্ক্রিপ্ট সংযুক্ত করে একটি রোবো টেস্ট চালান, তখন রোবো টেস্ট প্রথমে আপনার পূর্ব-নির্ধারিত কাজগুলো সম্পন্ন করে এবং তারপর স্বাভাবিকভাবে অ্যাপটি অন্বেষণ করে।

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

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

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

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

দাবি

যদি প্রতিশ্রুত শর্তটি সত্য হয়, তাহলে রোবো স্ক্রিপ্টটি পরবর্তী ধাপে এগিয়ে যায়, যা আরেকটি অ্যাসারশন হতে পারে। অন্যথায়, অ্যাসারশন ব্যর্থ হওয়ার কারণে রোবো স্ক্রিপ্টটির নির্বাহ থেমে যায়।

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

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

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

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

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

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

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

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

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

নিম্নলিখিতটি একটি রোবো স্ক্রিপ্ট অ্যাকশনের উদাহরণ যা 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 কার্যকর করার জন্য অ্যান্ড্রয়েড ডিবাগ ব্রিজ (adb) শেল কমান্ড।

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

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

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

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

অনুমতি দিন

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

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

বৈশিষ্ট্য বর্ণনা
"eventType": "PERMISSIONS_REQUEST" --

স্ক্রিনের সমস্ত উপাদান উপেক্ষা করুন

এই পদক্ষেপটি রোবোকে যেকোনো স্ক্রিনের সেই সমস্ত উপাদান উপেক্ষা করতে বাধ্য করে, যা ধারণকারী রোবো স্ক্রিপ্টটিকে সক্রিয় করে।

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

বৈশিষ্ট্য বর্ণনা
"eventType": "ALL_ELEMENTS_IGNORED" --

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

{
  "eventType": "ALL_ELEMENTS_IGNORED"
}

একটি উপাদান উপেক্ষা করুন

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

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

বৈশিষ্ট্য বর্ণনা
"eventType": "ELEMENT_IGNORED" --
elementDescriptors অ্যান্ড্রয়েড UI হায়ারার্কি ব্যবহার করে উপেক্ষা করা UI উইজেট(গুলি) শনাক্ত করে।

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

  • ignoreChildren - যদি এটি true সেট করা হয়, তাহলে Robo উপেক্ষা করা UI উইজেট(গুলি)-এর সমস্ত উত্তরসূরিদেরও উপেক্ষা করে। ডিফল্টরূপে, এটি false থাকে।

নিম্নলিখিতটি একটি রোবো স্ক্রিপ্ট অ্যাকশনের উদাহরণ যা রোবোকে সেই সমস্ত উপাদান উপেক্ষা করতে নির্দেশ দেয়, যাদের বিষয়বস্তুর বিবরণ "Avatar" দিয়ে শুরু হয়:

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

ইনপুট টেক্সট

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

বৈশিষ্ট্য বর্ণনা
eventType রোবো স্ক্রিপ্ট অ্যাকশনের ধরণ নির্দিষ্ট করে।
"eventType": "VIEW_TEXT_CHANGED" প্রদত্ত টেক্সটটি টার্গেট UI উইজেটে ইনপুট করে।
"eventType": "ENTER_TEXT" প্রদত্ত টেক্সটটি টার্গেট UI উইজেটে ইনপুট করে এবং তারপর এই UI উইজেটে একটি KEYCODE_ENTER ইভেন্ট পাঠায়।
elementDescriptors অ্যান্ড্রয়েড 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 অ্যান্ড্রয়েড UI হায়ারার্কি ব্যবহার করে লক্ষ্য UI উইজেটটি শনাক্ত করে। visionText সাথে পারস্পরিকভাবে বর্জনীয়।
visionText OCR ব্যবহার করে দীর্ঘক্ষণ ক্লিক করা এলিমেন্টটি শনাক্ত করে। elementDescriptors সাথে পারস্পরিকভাবে বর্জনীয়।
matchIndex যখন visionText ব্যবহার করে টার্গেট এলিমেন্টটি শনাক্ত করা হয়, তখন এটি মিলে যাওয়া টার্গেট এলিমেন্টটির উপস্থিতির সূচক নির্দিষ্ট করে। যদি এর মান 0 হয়, তাহলে রোবো স্ক্রিপ্ট অ্যাকশন প্রথম মিলে যাওয়া এলিমেন্টটি বেছে নেয়; যদি এর মান 1 হয়, তাহলে রোবো স্ক্রিপ্ট অ্যাকশন দ্বিতীয় মিলে যাওয়া এলিমেন্টটি বেছে নেয়, এবং এভাবেই চলতে থাকে। ক্রমটি বাম থেকে ডানে এবং উপর থেকে নিচে নির্ধারিত হয়। ডিফল্ট মান হলো 0 (প্রথম মিলটিই বেছে নেওয়া হয়)।

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

  • delayTime - এটি নির্দিষ্ট করে যে একটি লং ক্লিক কতক্ষণ ধরে চেপে থাকবে, যা মিলিসেকেন্ডে পরিমাপ করা হয়।

নিম্নলিখিতটি একটি রোবো স্ক্রিপ্ট অ্যাকশনের উদাহরণ যা "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 থাকে।

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

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

দুই-বিন্দু অঙ্গভঙ্গি সম্পাদন করুন

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

বৈশিষ্ট্য বর্ণনা
"eventType": "TWO_POINT_GESTURE" --
coordinates একটি দুই-বিন্দু অঙ্গভঙ্গির জন্য চারটি স্থানাঙ্ক, যা "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" আকারে শতাংশ বা পিক্সেলে বিন্যস্ত।

নিম্নলিখিতটি একটি রোবো স্ক্রিপ্ট অ্যাকশনের উদাহরণ যা একটি পিঞ্চ আউট জেসচার সম্পাদন করে:

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

একটি IME পদক্ষেপ সম্পাদন করুন

এই অ্যাকশনটি ইনপুট মেথড এডিটর (IME)-এ নির্দিষ্ট টার্গেট UI উইজেটের জন্য বর্তমান অ্যাকশন বাটন, যেমন—নেক্সট, ডান এবং সার্চ, চাপে।

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

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

নিম্নলিখিতটি একটি রোবো স্ক্রিপ্ট অ্যাকশনের উদাহরণ যা "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" অ্যান্ড্রয়েড স্টুডিওর রোবো স্ক্রিপ্ট রেকর্ডার দ্বারা এমুলেটরগুলিতে ব্যাক বাটন চাপার জন্য ব্যবহৃত হয় এপিআই ২৮।

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

{
  "eventType": "PRESSED_BACK"
}

প্রেস হোম

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

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

বৈশিষ্ট্য বর্ণনা
"eventType": "GO_HOME" --

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

{
  "eventType": "GO_HOME"
}

একটি উপাদানকে স্ক্রল করে দৃশ্যমান করুন

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

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

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

নিম্নলিখিতটি একটি রোবো স্ক্রিপ্ট অ্যাকশনের উদাহরণ যা "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 অ্যান্ড্রয়েড UI হায়ারার্কি ব্যবহার করে টার্গেট UI উইজেটটি শনাক্ত করে।

নিম্নলিখিতটি একটি রোবো স্ক্রিপ্ট অ্যাকশনের উদাহরণ যা "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 সাথে পরস্পর বর্জনশীল।

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

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

একটি উপাদানের মধ্যে একটি বিন্দুতে ট্যাপ করুন

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

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

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

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

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

এই পদক্ষেপটি রোবো পরীক্ষাটি বন্ধ করে দেয়।

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

বৈশিষ্ট্য বর্ণনা
"eventType": "TERMINATE_CRAWL" --

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

{
  "eventType": "TERMINATE_CRAWL"
}

অপেক্ষা করুন

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

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

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

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

একটি উপাদানের জন্য অপেক্ষা করুন

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

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

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

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

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

পরবর্তী পদক্ষেপ