Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Robo komut dosyaları başvuru kılavuzu

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Bu belge, yapı, yetenekler, kullanım, kayıt ve eylemler dahil olmak üzere Robo betikleri hakkında referans bilgileri sağlar. Robo betikleri , mobil uygulamalar için manuel kalite güvencesi (QA) görevlerini otomatikleştiren ve sürekli entegrasyon (CI) ve lansman öncesi test stratejileri sağlayan testlerdir. Bir Robo betiği, bir kullanıcı arabirimi (UI) dizisini ve diğer eylemleri açıklayan bir JSON dosyasıdır.

Aşağıdaki şekillerde bir Robo betiği oluşturabilirsiniz:

  • Robo komut dosyası kayıt özelliğini kullanın.
  • Robo betiğini manuel olarak oluşturun.
  • Robo komut dosyasını kaydedin ve ardından manuel olarak düzenleyin.

Robo betiklerini kullanma hakkında daha fazla bilgi edinmek için Robo betiği çalıştırma bölümüne bakın.

Robo komut dosyası, test edilen uygulama Android Uygulama Paketi (APK) gibi diğer girdilerin yanı sıra Robo testine sağlanır.

Aşağıda, bir kullanıcıyı bir uygulamada oturum açan bir Robo komut dosyası örneği verilmiştir:

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

Yapı

Bir Robo komut dosyasındaki her eylem, aşağıdaki tabloda açıklanan bir veya daha fazla özellik-değer çiftinin bir demeti olarak temsil edilir:

Bağlanmak Açıklama
eventType Eylemin türünü belirtir, örneğin tıklama, metin düzenleme vb. Her eylem için gereklidir.
elementDescriptors Bir UI widget'ını tanımlayan tanımlayıcılar. Belirli bir düğmeyi tıklamak gibi, hedef kullanıcı arabirimi widget'ına sahip tüm eylemler için gereklidir.
optional true olarak ayarlanırsa, gerçekleştirilemediğinde bu eylem atlanır. Örneğin, bir ekranda hedef UI widget'ını bulamadığında bu eylem atlanır - içeren Robo komut dosyası başarısız olmaz. Varsayılan olarak, değer false şeklindedir.
replacementText Hedef kullanıcı arayüzü parçacığına girilecek metin. Metin düzenleme işlemleri için gereklidir.
swipeDirection Kaydırmanın yönünü belirtir. Kaydırma işlemleri için gereklidir.
delayTime Milisaniye cinsinden ne kadar bekleneceğini belirtir. Bekleme eylemleri için gereklidir.
pointTapXCoordinate ve pointTapYCoordinate Dokunulan noktanın piksel X ve Y koordinatları. pointTapXPercent ve pointTapYPercent ile birbirini dışlayan. Noktaya dokunma eylemleri için gereklidir.
pointTapXPercent ve pointTapYPercent Dokunulan noktanın yüzde X ve Y koordinatları. pointTapXCoordinate ve pointTapYCoordinate ile birbirini dışlayan. Noktaya dokunma eylemleri için gereklidir.

Aşağıda, hedef UI widget'ları olmayan iki eylem içeren bir Robo komut dosyası örneği verilmiştir; bu, bu eylemlerin belirli bir UI widget'ında çalışmadığı anlamına gelir:

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

Öğe tanımlayıcıları

Bir öğe tanımlayıcısı, aşağıdaki tanımlayıcı özniteliklerden birini veya daha fazlasını kullanarak bir UI widget'ını tanımlar:

Bağlanmak Açıklama
className
ancestorClassName Öğenin kullanıcı arayüzü hiyerarşi atasının sınıf adı. Ata, öğenin kendisi de dahil olmak üzere, öğenin kullanıcı arabirimi hiyerarşisindeki üst düğümlerden herhangi biridir.
resourceId
resourceIdRegex resourceId ile eşleşecek Java normal ifadesi.
contentDescription
contentDescriptionRegex contentDescription ile eşleşecek Java normal ifadesi.
text (ekranda görünen)
textRegex text eşleştirmek için Java normal ifadesi.
groupViewChildPosition , recyclerViewChildPosition veya adapterViewChildPosition Üst parçacığın türüne bağlı olarak bir UI parçacığının alt konumunu temsil eder.

Sıklıkla, bu nitelikler tanımsızdır; örneğin, bir düğmenin metin ve içerik açıklaması olmayabilir. Bazı öznitelik değerleri mevcut olsa bile, belirli bir uygulama ekranında ( resourceId dahil) benzersiz olmayabilirler.

Örneğin, bir listenin öğeleri arasında ayrım yapmak, genellikle yalnızca ana parçacığı içindeki farklı alt konumlarını kullanarak mümkündür. Bu, bir UI widget'ını tanımlamak için yalnızca bir öğe tanımlayıcısı kullanmanın genellikle yetersiz olduğu anlamına gelir. Bu nedenle, bir eylemin elementDescriptors özniteliği, birincisi hedef UI parçacığına, ikincisi hedef UI parçacığının ana pencere öğesine karşılık gelecek şekilde sıralanan bir dizi öğe tanımlayıcı içerir. Bir eylemin hedef kullanıcı arayüzü parçacığı, tüm öğe tanımlayıcıları karşılık gelen kullanıcı arabirimi parçacığı alt hiyerarşisiyle eşleştiğinde eşleştirilir.

Aşağıda, her ikisi de sağlanan öğe tanımlayıcılarını kullanarak hedef kullanıcı arabirimi pencere bileşenini tanımlamanızı gerektiren, metin değiştirme ve tıklama eylemleri içeren bir Robo komut dosyası örneği verilmiştir:

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

Yürütme seçenekleri

İsteğe bağlı olarak, bir Robo betiğindeki eylem listesinin önüne, o Robo betiği için yürütme seçeneklerini belirten bir JSON nesnesi ekleyebilirsiniz. Bu yapılandırma başlığı, roboscript anahtar sözcüğü ile başlar ve ardından istenen yürütme seçeneklerinin bir JSON temsili gelir.

Robo betikleri aşağıdaki yürütme seçeneklerini destekler:

  • executionMode - bir Robo betiği çalışırken uygulanan yürütme seçenekleri:
  • postscript - bir Robo betiği tamamlandıktan sonra uygulanan yürütme seçenekleri:
    • terminate - true olarak ayarlanırsa Robo testi, Robo betiği tamamlandıktan sonra taramayı durdurur.

Aşağıda, strict modda yürütülen ve üç saniye uyuyan, ardından taramanın durduğu bir Robo komut dosyası örneği verilmiştir:

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

