Robo 指令碼參考指南

本文件提供 Robo 指令碼的相關參考資訊,包括 結構、功能、使用、記錄和動作Robo 指令碼是 測試行動應用程式的人工品質查驗 (QA) 任務。 啟用持續整合 (CI) 和正式發布前測試策略。機器 指令碼是 JSON 檔案,用於描述使用者介面 (UI) 序列 或執行其他動作

您可以按照下列方式建立 Robo 指令碼:

  • 使用 Robo 指令碼錄製功能。(僅限 Android 裝置)

  • 手動建立 Robo 指令碼。(Android 和 iOS 以上版本)

  • 錄製 Robo 指令碼,然後手動編輯。(僅限 Android 裝置)

如要進一步瞭解如何使用 Robo 指令碼,請參閱「執行 Robo 指令碼

簡介

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

iOS+ 支援 Robo 指令碼

適用於 iOS+ (Beta 版) 的 Robo (Beta 版) 僅對 Robo 指令碼提供有限支援。 iOS+ 的 Robo 指令碼語法和 Android 語法相同,且支援 iOS+ 功能的運作方式與 Android 應用程式相似

iOS+ 支援下列動作:

  • 斷言
  • 點按
  • 長按
  • 滑動
  • 忽略所有元素
  • 等待
  • 擷取螢幕截圖
  • 終止檢索

支援在元素描述元中使用下列識別屬性: iOS 以上版本:

  • 類別名稱
  • 祖系類別名稱
  • 內容說明 (和規則運算式)
  • 文字 (和規則運算式)

支援下列結構定義描述元中的觸發條件 iOS 以上版本:

  • 已顯示測試中的應用程式
  • 有元素
  • 已執行非 Robo 指令碼動作

結構

Robo 指令碼有幾項屬性,說明 Robo 的執行方式。 這些屬性大多為選用,並具有預先定義的預設值:

屬性 說明
id 一個整數編號,有助於在檢索輸出中追蹤這個 Robo 指令碼。 Robo 內建有自己的 id 的 Robo 指令碼。雖然 不同 Robo 指令碼中的相同 id 不會影響 行為,區分檢索輸出內容中的動作和這些 Robo 指令碼 並非易事建議您指派一個不重複的 id Robo 指令碼的值為 1000 以上,以免發生衝突。
description id 相似,但較為詳細描述。
crawlStage 檢索 Robo 的階段會在 執行這個 Robo 指令碼。根據預設 那就是主要的檢索階段
priority 與其他 Robo 指令碼相比,這個 Robo 指令碼的優先順序。 根據預設,所有 Robo 指令碼的優先順序都是 1
maxNumberOfRuns 指定檢索 Robo 時可執行這個 Robo 的次數 指令碼根據預設,Robo 可以執行一次 Robo 指令碼。
contextDescriptor 說明觸發這個 Robo 指令碼的情境或條件。 如果省略此引數,系統會將此 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 或 畫面上有 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 個連續位置 Robo 測試所執行的動作並非 Robo 指令碼動作。
negateCondition 如果設為 true,則否定 condition。適用對象 例如,您可以使用這項屬性來檢查 UI 小工具「不」 或應用程式並未在 前景。
elementDescriptors 用於識別螢幕上 UI 小工具的一或多個元素描述元。 這個項目會與 element_present 搭配使用 「element_disabled」和「element_checked」 conditions.與 visionText 互斥。如要 相關資訊,請參閱「元素描述元」。
visionText 系統會使用光學字元辨識技術偵測畫面上的文字 (OCR) API。visionText 會與 element_present 限制條件。與 elementDescriptors
nonRoboscriptActionCount 先前連續執行的非 Robo 指令碼動作數量。是 與 non_roboscript_action_performed 搭配使用 觸發 Robo 指令碼的 nonRoboscriptActionCount Robo 動作。預設為 1

以下是由 UI 小工具觸發的 Robo 指令碼範例 且資源 ID "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"
        }
      ]
    }
  ]
}

