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:-
strict
-true
olarak ayarlanırsa, Robo betiği kısmi eşleştirme, geçerli eylemi atlama ve askıya alma kullanmaz. Diğer bir deyişle, Robo betiği normal bir enstrümantasyon testi olarak yürütülür ve eylemlerinden herhangi biri gerçekleştirilemediğinde başarısız olur.
-
-
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:
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.
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:
|
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:-
strict
-true
olarak ayarlanırsa, Robo betiği kısmi eşleştirme, geçerli eylemi atlama ve askıya alma kullanmaz. Diğer bir deyişle, Robo betiği normal bir enstrümantasyon testi olarak yürütülür ve eylemlerinden herhangi biri gerçekleştirilemediğinde başarısız olur.
-
-
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:
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.
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 totrue
, the one-point gesture performs a drag-and-drop action. By default, it isfalse
.
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:
|
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"
}
]
}