Şablon parametreleri

Bir şablon parametresi , bir Robo komut dosyasında, Robo testi yürütme için bu Robo komut dosyasını yüklediğinde gerçek değerle değiştirilen bir yer tutucudur. Şablon parametrelerinin önüne bir çift alt çizgi ve ardından bir yüzde işareti eklenir ve bir yüzde işaretinin ardından bir çift alt çizgi eklenir.

Robo betikleri aşağıdaki şablon parametresini destekler:

  • __%APP_PACKAGE_NAME%__ - test edilen uygulamanın paket adı.

Aşağıda, test edilen uygulama sürecini durduran bir Robo komut dosyası örneği verilmiştir:

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

Yorumlar

Bir Robo komut dosyası, # veya // ile başlayan satırlar olan yorum satırları içerebilir.

Aşağıda, birkaç yorum içeren bir Robo komut dosyası örneği verilmiştir:

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

Yetenekler

Varsayılan olarak, bir Robo betiğinin tüm eylemleri tamamlanana (veya en azından denenene) kadar, Robo betiği etkin kalır. Robo testi, gerçekleştirilecek bir eylemi seçerken bir Robo komut dosyası eylemini eşleştirmeye çalışır. Robo komut dosyası, sağlamlığı artırmak için aşağıdaki teknikleri kullanır:

teknik Açıklama
Kısmi eşleştirme Mevcut Robo komut dosyası eylemi tam olarak eşleştirilemezse, eşleştirme kriterleri gevşetilir ve eşleştirme yeniden denenir. Kısmi eşleştirme, bir Robo komut dosyası eyleminin hedef kullanıcı arabirimi parçacığıyla eşleşirken en dıştaki öğe tanımlayıcısını dikkate almaz.

Kısmi eşleştirme başarılı olursa, karşılık gelen Robo komut dosyası eylemi her zamanki gibi gerçekleştirilir. Bu teknik, örneğin uygulama sürümleri arasında ekran öğeleri yeniden düzenlendiğinde uygulama yapısının değiştiği senaryoları destekler.

Geçerli eylemi atla Geçerli Robo komut dosyası eylemi tamamen veya kısmen eşleştirilemezse Robo, sonraki Robo komut dosyası eylemini eşleştirmeye çalışır. Sonraki eylem tamamen veya kısmen eşleşirse, Robo testi mevcut Robo komut dosyası eylemini atlar (ve asla geri dönmez) ve sonrakini gerçekleştirir.

Bu teknik, uygulama davranışının sürümler arasında değiştiği veya kesintili olduğu senaryoları destekler; örneğin, bir Robo betiğinin kaydı veya yeniden oynatılması sırasında farklı ekranlarda aralıklı bir iletişim kutusu görünebilir.

Askıya almak Ne mevcut ne de sonraki Robo komut dosyası eylemleri tamamen veya kısmen eşleştirilemezse, Robo komut dosyası geçici olarak askıya alınır ve Robo testi, diğer stratejilerini kullanarak gerçekleştirmek için bir eylem seçer. Bu eylem tamamlandıktan sonra Robo testi, Robo komut dosyasını yürütmeye devam eder.

Mevcut veya sonraki Robo betiği eylemleri eşleştirilemediği sürece, Robo betiği herhangi bir sayıda eylem için askıda kalır. Bu nedenle, Robo betiklerinin mutlaka bir Robo testi için bir önsöz olması gerekmez ve Robo betiği eylemlerini standart Robo testi eylemleriyle karıştırabilirsiniz. Bu teknik, uygulama davranışının düzensiz olduğu veya uygulama sürümleri arasındaki değişikliklerin, Robo testinin standart eylemleriyle "boşlukları doldurması" için ihtiyaç duyduğu kadar büyük olduğu senaryoları destekler.

RecyclerView ve AdapterView desteği

RecyclerView ve AdapterView pencere öğelerinin alt öğeleri dinamik olarak yüklenir ve geçerli ekrandan çok sayıda kaydırılarak görüntülenebilir. Bir ekranın boyutu ve bu çocuğa ulaşmak için gereken kaydırma sayısı, farklı cihaz form faktörlerinde farklı olduğundan, çocuğun kesin olan veri konumuna güvenmek çok daha sağlamdır. Bu çocuğu ekrana getirmek ve ardından ekran konumunu kullanmak için gereken kaydırma sayısına güvenmek daha az sağlam bir yaklaşımdır.

Bu nedenle, Robo betiği, Robo betiği eylemlerinin hedefi olan RecyclerView alt öğelerinin mutlak veri konumlarını recyclerViewChildPosition olarak yakalar. Robo betiği ayrıca, AdapterViewChildPosition olarak Robo betiği eylemlerinin hedefi olan adapterViewChildPosition alt öğelerinin mutlak veri konumlarını da yakalar.

RecyclerView ve AdapterView alt öğelerindeki eylemler aşağıdaki adımlarda gerçekleştirilir:

  1. Robo testi, ilgili çocuğun, içerdiği RecyclerView veya AdapterView üzerinde bir konumlandırma eylemi aracılığıyla ekranda görüntülenmesini sağlar.

  2. Robo test, ekranda zaten görüntülendiği için kaydedilen eylemi doğrudan alt öğe üzerinde gerçekleştirir.

Aşağıda, bir AdapterView ( android.widget.GridView ) alt öğesinde bir tıklama eylemi örneği verilmiştir:

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

Aşağıda, bir RecyclerView ( android.support.v7.widget.RecyclerView ) alt öğesinde bir tıklama eylemi örneği verilmiştir:

{
  "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'da bir Robo betiği kaydedin ve Test Lab'de çalıştırın

Komut dosyasını bir JSON dosyası olarak kaydeden Android Studio'da bir Robo komut dosyası oluşturabilirsiniz. Daha sonra JSON dosyasını uygulama ile Firebase Test Lab'e yükleyebilir ve testi buna göre çalıştırabilirsiniz.

Ekli bir komut dosyasıyla bir Robo testi çalıştırdığınızda, Robo testi önce önceden komut dosyası oluşturulmuş eylemlerinizi gerçekleştirir ve ardından uygulamayı her zamanki gibi keşfeder.

Android Studio'da bir Robo betiği JSON dosyası oluşturmak için Android Studio'da Test Lab kullanarak Robo betiği kaydetme bölümündeki adımları izleyin.

Robo komut dosyası eylemleri

Aşağıdaki ortak isteğe bağlı özellik, tüm eylemler için geçerlidir:

  • description - Robo test çıktılarında bu Robo komut dosyası eyleminin yürütülmesinin izlenmesine yardımcı olur.

İddia

İddia edilen koşul doğruysa Robo betiği, başka bir iddia olabilecek bir sonraki eyleme devam eder. Aksi takdirde, Robo betiği yürütme başarısız bir onay nedeniyle durdurulur ve test sonucu FAILED olur.

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "ASSERTION" --
contextDescriptor İddia edilen bağlamı veya koşulu açıklar.

Bağlam tanımlayıcı

Bir bağlam tanımlayıcısı, aşağıdaki özniteliklerden birini veya bunların bir kombinasyonunu kullanarak bağlamı/koşulu tanımlar:

Bağlanmak Açıklama
"condition": "element_present" elementDescriptors veya visionText tarafından belirtilen metinle eşleşen bir kullanıcı arabirimi parçacığı olup olmadığını kontrol eder.
"condition": "element_disabled" elementDescriptors ile eşleşen bir UI parçacığının ekranda mevcut olup olmadığını ve onunla etkileşime geçilemeyeceğini kontrol eder.
"condition": "element_checked" elementDescriptors ile eşleşen bir kullanıcı arabirimi parçacığı olup olmadığını kontrol eder ve kontrol edilir.
"condition": "app_under_test_shown" Test edilen uygulamanın ön planda çalışıp çalışmadığını kontrol eder.
"condition": "default_launcher_shown" Bir cihazın ana ekranının gösterilip gösterilmediğini kontrol eder, bu da ön planda hiçbir uygulamanın çalışmadığı anlamına gelir.
"condition": "non_roboscript_action_performed" Robo testi tarafından gerçekleştirilen son eylemin bir Robo komut dosyası eylemi olmadığını kontrol eder.
negateCondition true olarak ayarlanırsa, condition reddeder. Örneğin, ekranda bir UI parçacığı OLMADIĞINI veya test edilen uygulamanın ön planda ÇALIŞMADIĞINI kontrol etmek için bu özniteliği kullanabilirsiniz.
elementDescriptors Ekranda bir UI widget'ını tanımlayan bir veya daha fazla öğe tanımlayıcısı. element_present , element_disabled ve element_checked koşullarıyla birlikte kullanılır. visionText ile birbirini dışlar. Daha fazla bilgi için bkz. Öğe tanımlayıcıları .
visionText Ekrandaki metin, Optik Karakter Tanıma (OCR) API'si kullanılarak algılanır. visionText , element_present koşuluyla birlikte kullanılır. elementDescriptors ile birbirini dışlar.

Aşağıda, test edilen uygulamanın ön planda olup olmadığını kontrol eden bir Robo komut dosyası doğrulama örneği verilmiştir:

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

Aşağıda, ekranda "com.google.samples.apps.topeka:id/done" kaynak kimliğine sahip bir UI widget'ının bulunup bulunmadığını kontrol eden bir Robo komut dosyası doğrulama örneği verilmiştir:

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

Aşağıda, OCR kullanan bir ekranda "Settings" algılanıp algılanmadığını kontrol eden bir Robo komut dosyası doğrulama örneği verilmiştir:

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "element_present",
    "negateCondition": true,
    "visionText": "Settings"
  }
}

Tıklamak

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
eventType Robo komut dosyası eyleminin türünü belirtir.
"eventType": "VIEW_CLICKED" Test edilen uygulamanın hedef öğesini tıklar.
"eventType": "SOFT_KEYBOARD_CLICK" Yazılım klavyesinin hedef öğesini tıklar.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Yazılım klavyesinin maxNumberOfRuns katına kadar rasgele öğelerini tıklar.
"eventType": "LIST_ITEM_CLICKED" Liste öğelerini tıklamak için Android Studio'daki Robo komut dosyası kaydedici tarafından kullanılır.
elementDescriptors Android UI hiyerarşisini kullanarak tıklanan UI widget'ını tanımlar. visionText ile birbirini dışlar.
visionText OCR kullanarak tıklanan öğeyi tanımlar. elementDescriptors ile birbirini dışlar.
maxNumberOfRuns eventType olduğunda, yazılım klavyesinin rastgele bir öğesinin kaç kez tıklanacağını SOFT_KEYBOARD_RANDOM_CLICK . Varsayılan değer 1 .

Aşağıda, "com.google.samples.apps.topeka:id/done" kaynak kimliğine sahip bir düğmeyi tıklayan bir Robo komut dosyası eylemi örneği verilmiştir:

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

Aşağıda, OCR kullanan bir ekranda algılanan "Privacy Policy" tıklayan Robo komut dosyası eyleminin bir örneği verilmiştir:

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

Aşağıda, "Emoji button" içerik açıklamasına sahip bir yazılım klavyesi öğesini tıklayan bir Robo komut dosyası eyleminin bir örneği yer almaktadır:

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

Aşağıda, rasgele yazılım klavyesi öğelerini beş defaya kadar tıklatan bir Robo komut dosyası eylemi örneği verilmiştir:

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

Yumuşak klavyeyi devre dışı bırak

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "DISABLE_KEYBOARD" --

Aşağıda, yazılım klavyesini devre dışı bırakan bir Robo komut dosyası eylemi örneği verilmiştir:

{
  "eventType": "DISABLE_KEYBOARD"
}

Adb Shell komutunu yürütün

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "ADB_SHELL_COMMAND" --
command Yürütülecek Android Debug Bridge (adb) kabuk komutu.

Aşağıda, test edilen uygulama kullanıcı verilerini temizleyen bir Robo komut dosyası eylemi örneği verilmiştir:

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

İzin verme

Bu eylem, Espresso Test Recorder ile geriye dönük uyumluluk için Android Studio'daki Robo script kaydedici tarafından kaydedilir. Robo testi, her taramanın başında test edilen uygulamaya tüm izinleri verir ve bu nedenle, bu eylem işlemsizdir. Bu eylemi Robo betiklerinizde KULLANMAYIN.

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "PERMISSIONS_REQUEST" --

Giriş metni

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
eventType Robo komut dosyası eyleminin türünü belirtir.
"eventType": "VIEW_TEXT_CHANGED" Verilen metni hedef UI parçacığına girer.
"eventType": "ENTER_TEXT" verilen metni hedef UI parçacığına girer ve ardından bu UI parçacığına bir KEYCODE_ENTER olayı gönderir.
elementDescriptors Android UI hiyerarşisini kullanarak hedef UI widget'ını tanımlar.
replacementText Hedef kullanıcı arayüzü parçacığına girilecek metin.