以下範例中的 Robo 指令碼範例 光學字元辨識 (OCR) 功能偵測到"Privacy Policy"

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

以下是在後 5 秒後等待 5 秒的 Robo 指令碼範例 每個非指令碼 Robo 動作:

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

動作

Robo 指令碼中的每項動作都表示為一或多個組合 屬性和值組合,詳情請見下表:

屬性 說明
eventType 指定動作類型,例如點擊、文字編輯等。 每個動作都必須輸入一次。
elementDescriptors 用於識別 UI 小工具的描述元。對於 具有目標 UI 小工具,例如點選特定按鈕。
optional 如果設為 true,系統會在無法執行這項操作時略過這個動作 執行任務舉例來說,如果找不到所需動作,系統就會略過這項操作 指定畫面上的 UI 小工具,而不會失敗包含的 Robo 指令碼根據預設,值為 false
replacementText 要輸入至目標 UI 小工具的文字。必須填寫這個欄位 動作。
swipeDirection 指定滑動方向。滑動動作所需。
delayTime 指定等待時間長度 (以毫秒為單位)。等待動作的必要欄位。
pointTapXCoordinate」和「pointTapYCoordinate 觸碰點的像素 X 和 Y 座標。互斥 搭配 pointTapXPercentpointTapYPercent。 點輕觸動作需要。
pointTapXPercent」和「pointTapYPercent 可輕觸點的百分比 X 和 Y 座標。互助 專屬於 pointTapXCoordinatepointTapYCoordinate。點輕觸動作需要。

以下範例是含有兩個未指定目標動作的 Robo 指令碼範例 UI 小工具,表示這些動作無法在特定 UI 上執行 小工具:

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

元素描述元

元素描述元會使用一或多個 識別屬性:

屬性 說明
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 指令碼範例 這兩種動作都需要使用 提供的元素描述元:

[
  {
    "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 指令碼就不會使用 部分比對、略過目前動作及停權。 也就是說,Robo 指令碼會做為一般檢測設備測試執行 並因任何動作無法執行而立即失敗。根據預設 現在為 false
    • dismiss_popups:如果設為 true,Robo 測試會關閉所有非預期的測試 執行 Robo 指令碼時的對話方塊,即使在 strict 模式中也是如此。這個 如果未處於 strict 模式,則不會有任何作用。預設為 false
    • notify:如果設為 false,Robo 指令碼就不會顯示在畫面上 開始和結束時的通知。根據預設 為 true
  • postscript - 執行 Robo 指令碼後套用的執行選項:
    • terminate:如果設為 true,Robo 測試會在 Robo 執行後停止檢索作業 指令碼都已完成預設值為 false

以下範例為沒有在 strict 模式下,在 strict 模式中執行的 Robo 指令碼 休眠三秒的畫面通知,之後檢索 轉機點:

"roboscript": {
  "executionMode": {
    "strict": true,
    "notify": false
  },
  "postscript": {
    "terminate": true
  }
}
[
  {
    "eventType": "DELAYED_MESSAGE_POSTED",
    "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 測試一直試圖 每當應用程式挑選要執行的動作時,Robo 指令碼動作就會派上用場。Robo 指令碼 使用下列技術來提高穩定性:

技巧 說明
部分比對 如果無法完全符合目前的 Robo 指令碼動作,比對相符 然後重試媒合。部分比對 當比對出 Robo 指令碼動作的目標 UI 小工具。

如果部分比對成功,對應的 Robo 指令碼動作 可以照常執行這項技巧適用於 應用程式結構變更,例如不同應用程式版本、畫面時 重新排列元素

略過目前的動作 如果目前的 Robo 指令碼動作無法完全或部分相符, Robo 會嘗試比對後續的 Robo 指令碼動作。如果後續 完全或部分比對符合,Robo 測試會略過 (且從未返回) 目前的 Robo 指令碼動作,並執行後續動作。

這項技術適用於應用程式行為在兩個時間點之間發生變化的情況 或者是較不穩定的問題,例如出現間歇性對話方塊 在錄製與重播 Robo 的同時出現在不同畫面上 指令碼

暫停 如果目前和後續的 Robo 指令碼動作都無法完全或 部分比對相符,Robo 指令碼暫時暫停,並且使用 Robo 測試 挑選要透過其他策略執行的動作。完成這項操作後 完成後,Robo 測試就會繼續執行 Robo 指令碼。

只要目前或後續的 Robo 指令碼動作不相符, Robo 指令碼會保持暫停狀態,執行次數不限。因此, Robo 即使指令碼不見得是 Robo 測試的草本 你可以使用標準 Robo 測試來交錯 Robo 指令碼動作 動作。這項技術適用於應用程式行為不穩定時的情況。 或不同應用程式版本之間變化的規模夠大時 需要「填補漏洞」與標準動作搭配使用

優先順序

如果 Robo 指令碼到達 maxNumberOfRuns,就無法再觸發 自動擷取的資料。如果目前的服務可以觸發多個 Robo 指令碼 請依下列順序,由 Robo 指令碼決定優先順序 顯示:

  1. 具有 contextDescriptor 屬性。
  2. priority 的值最高 (根據預設,所有 Robo 指令碼皆相同) 第 priority 項 (共 1 項)。
  3. 出現在 Robo 指令碼清單中 (如有 Robo 指令碼)優先順序 保持不變

以下範例檔案包含三個 Robo 指令碼來執行 在前景執行:

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

當應用程式在前景執行時,Robo 會在前景執行以下動作: 順序:

  1. "Robo script 2",因為其優先順序最高。
  2. "Robo script 1",因為此 ID 會較早於其餘適用範圍內出現 優先順序相同的 Robo 指令碼。
  3. "Robo script 3" 為最後一個適用的 Robo 指令碼。

重複執行

根據預設,在檢索期間,Robo 最多會觸發 Robo 指令碼。可用的值包括 透過 maxNumberOfRuns 屬性調整。

以下範例是利用 Robo 指令碼來執行應用程式背測試的程序 背景執行最多 10 次

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

檢索階段

Robo 指令碼適用於特定 Robo 檢索的各個階段:

檢索階段 說明
pre_crawl Robo 啟動並開始檢索該應用程式之前。
post_crawl Robo 完成應用程式下層測試的檢索作業後,
crawl 主要的檢索階段,也就是 Robo 檢索應用程式之下測試的時間。
close_screen 當 Robo 嘗試從指定畫面返回 (返回) 時, 已探索這個畫面上所有可能的動作。根據預設,Robo 按下返回鍵,因此在某些情況下是理想的結果。

如果未指定 Robo 指令碼的 crawlStage 屬性,則隱含 應為 crawl

以下是清除應用程式背後測試使用者的 Robo 指令碼範例 下列資料:

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

以下是指示 Robo 點擊的 Robo 指令碼範例 每次嘗試從確認返回返回 (backtrack) 時 "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 指令碼根據預設,所有條件式 在單一 Pod 中執行一次 包含 Robo 指令碼
contextDescriptor 觸發這項條件動作的情境/條件。這個元件具有 具備類似架構的能力 Robo 指令碼的 contextDescriptor

Robo 指令碼觸發後會逐一執行 顯示順序。如果 Robo 指令碼含有條件動作,系統就會執行這些動作 ,然後在每次挑選非條件式動作前,一律考量這些條件。如果 系統會根據動作的優先順序和 則代表 Robo 指令碼會執行這項條件動作。 否則,Robo 指令碼會執行下列非條件動作。預期時間 Robo 指令碼必須含有至少一個非條件動作。

以下是無條件式 Robo 指令碼的範例, 在 Robo 執行期間的任何時間點,關閉彈出式對話方塊的動作 指令碼執行:

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

忽略動作

Robo 指令碼可包含讓 Robo 忽略特定使用者介面的指示 或特定畫面中的所有 UI 小工具這些操作說明 代表忽略「actions」與eventType ELEMENT_IGNOREDALL_ELEMENTS_IGNORED

每當含有忽略的 Robo 指令碼的 contextDescriptor 屬性 動作符合指定畫面,Robo 不會與任何 UI 小工具互動 被忽略動作鎖定的目標 (除非有其他 Robo 指令碼動作 Robo 會針對其中一個忽略的 UI 小工具執行動作。

Robo 指令碼可以包含忽略、條件式和非條件式的組合 動作。與其他 Robo 指令碼動作不同,系統會持續套用忽略動作 因為當中含有 Robo 指令碼的 contextDescriptor, 無論 prioritymaxNumberOfRuns 的值為何,系統會透過 Robo 檢索 屬性。

以下是含有兩個 Robo 指令碼的檔案範例。第一個 Robo 指令碼會導致 Robo 在含有 UI 小工具的畫面中,忽略所有 UI 小工具 資源 ID "my.app.package:id/ignored_screen"。第二個 Robo 指令碼 Robo 忽略了資源 ID 與 Cloud 規則運算式 ".*:id/done" 相符的 UI 小工具 包含具有資源 ID 的 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 指令碼也會擷取絕對資料 為 Robo 指令碼動作目標的 AdapterView 子項位置 adapterViewChildPosition

RecyclerView 和 AdapterView 子項的動作如下 步驟:

  1. Robo 測試可確保螢幕顯示相應的子項 透過其包含 RecyclerView 或 AdapterView 的定位動作。

  2. Robo 測試會直接對子項元素執行錄製的動作 已經出現在螢幕上

以下是 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 使用應用程式,並據此執行測試。

執行附有指令碼的 Robo 測試時,Robo 測試的第一步必須完成 ,然後照常探索應用程式。

如要在 Android Studio 中建立 Robo 指令碼 JSON 檔案,請按照下列步驟操作: 在 Android Studio 中使用 Test Lab 錄製 Robo 指令碼

Robo 指令碼動作

下列常見的選用屬性適用於所有動作:

  • description:協助在 Robo 中追蹤這個 Robo 指令碼動作的執行作業 測試輸出內容

斷言

如果斷言的條件為 True,Robo 指令碼會繼續執行下一個 也可以採取另一種斷言否則,系統會執行 Robo 指令碼 因斷言失敗而停止。

下表列出必要屬性:

屬性 說明
"eventType": "ASSERTION" --
contextDescriptor 說明斷言的情境或狀況。都具有相同的結構 並提供與 Robo 指令碼的 contextDescriptor 一文。

以下是 Robo 指令碼斷言的範例, app-under-test 位於前景:

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

以下是檢查 UI 時,使用 Robo 指令碼斷言的範例 資源 ID 為 "com.google.samples.apps.topeka:id/done" 的小工具為 。

{
  "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" 點按 app-under-test 的目標元素。
"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
maxNumberOfRuns 指定螢幕鍵盤隨機元素的點擊次數 當 eventTypeSOFT_KEYBOARD_RANDOM_CLICK 時。 預設值為 1

以下是 Robo 指令碼動作的範例,此動作會點擊含有 資源 ID "com.google.samples.apps.topeka:id/done"

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

以下是點選後 已在採用 OCR 技術的畫面上偵測到"Privacy Policy"

{
  "eventType": "VIEW_CLICKED",
  "visionText": "Privacy Policy"
}

以下範例是點擊軟件式麥克風動作的 Robo 指令碼動作 包含內容說明 "Emoji button" 的鍵盤元素:

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

以下範例是點擊隨機軟性程式碼的 Robo 指令碼動作 最多五次的鍵盤元素:

{
  "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 Test Recorder 回溯相容。 Robo 測試會在一開始進行應用程式下測試時授予所有權限 每次檢索,因此這個動作是免人工管理的。請「勿」在 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 指定 Robo 指令碼動作的類型。
"eventType": "VIEW_TEXT_CHANGED" 將指定文字輸入至目標 UI 小工具。
"eventType": "ENTER_TEXT" 將給定的文字輸入目標 UI 小工具,然後 對這個 UI 小工具發出 KEYCODE_ENTER 事件。
elementDescriptors 使用 Android UI 階層識別目標 UI 小工具。
replacementText 要輸入至目標 UI 小工具的文字。

以下是輸入 "John" 的 Robo 指令碼動作範例 含有資源 ID 的 UI 小工具 "com.google.samples.apps.topeka:id/first_name"

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

以下為選用屬性:

  • 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

以下是 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%)"
}

執行輸入法編輯器動作

這個動作會按下目前的動作按鈕 (例如「繼續」、「完成」及 搜尋。

下表列出必要屬性:

屬性 說明
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors 使用 Android UI 階層識別目標 UI 小工具。

以下是執行輸入法編輯器動作的 Robo 指令碼動作範例 以資源 ID 為例 "com.google.samples.apps.topeka:id/first_name":

{
  "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 版本

以下是按下返回的 Robo 指令碼動作範例:

{
  "eventType": "PRESSED_BACK"
}

按下主畫面按鈕

這個動作會將 KEYCODE_HOME 事件傳送至裝置。

下表列出必要屬性:

屬性 說明
"eventType": "GO_HOME" --

以下為按下主畫面的 Robo 指令碼動作範例:

{
  "eventType": "GO_HOME"
}

將元素捲動至檢視畫面中

這項操作會讓 Robo 測試在 UI 小工具向前捲動 已指定 elementDescriptors,直到 UI 小工具符合指定的 螢幕上會顯示 childElementDescriptors,或捲動的小工具可以 或已達到 50 次捲動的數量上限。

下表列出必要屬性:

屬性 說明
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors 使用 Android UI 階層識別捲動式 UI 小工具。
childElementDescriptors 識別使用 Android UI 階層要捲動的 UI 小工具。

以下是會捲動 UI 小工具的 Robo 指令碼動作範例 資源 ID 為 "my.app.package:id/scrollable_card_container",直到 UI 為止 螢幕上有文字 "Orange" 的小工具 (或者無法捲動更多捲動 或達到 50 次捲動的數量上限):

{
  "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
  • ForwardDownRight (視垂直或水平捲動能力而定) 目標 UI 小工具
  • BackwardUpLeft 視目標 UI 的垂直或水平捲動性而定
elementDescriptors 使用 Android UI 階層識別目標 UI 小工具。

以下是會向上滑動 UI 小工具的 Robo 指令碼動作範例 且資源 ID 為 "my.app.package:id/custom_content"

{
  "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》。

以下是在 螢幕:

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

輕觸元素中的點

下表列出必要屬性:

屬性 說明
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent 目標元素中的百分比 X 座標。
pointTapYPercent 目標元素中的百分比 Y 座標。
elementDescriptors 使用 Android UI 階層識別目標 UI 小工具。

以下是移動跳轉滑桿的 Robo 指令碼動作範例 。

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

終止檢索

這項操作會停止 Robo 測試。

下表列出必要屬性:

屬性 說明
"eventType": "TERMINATE_CRAWL" --

以下是停止 Robo 測試的 Robo 指令碼動作範例:

{
  "eventType": "TERMINATE_CRAWL"
}

等待

下表列出必要屬性:

屬性 說明
"eventType": "DELAYED_MESSAGE_POSTED" --
delayTime 指定等待時間長度 (以毫秒為單位)。

以下是等待三次的 Robo 指令碼動作範例 秒:

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

等待元素

這項操作會讓 Robo 測試等到元素顯示在畫面上 指定的逾時時間

下表列出必要屬性:

屬性 說明
"eventType": "WAIT_FOR_ELEMENT" --
delayTime 指定等待逾時 (以毫秒為單位)。
elementDescriptors 使用 Android UI 階層識別已等待的 UI 小工具。

以下是等待 30 以下的 Robo 指令碼動作範例 包含資源 ID 的 UI 小工具秒數 "my.app.package:id/confirmation_button"

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

後續步驟