Aşağıda, "com.google.samples.apps.topeka:id/first_name" kaynak kimliğine sahip bir UI widget'ına "John" yazan bir Robo komut dosyası eylemi örneği verilmiştir:

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

Uzun tıklama

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Android UI hiyerarşisini kullanarak hedef UI widget'ını tanımlar.

Aşağıdaki öznitelik isteğe bağlıdır:

  • delayTime - uzun bir tıklamanın basılmasının milisaniye cinsinden ne kadar sürmesi gerektiğini belirtir.

Aşağıda, "Avatar 8" içerik açıklamasına sahip bir kullanıcı arabirimi parçacığı üzerinde beş saniye süren bir tıklama gerçekleştiren bir Robo komut dosyası eylemi örneği verilmiştir:

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

Tek noktalı bir hareket gerçekleştirin

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "ONE_POINT_GESTURE" --
coordinates Yüzde veya piksel olarak "(x1,y1)->(x2,y2)" olarak biçimlendirilmiş, tek noktalı bir hareket için iki koordinat.

Aşağıdaki öznitelik isteğe bağlıdır:

  • dragAndDrop - true olarak ayarlanırsa, tek noktalı hareket bir sürükle ve bırak eylemi gerçekleştirir. Varsayılan olarak, false .

Aşağıda, aşağı kaydırma gerçekleştiren bir Robo komut dosyası tek noktalı hareket eylemi örneği verilmiştir:

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

İki noktalı bir hareket gerçekleştirin

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "TWO_POINT_GESTURE" --
coordinates Yüzde veya piksel olarak "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" şeklinde biçimlendirilmiş iki noktalı bir hareket için dört koordinat.

Aşağıda, çimdikleme hareketini gerçekleştiren bir Robo komut dosyası eylemi örneği verilmiştir:

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

Bir IME eylemi gerçekleştirme

Bu eylem, belirtilen hedef UI parçacığı için Giriş Yöntemi Düzenleyicisi'nde (IME) mevcut eylem düğmesine (örneğin sonraki, bitti ve ara) basar.

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors Android UI hiyerarşisini kullanarak hedef UI widget'ını tanımlar.

Aşağıda, "com.google.samples.apps.topeka:id/first_name" kaynak kimliğine sahip bir kullanıcı arabirimi widget'ında bir IME eylemi gerçekleştiren bir Robo komut dosyası eylemi örneği verilmiştir:

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

geri basın

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
eventType Robo komut dosyası eyleminin türünü belirtir.
"eventType": "PRESSED_BACK" Cihaza bir KEYCODE_BACK olayı gönderir.
"eventType": "PRESSED_BACK_EMULATOR_28" API 28 öykünücülerine geri basmak için Android Studio'daki Robo komut dosyası kaydedici tarafından kullanılır.

Aşağıda, geri basan bir Robo komut dosyası eyleminin bir örneği verilmiştir:

{
  "eventType": "PRESSED_BACK"
}

Ana sayfaya basın

Bu eylem, cihaza bir KEYCODE_HOME olayı gönderir.

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "GO_HOME" --

Aşağıda, ana sayfaya basan bir Robo komut dosyası eyleminin bir örneği verilmiştir:

{
  "eventType": "GO_HOME"
}

Bir öğeyi görünüme kaydırın

Bu eylem, Robo testinin belirtilen elementDescriptors ile eşleşen UI widget'ını ekranda belirtilen childElementDescriptors ile eşleşen UI widget'ı görünene veya kaydırılan widget artık kaydırılamayana veya maksimum 50 kaydırma sayısına ulaşılana kadar ileri kaydırmasını sağlar.

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors Android UI hiyerarşisini kullanarak kaydırılan UI widget'ını tanımlar.
childElementDescriptors Android UI hiyerarşisini kullanarak kaydırılacak UI widget'ını tanımlar.

Aşağıda, "my.app.package:id/scrollable_card_container" kaynak kimliğine sahip UI widget'ını ekranda "Orange" metnine sahip UI widget'ı görünene (veya daha fazla kaydırma yapılamayana) kadar kaydıran bir Robo komut dosyası eylemi örneği verilmiştir. veya maksimum 50 kaydırma sayısına ulaşılır):

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

Tokatlamak

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "VIEW_SWIPED" --
swipeDirection Kaydırmanın yönünü belirtir:
  • Left
  • Right
  • Up
  • Down
  • Forward - hedef UI parçacığının dikey veya yatay kaydırılabilirliğine bağlı olarak Down veya Right .
  • Backward - Hedef kullanıcı arabirimi parçacığının dikey veya yatay kaydırılabilirliğine bağlı olarak Up veya Left .
elementDescriptors Android UI hiyerarşisini kullanarak hedef UI widget'ını tanımlar.

Aşağıda, "my.app.package:id/custom_content" kaynak kimliğine sahip bir UI widget'ını kaydıran bir Robo komut dosyası eylemi örneği verilmiştir:

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

Ekran görüntüsü al

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "TAKE_SCREENSHOT" --
screenshotName Ekran görüntüsü dosya adını belirtir.

Aşağıda, ekran görüntüsü alan bir Robo komut dosyası eylemi örneği verilmiştir:

{
  "eventType": "TAKE_SCREENSHOT",
  "screenshotName": "my_screenshot"
}

Ekranda bir noktaya dokunun

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "POINT_TAP" --
pointTapXCoordinate Dokunulan noktanın piksel X koordinatı. pointTapXPercent ve pointTapYPercent ile birbirini dışlayan.
pointTapYCoordinate Dokunulan noktanın piksel Y koordinatı. pointTapXPercent ve pointTapYPercent ile birbirini dışlayan.
pointTapXPercent Dokunulan noktanın yüzde X koordinatı. pointTapXCoordinate ve pointTapYCoordinate ile birbirini dışlayan.
pointTapYPercent Dokunulan noktanın yüzde Y koordinatı. pointTapXCoordinate ve pointTapYCoordinate ile birbirini dışlayan.

Aşağıda, ekranın ortasına hafifçe vuran bir Robo komut dosyası eylemi örneği verilmiştir:

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

Bir öğe içindeki bir noktaya dokunun

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent Hedef öğe içindeki yüzde X koordinatı.
pointTapYPercent Hedef öğe içindeki yüzde Y koordinatı.
elementDescriptors Android UI hiyerarşisini kullanarak hedef UI widget'ını tanımlar.

Aşağıda, bir arama çubuğunun kaydırıcısını sağa hareket ettiren bir Robo komut dosyası eylemi örneği verilmiştir:

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

Taramayı sonlandır

Bu eylem Robo testini durdurur.

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "TERMINATE_CRAWL" --

Aşağıda, bir Robo testini durduran bir Robo komut dosyası eylemi örneği verilmiştir:

{
  "eventType": "TERMINATE_CRAWL"
}

Beklemek

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "DELAYED_MESSAGE_POSTED" --
delayTime Milisaniye cinsinden ne kadar bekleneceğini belirtir.

Aşağıda, üç saniye bekleyen bir Robo komut dosyası eylemi örneği verilmiştir:

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

Bir öğe için bekleyin

Bu eylem, Robo testinin belirtilen zaman aşımına kadar bir öğenin ekranda görünmesini beklemesini sağlar.

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "WAIT_FOR_ELEMENT" --
delayTime Bekleme zaman aşımını milisaniye cinsinden belirtir.
elementDescriptors Android UI hiyerarşisini kullanarak, beklenen UI widget'ını tanımlar.

Aşağıda, "my.app.package:id/confirmation_button" kaynak kimliğine sahip bir UI widget'ının ekranda görünmesi için 30 saniyeye kadar bekleyen bir Robo komut dosyası eylemi örneği verilmiştir:

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

Sonraki adımlar

,

Bu belge, yapı, yetenekler, kullanım, kayıt ve eylemler dahil olmak üzere Robo betikleri hakkında referans bilgileri sağlar. Robo betikleri , mobil uygulamalar için manuel kalite güvencesi (QA) görevlerini otomatikleştiren ve sürekli entegrasyon (CI) ve lansman öncesi test stratejileri sağlayan testlerdir. Bir Robo betiği, bir kullanıcı arabirimi (UI) dizisini ve diğer eylemleri açıklayan bir JSON dosyasıdır.

Aşağıdaki şekillerde bir Robo betiği oluşturabilirsiniz:

  • Robo komut dosyası kayıt özelliğini kullanın.
  • Robo betiğini manuel olarak oluşturun.
  • Robo komut dosyasını kaydedin ve ardından manuel olarak düzenleyin.

Robo betiklerini kullanma hakkında daha fazla bilgi edinmek için Robo betiği çalıştırma bölümüne bakın.

Robo komut dosyası, test edilen uygulama Android Uygulama Paketi (APK) gibi diğer girdilerin yanı sıra Robo testine sağlanır.

Aşağıda, bir kullanıcıyı bir uygulamada oturum açan bir Robo komut dosyası örneği verilmiştir:

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

Yapı

Bir Robo komut dosyasındaki her eylem, aşağıdaki tabloda açıklanan bir veya daha fazla özellik-değer çiftinin bir demeti olarak temsil edilir:

Bağlanmak Açıklama
eventType Eylemin türünü belirtir, örneğin tıklama, metin düzenleme vb. Her eylem için gereklidir.
elementDescriptors Bir UI widget'ını tanımlayan tanımlayıcılar. Belirli bir düğmeyi tıklamak gibi, hedef kullanıcı arabirimi widget'ına sahip tüm eylemler için gereklidir.
optional true olarak ayarlanırsa, gerçekleştirilemediğinde bu eylem atlanır. Örneğin, bir ekranda hedef UI widget'ını bulamadığında bu eylem atlanır - içeren Robo komut dosyası başarısız olmaz. Varsayılan olarak, değer false şeklindedir.
replacementText Hedef kullanıcı arayüzü parçacığına girilecek metin. Metin düzenleme işlemleri için gereklidir.
swipeDirection Kaydırmanın yönünü belirtir. Kaydırma işlemleri için gereklidir.
delayTime Milisaniye cinsinden ne kadar bekleneceğini belirtir. Bekleme eylemleri için gereklidir.
pointTapXCoordinate ve pointTapYCoordinate Dokunulan noktanın piksel X ve Y koordinatları. pointTapXPercent ve pointTapYPercent ile birbirini dışlayan. Noktaya dokunma eylemleri için gereklidir.
pointTapXPercent ve pointTapYPercent Dokunulan noktanın yüzde X ve Y koordinatları. pointTapXCoordinate ve pointTapYCoordinate ile birbirini dışlayan. Noktaya dokunma eylemleri için gereklidir.

Aşağıda, hedef UI widget'ları olmayan iki eylem içeren bir Robo komut dosyası örneği verilmiştir; bu, bu eylemlerin belirli bir UI widget'ında çalışmadığı anlamına gelir:

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

Öğe tanımlayıcıları

Bir öğe tanımlayıcısı, aşağıdaki tanımlayıcı özniteliklerden birini veya daha fazlasını kullanarak bir UI widget'ını tanımlar:

Bağlanmak Açıklama
className
ancestorClassName Öğenin kullanıcı arayüzü hiyerarşi atasının sınıf adı. Ata, öğenin kendisi de dahil olmak üzere, öğenin kullanıcı arabirimi hiyerarşisindeki üst düğümlerden herhangi biridir.
resourceId
resourceIdRegex resourceId ile eşleşecek Java normal ifadesi.
contentDescription
contentDescriptionRegex contentDescription ile eşleşecek Java normal ifadesi.
text (ekranda görünen)
textRegex text eşleştirmek için Java normal ifadesi.
groupViewChildPosition , recyclerViewChildPosition veya adapterViewChildPosition Üst parçacığın türüne bağlı olarak bir UI parçacığının alt konumunu temsil eder.

Sıklıkla, bu nitelikler tanımsızdır; örneğin, bir düğmenin metin ve içerik açıklaması olmayabilir. Bazı öznitelik değerleri mevcut olsa bile, belirli bir uygulama ekranında ( resourceId dahil) benzersiz olmayabilirler.

Örneğin, bir listenin öğeleri arasında ayrım yapmak, genellikle yalnızca ana parçacığı içindeki farklı alt konumlarını kullanarak mümkündür. Bu, bir UI widget'ını tanımlamak için yalnızca bir öğe tanımlayıcısı kullanmanın genellikle yetersiz olduğu anlamına gelir. Bu nedenle, bir eylemin elementDescriptors özniteliği, birincisi hedef UI parçacığına, ikincisi hedef UI parçacığının ana pencere öğesine karşılık gelecek şekilde sıralanan bir dizi öğe tanımlayıcı içerir. Bir eylemin hedef kullanıcı arayüzü parçacığı, tüm öğe tanımlayıcıları karşılık gelen kullanıcı arabirimi parçacığı alt hiyerarşisiyle eşleştiğinde eşleştirilir.

Aşağıda, her ikisi de sağlanan öğe tanımlayıcılarını kullanarak hedef kullanıcı arabirimi pencere bileşenini tanımlamanızı gerektiren, metin değiştirme ve tıklama eylemleri içeren bir Robo komut dosyası örneği verilmiştir:

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

Yürütme seçenekleri

İsteğe bağlı olarak, bir Robo betiğindeki eylem listesinin önüne, o Robo betiği için yürütme seçeneklerini belirten bir JSON nesnesi ekleyebilirsiniz. Bu yapılandırma başlığı, roboscript anahtar sözcüğü ile başlar ve ardından istenen yürütme seçeneklerinin bir JSON temsili gelir.

Robo betikleri aşağıdaki yürütme seçeneklerini destekler:

  • executionMode - bir Robo betiği çalışırken uygulanan yürütme seçenekleri:
  • postscript - bir Robo betiği tamamlandıktan sonra uygulanan yürütme seçenekleri:
    • terminate - true olarak ayarlanırsa Robo testi, Robo betiği tamamlandıktan sonra taramayı durdurur.

Aşağıda, strict modda yürütülen ve üç saniye uyuyan, ardından taramanın durduğu bir Robo komut dosyası örneği verilmiştir:

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

Şablon parametreleri

Bir şablon parametresi , bir Robo komut dosyasında, Robo testi yürütme için bu Robo komut dosyasını yüklediğinde gerçek değerle değiştirilen bir yer tutucudur. Şablon parametrelerinin önüne bir çift alt çizgi ve ardından bir yüzde işareti eklenir ve bir yüzde işaretinin ardından bir çift alt çizgi eklenir.

Robo betikleri aşağıdaki şablon parametresini destekler:

  • __%APP_PACKAGE_NAME%__ - test edilen uygulamanın paket adı.

Aşağıda, test edilen uygulama sürecini durduran bir Robo komut dosyası örneği verilmiştir:

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

Yorumlar

Bir Robo komut dosyası, # veya // ile başlayan satırlar olan yorum satırları içerebilir.

Aşağıda, birkaç yorum içeren bir Robo komut dosyası örneği verilmiştir:

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

Yetenekler

Varsayılan olarak, bir Robo betiğinin tüm eylemleri tamamlanana (veya en azından denenene) kadar, Robo betiği etkin kalır. Robo testi, gerçekleştirilecek bir eylemi seçerken bir Robo komut dosyası eylemini eşleştirmeye çalışır. Robo komut dosyası, sağlamlığı artırmak için aşağıdaki teknikleri kullanır:

teknik Açıklama
Kısmi eşleştirme Mevcut Robo komut dosyası eylemi tam olarak eşleştirilemezse, eşleştirme kriterleri gevşetilir ve eşleştirme yeniden denenir. Kısmi eşleştirme, bir Robo komut dosyası eyleminin hedef kullanıcı arabirimi parçacığıyla eşleşirken en dıştaki öğe tanımlayıcısını dikkate almaz.

Kısmi eşleştirme başarılı olursa, karşılık gelen Robo komut dosyası eylemi her zamanki gibi gerçekleştirilir. Bu teknik, örneğin uygulama sürümleri arasında ekran öğeleri yeniden düzenlendiğinde uygulama yapısının değiştiği senaryoları destekler.

Geçerli eylemi atla Geçerli Robo komut dosyası eylemi tamamen veya kısmen eşleştirilemezse Robo, sonraki Robo komut dosyası eylemini eşleştirmeye çalışır. Sonraki eylem tamamen veya kısmen eşleşirse, Robo testi mevcut Robo komut dosyası eylemini atlar (ve asla geri dönmez) ve sonrakini gerçekleştirir.

Bu teknik, uygulama davranışının sürümler arasında değiştiği veya kesintili olduğu senaryoları destekler; örneğin, bir Robo betiğinin kaydı veya yeniden oynatılması sırasında farklı ekranlarda aralıklı bir iletişim kutusu görünebilir.

Askıya almak Ne mevcut ne de sonraki Robo komut dosyası eylemleri tamamen veya kısmen eşleştirilemezse, Robo komut dosyası geçici olarak askıya alınır ve Robo testi, diğer stratejilerini kullanarak gerçekleştirmek için bir eylem seçer. Bu eylem tamamlandıktan sonra Robo testi, Robo komut dosyasını yürütmeye devam eder.

Mevcut veya sonraki Robo betiği eylemleri eşleştirilemediği sürece, Robo betiği herhangi bir sayıda eylem için askıda kalır. Bu nedenle, Robo betiklerinin mutlaka bir Robo testi için bir önsöz olması gerekmez ve Robo betiği eylemlerini standart Robo testi eylemleriyle karıştırabilirsiniz. Bu teknik, uygulama davranışının düzensiz olduğu veya uygulama sürümleri arasındaki değişikliklerin, Robo testinin standart eylemleriyle "boşlukları doldurması" için ihtiyaç duyduğu kadar büyük olduğu senaryoları destekler.

RecyclerView ve AdapterView desteği

RecyclerView ve AdapterView pencere öğelerinin alt öğeleri dinamik olarak yüklenir ve geçerli ekrandan çok sayıda kaydırılarak görüntülenebilir. Bir ekranın boyutu ve bu çocuğa ulaşmak için gereken kaydırma sayısı, farklı cihaz form faktörlerinde farklı olduğundan, çocuğun kesin olan veri konumuna güvenmek çok daha sağlamdır. Bu çocuğu ekrana getirmek ve ardından ekran konumunu kullanmak için gereken kaydırma sayısına güvenmek daha az sağlam bir yaklaşımdır.

Bu nedenle, Robo betiği, Robo betiği eylemlerinin hedefi olan RecyclerView alt öğelerinin mutlak veri konumlarını recyclerViewChildPosition olarak yakalar. Robo betiği ayrıca, AdapterViewChildPosition olarak Robo betiği eylemlerinin hedefi olan adapterViewChildPosition alt öğelerinin mutlak veri konumlarını da yakalar.

RecyclerView ve AdapterView alt öğelerindeki eylemler aşağıdaki adımlarda gerçekleştirilir:

  1. Robo testi, ilgili çocuğun, içerdiği RecyclerView veya AdapterView üzerinde bir konumlandırma eylemi aracılığıyla ekranda görüntülenmesini sağlar.

  2. Robo test, ekranda zaten görüntülendiği için kaydedilen eylemi doğrudan alt öğe üzerinde gerçekleştirir.

Aşağıda, bir AdapterView ( android.widget.GridView ) alt öğesinde bir tıklama eylemi örneği verilmiştir:

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

Aşağıda, bir RecyclerView ( android.support.v7.widget.RecyclerView ) alt öğesinde bir tıklama eylemi örneği verilmiştir:

{
  "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'da bir Robo betiği kaydedin ve Test Lab'de çalıştırın

Komut dosyasını bir JSON dosyası olarak kaydeden Android Studio'da bir Robo komut dosyası oluşturabilirsiniz. Daha sonra JSON dosyasını uygulama ile Firebase Test Lab'e yükleyebilir ve testi buna göre çalıştırabilirsiniz.

Ekli bir komut dosyasıyla bir Robo testi çalıştırdığınızda, Robo testi önce önceden komut dosyası oluşturulmuş eylemlerinizi gerçekleştirir ve ardından uygulamayı her zamanki gibi keşfeder.

Android Studio'da bir Robo betiği JSON dosyası oluşturmak için Android Studio'da Test Lab kullanarak Robo betiği kaydetme bölümündeki adımları izleyin.

Robo komut dosyası eylemleri

Aşağıdaki ortak isteğe bağlı özellik, tüm eylemler için geçerlidir:

  • description - Robo test çıktılarında bu Robo komut dosyası eyleminin yürütülmesinin izlenmesine yardımcı olur.

İddia

İddia edilen koşul doğruysa Robo betiği, başka bir iddia olabilecek bir sonraki eyleme devam eder. Aksi takdirde, Robo betiği yürütme başarısız bir onay nedeniyle durdurulur ve test sonucu FAILED olur.

Aşağıdaki tabloda gerekli özellikler listelenmektedir:

Bağlanmak Açıklama
"eventType": "ASSERTION" --
contextDescriptor İddia edilen bağlamı veya koşulu açıklar.

Bağlam tanımlayıcı

Bir bağlam tanımlayıcısı, aşağıdaki özniteliklerden birini veya bunların bir kombinasyonunu kullanarak bağlamı/koşulu tanımlar:

Bağlanmak Açıklama
"condition": "element_present" elementDescriptors veya visionText tarafından belirtilen metinle eşleşen bir kullanıcı arabirimi parçacığı olup olmadığını kontrol eder.
"condition": "element_disabled" elementDescriptors ile eşleşen bir UI parçacığının ekranda mevcut olup olmadığını ve onunla etkileşime geçilemeyeceğini kontrol eder.
"condition": "element_checked" elementDescriptors ile eşleşen bir kullanıcı arabirimi parçacığı olup olmadığını kontrol eder ve kontrol edilir.
"condition": "app_under_test_shown" Test edilen uygulamanın ön planda çalışıp çalışmadığını kontrol eder.
"condition": "default_launcher_shown" Bir cihazın ana ekranının gösterilip gösterilmediğini kontrol eder, bu da ön planda hiçbir uygulamanın çalışmadığı anlamına gelir.
"condition": "non_roboscript_action_performed" Robo testi tarafından gerçekleştirilen son eylemin bir Robo komut dosyası eylemi olmadığını kontrol eder.
negateCondition true olarak ayarlanırsa, condition reddeder. Örneğin, ekranda bir UI parçacığı OLMADIĞINI veya test edilen uygulamanın ön planda ÇALIŞMADIĞINI kontrol etmek için bu özniteliği kullanabilirsiniz.
elementDescriptors Ekranda bir UI widget'ını tanımlayan bir veya daha fazla öğe tanımlayıcısı. element_present , element_disabled ve element_checked koşullarıyla birlikte kullanılır. visionText ile birbirini dışlar. Daha fazla bilgi için bkz. Öğe tanımlayıcıları .
visionText Text on the screen is detected using the Optical Character Recognition (OCR) API. visionText is used in combination with the element_present condition. Mutually exclusive with elementDescriptors .

The following is an example of a Robo script assertion that checks that the app-under-test is in the foreground:

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

The following is an example of a Robo script assertion that checks that a UI widget with the resource ID "com.google.samples.apps.topeka:id/done" is present on a screen:

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

The following is an example of a Robo script assertion that checks that "Settings" is NOT detected on a screen using OCR:

{
  "eventType": "ASSERTION",
  "contextDescriptor": {
    "condition": "element_present",
    "negateCondition": true,
    "visionText": "Settings"
  }
}

Click

The following table lists required attributes:

Attribute Description
eventType Specifies the type of the Robo script action.
"eventType": "VIEW_CLICKED" Clicks the target element of the app-under-test.
"eventType": "SOFT_KEYBOARD_CLICK" Clicks the target element of the soft keyboard.
"eventType": "SOFT_KEYBOARD_RANDOM_CLICK" Clicks random elements of the soft keyboard up to maxNumberOfRuns times.
"eventType": "LIST_ITEM_CLICKED" Used by the Robo script recorder in Android Studio for clicking list items.
elementDescriptors Identifies the clicked UI widget using the Android UI hierarchy. Mutually exclusive with visionText .
visionText Identifies the clicked element using OCR. Mutually exclusive with elementDescriptors .
maxNumberOfRuns Specifies how many times to click a random element of the soft keyboard, when eventType is SOFT_KEYBOARD_RANDOM_CLICK . The default value is 1 .

The following is an example of a Robo script action that clicks a button with the resource ID "com.google.samples.apps.topeka:id/done" :

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

The following is an example of a Robo script action that clicks on "Privacy Policy" detected on a screen using OCR:

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

The following is an example of a Robo script action that clicks a soft keyboard element with a content description "Emoji button" :

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

The following is an example of a Robo script action that clicks random soft keyboard elements up to five times:

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

Disable soft keyboard

The following table lists required attributes:

Attribute Açıklama
"eventType": "DISABLE_KEYBOARD" --

The following is an example of a Robo script action that disables the soft keyboard:

{
  "eventType": "DISABLE_KEYBOARD"
}

Execute adb shell command

The following table lists required attributes:

Attribute Açıklama
"eventType": "ADB_SHELL_COMMAND" --
command The Android Debug Bridge (adb) shell command to execute.

The following is an example of a Robo script action that clears the app-under-test user data:

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

Grant permissions

This action is recorded by the Robo script recorder in Android Studio for backward compatibility with Espresso Test Recorder . Robo test grants all permissions to the app-under-test at the beginning of every crawl, and thus, this action is a no-op. Do NOT use this action in your Robo scripts.

The following table lists required attributes:

Attribute Açıklama
"eventType": "PERMISSIONS_REQUEST" --

Input text

The following table lists required attributes:

Attribute Açıklama
eventType Specifies the type of the Robo script action.
"eventType": "VIEW_TEXT_CHANGED" Inputs the given text into the target UI widget.
"eventType": "ENTER_TEXT" inputs the given text into the target UI widget and then sends a KEYCODE_ENTER event to this UI widget.
elementDescriptors Identifies the target UI widget using the Android UI hierarchy.
replacementText The text to input into the target UI widget.

The following is an example of a Robo script action that inputs "John" into a UI widget with the resource ID "com.google.samples.apps.topeka:id/first_name" :

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

Long click

The following table lists required attributes:

Attribute Açıklama
"eventType": "VIEW_LONG_CLICKED" --
elementDescriptors Identifies the target UI widget using the Android UI hierarchy.

The following attribute is optional:

  • delayTime - specifies how long the press down of a long click should last, in milliseconds.

The following is an example of a Robo script action that performs a five seconds-long click on a UI widget with content description "Avatar 8" :

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

Perform a one-point gesture

The following table lists required attributes:

Attribute Açıklama
"eventType": "ONE_POINT_GESTURE" --
coordinates Two coordinates for a one-point gesture, formatted as "(x1,y1)->(x2,y2)" as percentages or pixels.

The following attribute is optional:

  • dragAndDrop - if set to true , the one-point gesture performs a drag-and-drop action. By default, it is false .

The following is an example of a Robo script one-point gesture action that performs a swipe down:

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

Perform a two-point gesture

The following table lists required attributes:

Attribute Açıklama
"eventType": "TWO_POINT_GESTURE" --
coordinates Four coordinates for a two-point gesture, formatted as "(x1,y1)->(x2,y2),(x3,y3)->(x4,y4)" as percentages or pixels.

The following is an example of a Robo script action that performs a pinch out gesture:

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

Perform an IME action

This action presses the current action button, for example, next, done, and search, on the Input Method Editor (IME) for the specified target UI widget.

The following table lists required attributes:

Attribute Açıklama
"eventType": "PRESSED_EDITOR_ACTION" --
elementDescriptors Identifies the target UI widget using the Android UI hierarchy.

The following is an example of a Robo script action that performs an IME action on a UI widget with the resource ID "com.google.samples.apps.topeka:id/first_name" :

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

Press back

The following table lists required attributes:

Attribute Açıklama
eventType Specifies the type of the Robo script action.
"eventType": "PRESSED_BACK" Sends a KEYCODE_BACK event to the device.
"eventType": "PRESSED_BACK_EMULATOR_28" Used by the Robo script recorder in Android Studio for pressing back on emulators API 28.

The following is an example of a Robo script action that presses back:

{
  "eventType": "PRESSED_BACK"
}

Press home

This action sends a KEYCODE_HOME event to the device.

The following table lists required attributes:

Attribute Açıklama
"eventType": "GO_HOME" --

The following is an example of a Robo script action that presses home:

{
  "eventType": "GO_HOME"
}

Scroll an element into view

This action makes Robo test scroll forward the UI widget that matches the specified elementDescriptors until the UI widget that matches the specified childElementDescriptors is present on the screen, or the scrolled widget can no longer be scrolled, or the max number of 50 scrolls is reached.

The following table lists required attributes:

Attribute Açıklama
"eventType": "ELEMENT_SCROLL_INTO_VIEW" --
elementDescriptors Identifies the scrolled UI widget using the Android UI hierarchy.
childElementDescriptors Identifies the UI widget to scroll to using the Android UI hierarchy.

The following is an example of a Robo script action that scrolls the UI widget with the resource ID "my.app.package:id/scrollable_card_container" until the UI widget with text "Orange" is present on the screen (or no more scrolls can be performed, or the max number of 50 scrolls is reached):

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

Swipe

The following table lists required attributes:

Attribute Açıklama
"eventType": "VIEW_SWIPED" --
swipeDirection Specifies the direction of the swipe:
  • Left
  • Right
  • Up
  • Down
  • Forward - either Down or Right depending on vertical or horizontal scrollability of the target UI widget.
  • Backward - either Up or Left depending on vertical or horizontal scrollability of the target UI widget.
elementDescriptors Identifies the target UI widget using the Android UI hierarchy.

The following is an example of a Robo script action that swipes up a UI widget with the resource ID "my.app.package:id/custom_content" :

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

Take screenshot

The following table lists required attributes:

Attribute Açıklama
"eventType": "TAKE_SCREENSHOT" --
screenshotName Specifies the screenshot file name.

The following is an example of a Robo script action that takes a screenshot:

{
  "eventType": "TAKE_SCREENSHOT",
  "screenshotName": "my_screenshot"
}

Tap a point on the screen

The following table lists required attributes:

Attribute Açıklama
"eventType": "POINT_TAP" --
pointTapXCoordinate The pixel X coordinate of the tapped point. Mutually exclusive with pointTapXPercent and pointTapYPercent .
pointTapYCoordinate The pixel Y coordinate of the tapped point. Mutually exclusive with pointTapXPercent and pointTapYPercent .
pointTapXPercent The percentage X coordinate of the tapped point. Mutually exclusive with pointTapXCoordinate and pointTapYCoordinate .
pointTapYPercent The percentage Y coordinate of the tapped point. Mutually exclusive with pointTapXCoordinate and pointTapYCoordinate .

The following is an example of a Robo script action that taps in the middle of a screen:

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

Tap a point within an element

The following table lists required attributes:

Attribute Açıklama
"eventType": "POINT_TAP_ELEMENT" --
pointTapXPercent The percentage X coordinate within the target element.
pointTapYPercent The percentage Y coordinate within the target element.
elementDescriptors Identifies the target UI widget using Android UI hierarchy.

The following is an example of a Robo script action that moves a seekbar's slider to the right:

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

Terminate crawl

This action stops the Robo test.

The following table lists required attributes:

Attribute Açıklama
"eventType": "TERMINATE_CRAWL" --

The following is an example of a Robo script action that stops a Robo test:

{
  "eventType": "TERMINATE_CRAWL"
}

Wait

The following table lists required attributes:

Attribute Açıklama
"eventType": "DELAYED_MESSAGE_POSTED" --
delayTime Specifies how long to wait, in milliseconds.

The following is an example of a Robo script action that waits for three seconds:

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

Wait for an element

This action makes Robo test wait for an element to appear on the screen up to the specified timeout.

The following table lists required attributes:

Attribute Açıklama
"eventType": "WAIT_FOR_ELEMENT" --
delayTime Specifies the waiting timeout, in milliseconds.
elementDescriptors Identifies the waited-for UI widget using the Android UI hierarchy.

The following is an example of a Robo script action that waits for up to 30 seconds for a UI widget with the resource ID "my.app.package:id/confirmation_button" to appear on the screen:

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

Sonraki adımlar