Kullanıcı Arayüzü Otomatikleştirici, sistemde ve yüklü uygulamalarda uygulamalar arası işlevsel kullanıcı arayüzü testi için uygun olan bir kullanıcı arayüzü test çerçevesidir. UI Automator API'leri, hangi Activity
seçeneğine odaklanıldığından bağımsız olarak cihazdaki görünür öğelerle etkileşim kurmanıza olanak tanır. Böylece, bir test cihazında Ayarlar menüsünü veya uygulama başlatıcıyı açma gibi işlemleri gerçekleştirebilirsiniz. Testiniz, söz konusu bileşende görüntülenen metin veya içerik açıklaması gibi uygun tanımlayıcılar kullanarak bir kullanıcı arayüzü bileşenini arayabilir.
Kullanıcı Arayüzü Otomatikleştirici test çerçevesi, enstrümantasyon tabanlı bir API'dir ve AndroidJUnitRunner
test çalıştırıcısıyla birlikte çalışır. Test kodunun hedef uygulamanın dahili uygulama ayrıntılarına bağlı olmadığı opak kutu tarzı otomatik testler yazmak için uygundur.
Kullanıcı Arayüzü Otomatikleştirici test çerçevesinin temel özellikleri şunlardır:
- Hedef cihazda durum bilgilerini almak ve işlemleri gerçekleştirmek için kullanılan bir API. Daha fazla bilgi edinmek için Cihaz durumuna erişme başlıklı makaleye bakın.
- Uygulamalar arası kullanıcı arayüzü testini destekleyen API'ler. Daha fazla bilgi için UI Automator API'leri bölümüne bakın.
Cihaz durumuna erişiliyor
Kullanıcı Arayüzü Otomatikleştirici test çerçevesi, hedef uygulamanın çalıştığı cihaza erişmek ve bu cihazda işlem gerçekleştirmek için bir UiDevice
sınıfı sağlar. Geçerli yön veya görüntü boyutu gibi cihaz özelliklerine erişmek için bu özelliğin yöntemlerini çağırabilirsiniz. UiDevice
sınıfı, aşağıdaki işlemleri de gerçekleştirmenize olanak tanır:
- Cihaz döndürme ayarını değiştirin.
- "Sesi aç" gibi donanım tuşlarına basın.
- Geri, Ana Sayfa veya Menü düğmelerine basın.
- Bildirim gölgesini açın.
- Geçerli pencerenin ekran görüntüsünü alın.
Örneğin, ana sayfa düğmesine basma işlemini simüle etmek için UiDevice.pressHome()
yöntemini çağırın.
Kullanıcı Arayüzü Otomatikleştirici API'leri
UI Automator API'leri, hedeflediğiniz uygulamanın uygulama ayrıntılarını bilmenize gerek kalmadan güvenilir testler yazmanıza olanak tanır. Birden çok uygulamada kullanıcı arayüzü bileşenlerini yakalamak ve değiştirmek için bu API'leri kullanabilirsiniz:
UiObject2
: Cihazda görünen bir kullanıcı arayüzü öğesini temsil eder.BySelector
: Eşleşen kullanıcı arayüzü öğeleriyle ilgili ölçütleri belirtir.By
:BySelector
'i kısa ve öz bir şekilde oluşturur.Configurator
: Kullanıcı Arayüzü Otomatikleştirici testlerini çalıştırmak için temel parametreleri ayarlamanızı sağlar.
Örneğin, aşağıdaki kod cihazda bir Gmail uygulamasını açan bir test komut dosyasını nasıl yazabileceğinizi gösterir:
Kotlin
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.pressHome() val gmail: UiObject2 = device.findObject(By.text("Gmail")) // Perform a click and wait until the app is opened. val opened: Boolean = gmail.clickAndWait(Until.newWindow(), 3000) assertThat(opened).isTrue()
Java
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.pressHome(); UiObject2 gmail = device.findObject(By.text("Gmail")); // Perform a click and wait until the app is opened. Boolean opened = gmail.clickAndWait(Until.newWindow(), 3000); assertTrue(opened);
Kullanıcı Arayüzü Otomatikleştiricisini Kurma
UI Automator ile kullanıcı arayüzü testinizi oluşturmadan önce, AndroidX Test için proje oluşturma bölümünde açıklandığı gibi test kaynak kodu konumunuzu ve proje bağımlılıklarını yapılandırdığınızdan emin olun.
Android uygulama modülünüzün build.gradle
dosyasında, UI Automator kitaplığı için bir bağımlılık referansı ayarlamanız gerekir:
Kotlin
dependencies {
...
androidTestImplementation('androidx.test.uiautomator:uiautomator:2.3.0-alpha03')
}
Modern
dependencies {
...
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.3.0-alpha03'
}
Kullanıcı Arayüzü Otomatikleştirici testinizi optimize etmek için öncelikle hedef uygulamanın kullanıcı arayüzü bileşenlerini incelemeli ve erişilebilir olduklarından emin olmalısınız. Bu optimizasyon ipuçları, sonraki iki bölümde açıklanmıştır.
Cihazdaki kullanıcı arayüzünü inceleme
Testinizi tasarlamadan önce cihazda görünen kullanıcı arayüzü bileşenlerini inceleyin. Kullanıcı Arayüzü Otomatikleştirici testlerinizin bu bileşenlere erişebildiğinden emin olmak için bu bileşenlerin görünür metin etiketlerine, android:contentDescription
değerlerine veya her ikisine de sahip olduğundan emin olun.
uiautomatorviewer
aracı, düzen hiyerarşisini incelemek ve cihazın ön planında görünen kullanıcı arayüzü bileşenlerinin özelliklerini görüntülemek için kullanışlı bir görsel arayüz sağlar. Bu bilgiler, Kullanıcı Arayüzü Otomatikleştirici'yi kullanarak daha ayrıntılı testler oluşturmanıza olanak tanır. Örneğin, belirli bir görünür özellikle eşleşen
bir kullanıcı arayüzü seçici oluşturabilirsiniz.
uiautomatorviewer
aracını başlatmak için:
- Hedef uygulamayı fiziksel bir cihazda başlatın.
- Cihazı geliştirme makinenize bağlayın.
- Bir terminal penceresi açıp
<android-sdk>/tools/
dizinine gidin. - Aracı şu komutla çalıştırın:
$ uiautomatorviewer
Uygulamanızın kullanıcı arayüzü özelliklerini görüntülemek için:
uiautomatorviewer
arayüzünde, Cihaz Ekran Görüntüsü düğmesini tıklayın.uiautomatorviewer
aracı tarafından tanımlanan kullanıcı arayüzü bileşenlerini görmek için fareyle sol paneldeki anlık görüntünün üzerine gelin. Özellikler, sağ alttaki panelde ve düzen hiyerarşisinde sağ üstteki panelde listelenir.- İsteğe bağlı olarak, Kullanıcı Arayüzü Otomatikleştirici'ye erişilemeyen kullanıcı arayüzü bileşenlerini görmek için NAF Düğümlerini Değiştir düğmesini tıklayın. Bu bileşenler için yalnızca sınırlı bilgi mevcut olabilir.
Android tarafından sağlanan yaygın kullanıcı arayüzü bileşeni türleri hakkında bilgi edinmek için Kullanıcı Arayüzü'ne bakın.
Etkinliğinizin erişilebilir olduğundan emin olma
Kullanıcı Arayüzü Otomatikleştirici test çerçevesi, Android erişilebilirlik özelliklerini uygulayan uygulamalarda daha iyi performans gösterir. View
türünde kullanıcı arayüzü öğeleri veya SDK'nın View
alt sınıfını kullandığınızda, bu sınıflar zaten bunu sizin için yaptığından erişilebilirlik desteği uygulamanız gerekmez.
Ancak bazı uygulamalar daha zengin bir kullanıcı deneyimi sağlamak için özel kullanıcı arayüzü öğeleri kullanır.
Bu tür öğeler otomatik erişilebilirlik desteği sağlamaz. Uygulamanız, SDK'ya ait olmayan bir View
alt sınıfı örnekleri içeriyorsa aşağıdaki adımları tamamlayarak bu öğelere erişilebilirlik özellikleri eklediğinizden emin olun:
- KeşfetByTouchHelper özelliğini genişleten somut bir sınıf oluşturun.
- setAccessibilityTemsilci() çağrısı yaparak yeni sınıfınızın bir örneğini belirli bir özel kullanıcı arayüzü öğesiyle ilişkilendirin.
Özel görünüm öğelerine erişilebilirlik özellikleri ekleme hakkında daha fazla bilgi için Erişilebilir Özel Görünümler Oluşturma bölümüne bakın. Android'de erişilebilirlikle ilgili genel en iyi uygulamalar hakkında daha fazla bilgi edinmek için Uygulamaları Daha Erişilebilir Yapma konusuna bakın.
Kullanıcı Arayüzü Otomatikleştirici test sınıfı oluşturma
Kullanıcı Arayüzü Otomatikleştirici test sınıfınız, JUnit 4 test sınıfıyla aynı şekilde yazılmalıdır. JUnit 4 test sınıfları oluşturma ve JUnit 4 onayları ile ek açıklamalarını kullanma hakkında daha fazla bilgi edinmek için Araçlı Birim Test Sınıfı Oluşturma bölümüne bakın.
Test sınıfı tanımınızın başına @RunWith(AndroidJUnit4.class) ek açıklamasını ekleyin. Ayrıca, AndroidX Test'te sağlanan AndroidJUnitRunner sınıfını varsayılan test çalıştırıcınız olarak belirtmeniz gerekir. Bu adım, Bir cihazda veya emülatörde Kullanıcı Arayüzü Otomatikleştirici testlerini çalıştırma bölümünde daha ayrıntılı olarak açıklanmıştır.
Aşağıdaki programlama modelini Kullanıcı Arayüzü Otomatikleştirici test sınıfınızda uygulayın:
- Test etmek istediğiniz cihaza erişmek için getInstance() yöntemini çağırarak ve bunu bağımsız değişken olarak bir Enstrümantasyon nesnesi ileterek bir
UiDevice
nesnesi alın. - findObject() yöntemini çağırarak cihazda görüntülenen bir kullanıcı arayüzü bileşenine (örneğin, ön plandaki geçerli görünüm) erişmek için bir
UiObject2
nesnesi alın. - Bir
UiObject2
yöntemi çağırarak belirli bir kullanıcı etkileşimini söz konusu kullanıcı arayüzü bileşeni üzerinde gerçekleştirecek şekilde simüle edin. Örneğin, kaydırmak için scrollUntil() ve bir metin alanını düzenlemek için setText() yöntemini çağırın. Birden çok kullanıcı arayüzü bileşeni veya kullanıcı işlemi dizisi içeren daha karmaşık kullanıcı etkileşimlerini test etmek için 2. ve 3. adımlardaki API'leri gerektiğinde tekrar çağırabilirsiniz. - Bu kullanıcı etkileşimleri gerçekleştirildikten sonra, kullanıcı arayüzünün beklenen durumu veya davranışı yansıttığından emin olun.
Bu adımlar, aşağıdaki bölümlerde daha ayrıntılı olarak ele alınmaktadır.
Kullanıcı arayüzü bileşenlerine erişim
UiDevice
nesnesi, cihazın durumuna erişme ve durumu değiştirmenin birincil yoludur. Testlerinizde, geçerli yön veya görüntü boyutu gibi çeşitli özelliklerin durumunu kontrol etmek için UiDevice
yöntemlerini çağırabilirsiniz.
Testiniz, cihazı belirli bir dönüş yapmaya zorlama, D-pad donanım düğmelerine ve Ana Sayfa ve Menü düğmelerine basma gibi cihaz düzeyinde işlemler gerçekleştirmek için UiDevice
nesnesini kullanabilir.
Testinizi cihazın ana ekranından başlatmanız önerilir. Ana ekrandan (veya cihazda seçtiğiniz başka bir başlangıç konumundan) belirli kullanıcı arayüzü öğelerini seçmek ve bunlarla etkileşim kurmak için UI Automator API'nin sağladığı yöntemleri çağırabilirsiniz.
Aşağıdaki kod snippet'i, testinizin nasıl UiDevice
örneği alabileceğini ve bir Ana sayfa düğmesine basılmasını nasıl simüle edebileceğini gösterir:
Kotlin
import org.junit.Before import androidx.test.runner.AndroidJUnit4 import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.By import androidx.test.uiautomator.Until ... private const val BASIC_SAMPLE_PACKAGE = "com.example.android.testing.uiautomator.BasicSample" private const val LAUNCH_TIMEOUT = 5000L private const val STRING_TO_BE_TYPED = "UiAutomator" @RunWith(AndroidJUnit4::class) @SdkSuppress(minSdkVersion = 18) class ChangeTextBehaviorTest2 { private lateinit var device: UiDevice @Before fun startMainActivityFromHomeScreen() { // Initialize UiDevice instance device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) // Start from the home screen device.pressHome() // Wait for launcher val launcherPackage: String = device.launcherPackageName assertThat(launcherPackage, notNullValue()) device.wait( Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT ) // Launch the app val context = ApplicationProvider.getApplicationContext<Context>() val intent = context.packageManager.getLaunchIntentForPackage( BASIC_SAMPLE_PACKAGE).apply { // Clear out any previous instances addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) } context.startActivity(intent) // Wait for the app to appear device.wait( Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)), LAUNCH_TIMEOUT ) } }
Java
import org.junit.Before; import androidx.test.runner.AndroidJUnit4; import androidx.test.uiautomator.UiDevice; import androidx.test.uiautomator.By; import androidx.test.uiautomator.Until; ... @RunWith(AndroidJUnit4.class) @SdkSuppress(minSdkVersion = 18) public class ChangeTextBehaviorTest { private static final String BASIC_SAMPLE_PACKAGE = "com.example.android.testing.uiautomator.BasicSample"; private static final int LAUNCH_TIMEOUT = 5000; private static final String STRING_TO_BE_TYPED = "UiAutomator"; private UiDevice device; @Before public void startMainActivityFromHomeScreen() { // Initialize UiDevice instance device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); // Start from the home screen device.pressHome(); // Wait for launcher final String launcherPackage = device.getLauncherPackageName(); assertThat(launcherPackage, notNullValue()); device.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT); // Launch the app Context context = ApplicationProvider.getApplicationContext(); final Intent intent = context.getPackageManager() .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE); // Clear out any previous instances intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(intent); // Wait for the app to appear device.wait(Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)), LAUNCH_TIMEOUT); } }
Örnekteki @SdkSuppress(minSdkVersion = 18) ifadesi, kullanıcı arayüzü Automator çerçevesinin gerektirdiği şekilde testlerin yalnızca Android 4.3 (API düzeyi 18) veya sonraki sürümleri çalıştıran cihazlarda çalıştırılmasına yardımcı olur.
Belirli bir seçici ölçütleriyle eşleşen bir görünümü temsil eden bir UiObject2
almak için findObject()
yöntemini kullanın. Oluşturduğunuz UiObject2
örneklerini, uygulama testinizin diğer bölümlerinde gerektiğinde yeniden kullanabilirsiniz.
Testiniz bir kullanıcı arayüzü öğesini tıklamak veya bir özelliği sorgulamak için UiObject2
örneğini kullandığında, Kullanıcı Arayüzü Otomatikleştirici test çerçevesinin geçerli ekranda bir eşleşme aradığını unutmayın.
Aşağıdaki snippet'te testinizin bir uygulamada İptal ve Tamam düğmesini temsil eden UiObject2
örneklerini nasıl oluşturabileceği gösterilmektedir.
Kotlin
val okButton: UiObject2 = device.findObject( By.text("OK").clazz("android.widget.Button") ) // Simulate a user-click on the OK button, if found. if (okButton != null) { okButton.click() }
Java
UiObject2 okButton = device.findObject( By.text("OK").clazz("android.widget.Button") ); // Simulate a user-click on the OK button, if found. if (okButton != null) { okButton.click(); }
Seçici belirtin
Bir uygulamadaki belirli bir kullanıcı arayüzü bileşenine erişmek istiyorsanız BySelector
örneği oluşturmak için By
sınıfını kullanın. BySelector
, görüntülenen kullanıcı arayüzündeki belirli öğeler için bir sorguyu temsil eder.
Birden fazla eşleşen öğe bulunursa düzen hiyerarşisindeki ilk eşleşen öğe, hedef UiObject2
olarak döndürülür. Bir BySelector
oluştururken, aramanızı hassaslaştırmak için birden fazla özelliği birbirine bağlayabilirsiniz. Eşleşen bir kullanıcı arayüzü öğesi bulunmazsa null
döndürülür.
Birden çok BySelector
örneğini iç içe yerleştirmek için hasChild()
veya hasDescendant()
yöntemini kullanabilirsiniz. Örneğin, aşağıdaki kod örneğinde, testinizin metin özelliğine sahip bir alt kullanıcı arayüzü öğesine sahip ilk ListView
öğesini bulmak için bir aramayı nasıl belirtebileceği gösterilmektedir.
Kotlin
val listView: UiObject2 = device.findObject( By.clazz("android.widget.ListView") .hasChild( By.text("Apps") ) )
Java
UiObject2 listView = device.findObject( By.clazz("android.widget.ListView") .hasChild( By.text("Apps") ) );
Seçici ölçütlerinizde nesne durumunu belirtmeniz yararlı olabilir. Örneğin, işaretli tüm öğelerin listesini seçmek ve bu öğelerin işaretlerini kaldırmak istiyorsanız checked()
yöntemini, bağımsız değişken "true" (doğru) değerine ayarlanmış olarak çağırın.
İşlem gerçekleştirin
Testiniz bir UiObject2
nesnesi edindikten sonra, söz konusu nesne tarafından temsil edilen kullanıcı arayüzü bileşeninde kullanıcı etkileşimleri gerçekleştirmek için UiObject2
sınıfındaki yöntemleri çağırabilirsiniz. Bu tür işlemleri şu şekilde belirtebilirsiniz:
click()
: Kullanıcı arayüzü öğesinin görünür sınırlarının merkezini tıklar.drag()
: Bu nesneyi rastgele koordinatlara sürükleyin.setText()
: Alanın içeriğini temizledikten sonra, düzenlenebilir bir alandaki metni ayarlar. Buna karşılık,clear()
yöntemi, düzenlenebilir bir alandaki mevcut metni temizler.swipe()
: Kaydırma işlemini belirtilen yöne doğru gerçekleştirir.scrollUntil()
:Condition
veyaEventCondition
tamamlanıncaya kadar kaydırma işlemini belirtilen yöne doğru gerçekleştirir.
Kullanıcı Arayüzü Otomatikleştirici test çerçevesi, kabuk komutları kullanmadan bir Niyet göndermenize veya getContext()
üzerinden bir Bağlam nesnesi alarak bir Etkinlik başlatmanıza olanak tanır.
Aşağıdaki snippet'te, testinizin test edilen uygulamayı başlatmak için bir Intent'i nasıl kullanabileceği gösterilmektedir. Bu yaklaşım, yalnızca hesap makinesi uygulamasını test etmek istiyorsanız ve başlatıcıyla ilgilenmiyorsanız yararlıdır.
Kotlin
fun setUp() { ... // Launch a simple calculator app val context = getInstrumentation().context val intent = context.packageManager.getLaunchIntentForPackage(CALC_PACKAGE).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) } // Clear out any previous instances context.startActivity(intent) device.wait(Until.hasObject(By.pkg(CALC_PACKAGE).depth(0)), TIMEOUT) }
Java
public void setUp() { ... // Launch a simple calculator app Context context = getInstrumentation().getContext(); Intent intent = context.getPackageManager() .getLaunchIntentForPackage(CALC_PACKAGE); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); // Clear out any previous instances context.startActivity(intent); device.wait(Until.hasObject(By.pkg(CALC_PACKAGE).depth(0)), TIMEOUT); }
Sonuçları doğrulama
EnstrümantationTestCase, TestCase'i genişletir. Böylece uygulamadaki kullanıcı arayüzü bileşenlerinin beklenen sonuçları döndürdüğünü test etmek için standart JUnit Assert yöntemlerini kullanabilirsiniz.
Aşağıdaki snippet'te testinizin bir hesap makinesi uygulamasındaki düğmeleri bulup bunları sırayla nasıl tıklayabileceklerini ve ardından doğru sonucun görüntülendiğini nasıl doğrulayabileceğini görebilirsiniz.
Kotlin
private const val CALC_PACKAGE = "com.myexample.calc" fun testTwoPlusThreeEqualsFive() { // Enter an equation: 2 + 3 = ? device.findObject(By.res(CALC_PACKAGE, "two")).click() device.findObject(By.res(CALC_PACKAGE, "plus")).click() device.findObject(By.res(CALC_PACKAGE, "three")).click() device.findObject(By.res(CALC_PACKAGE, "equals")).click() // Verify the result = 5 val result: UiObject2 = device.findObject(By.res(CALC_PACKAGE, "result")) assertEquals("5", result.text) }
Java
private static final String CALC_PACKAGE = "com.myexample.calc"; public void testTwoPlusThreeEqualsFive() { // Enter an equation: 2 + 3 = ? device.findObject(By.res(CALC_PACKAGE, "two")).click(); device.findObject(By.res(CALC_PACKAGE, "plus")).click(); device.findObject(By.res(CALC_PACKAGE, "three")).click(); device.findObject(By.res(CALC_PACKAGE, "equals")).click(); // Verify the result = 5 UiObject2 result = device.findObject(By.res(CALC_PACKAGE, "result")); assertEquals("5", result.getText()); }
Cihazda veya emülatörde Kullanıcı Arayüzü Otomatikleştirici testlerini çalıştırma
Kullanıcı Arayüzü Otomatik Testlerini Android Studio'dan veya komut satırından çalıştırabilirsiniz. Projenizde varsayılan araç çalıştırıcısı olarak AndroidJUnitRunner
değerini belirttiğinizden emin olun.
Diğer örnekler
Sistem Kullanıcı Arayüzü ile etkileşimde bulunma
Kullanıcı Arayüzü Otomatikleştirici, aşağıdaki kod snippet'lerinde gösterildiği gibi, uygulamanızın dışındaki sistem öğeleri de dahil olmak üzere ekrandaki her şeyle etkileşimde bulunabilir:
Kotlin
// Opens the System Settings. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.executeShellCommand("am start -a android.settings.SETTINGS")
Java
// Opens the System Settings. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.executeShellCommand("am start -a android.settings.SETTINGS");
Kotlin
// Opens the notification shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.openNotification()
Java
// Opens the notification shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.openNotification();
Kotlin
// Opens the Quick Settings shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.openQuickSettings()
Java
// Opens the Quick Settings shade. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.openQuickSettings();
Kotlin
// Get the system clock. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) UiObject2 clock = device.findObject(By.res("com.android.systemui:id/clock")) print(clock.getText())
Java
// Get the system clock. device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); UiObject2 clock = device.findObject(By.res("com.android.systemui:id/clock")); print(clock.getText());
Geçişleri bekleme
Ekran geçişleri zaman alabilir ve geçiş sürelerini tahmin etmek güvenilir değildir. Bu nedenle, işlemleri gerçekleştirdikten sonra UI Automator'ın beklemesi gerekir. UI Automator, bunun için çeşitli yöntemler sunar:
UiDevice.performActionAndWait(Runnable action, EventCondition<U> condition, long timeout)
: Örneğin, bir düğmeyi tıklayıp yeni bir pencere görünene kadar beklemek içindevice.performActionAndWait(() -> button.click(), Until.newWindow(), timeout)
numaralı telefonu arayınUiDevice.wait(Condition<Object, U> condition, long timeout)
: Örneğin, cihazda belirli birUiObject2
olana kadar beklemek içindevice.wait(device.hasObject(By.text("my_text")), timeout);
numaralı telefonu arayınUiObject2.wait(@NonNull Condition<Object, U> condition, long timeout)
: Örneğin, bir onay kutusu işaretlenene kadar beklemek içincheckbox.wait(Until.checked(true), timeout);
numaralı telefonu arayınUiObject2.clickAndWait(@NonNull EventCondition<U> condition, long timeout)
: Örneğin, bir düğmeyi tıklayıp yeni bir pencere görünene kadar beklemek içinbutton.clickAndWait(Until.newWindow(), timeout);
numaralı telefonu arayınUiObject2.scrollUntil(@NonNull Direction direction, @NonNull Condition<Object, U> condition)
: Örneğin, yeni bir nesne görünene kadar aşağı kaydırmak içinobject.scrollUntil(Direction.DOWN, Until.hasObject(By.text('new_obj')));
çağrısı yapın.UiObject2.scrollUntil(@NonNull Direction direction, @NonNull EventCondition<U> condition)
: Örneğin, en alta gitmek içinobject.scrollUntil(Direction.DOWN, Until.scrollFinished(Direction.DOWN));
çağrısı yapın
Aşağıdaki kod snippet'inde, geçiş bekleyen performActionAndWait()
yöntemini kullanarak Sistem ayarlarında Rahatsız Etmeyin modunu kapatmak için Kullanıcı Arayüzü Otomatikleştirici'nin nasıl kullanılacağı gösterilmektedir:
Kotlin
@Test @SdkSuppress(minSdkVersion = 21) @Throws(Exception::class) fun turnOffDoNotDisturb() { device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) device.performActionAndWait({ try { device.executeShellCommand("am start -a android.settings.SETTINGS") } catch (e: IOException) { throw RuntimeException(e) } }, Until.newWindow(), 1000) // Check system settings has been opened. Assert.assertTrue(device.hasObject(By.pkg("com.android.settings"))) // Scroll the settings to the top and find Notifications button var scrollableObj: UiObject2 = device.findObject(By.scrollable(true)) scrollableObj.scrollUntil(Direction.UP, Until.scrollFinished(Direction.UP)) val notificationsButton = scrollableObj.findObject(By.text("Notifications")) // Click the Notifications button and wait until a new window is opened. device.performActionAndWait({ notificationsButton.click() }, Until.newWindow(), 1000) scrollableObj = device.findObject(By.scrollable(true)) // Scroll down until it finds a Do Not Disturb button. val doNotDisturb = scrollableObj.scrollUntil( Direction.DOWN, Until.findObject(By.textContains("Do Not Disturb")) ) device.performActionAndWait({ doNotDisturb.click() }, Until.newWindow(), 1000) // Turn off the Do Not Disturb. val turnOnDoNotDisturb = device.findObject(By.text("Turn on now")) turnOnDoNotDisturb?.click() Assert.assertTrue(device.wait(Until.hasObject(By.text("Turn off now")), 1000)) }
Java
@Test @SdkSuppress(minSdkVersion = 21) public void turnOffDoNotDisturb() throws Exception{ device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.performActionAndWait(() -> { try { device.executeShellCommand("am start -a android.settings.SETTINGS"); } catch (IOException e) { throw new RuntimeException(e); } }, Until.newWindow(), 1000); // Check system settings has been opened. assertTrue(device.hasObject(By.pkg("com.android.settings"))); // Scroll the settings to the top and find Notifications button UiObject2 scrollableObj = device.findObject(By.scrollable(true)); scrollableObj.scrollUntil(Direction.UP, Until.scrollFinished(Direction.UP)); UiObject2 notificationsButton = scrollableObj.findObject(By.text("Notifications")); // Click the Notifications button and wait until a new window is opened. device.performActionAndWait(() -> notificationsButton.click(), Until.newWindow(), 1000); scrollableObj = device.findObject(By.scrollable(true)); // Scroll down until it finds a Do Not Disturb button. UiObject2 doNotDisturb = scrollableObj.scrollUntil(Direction.DOWN, Until.findObject(By.textContains("Do Not Disturb"))); device.performActionAndWait(()-> doNotDisturb.click(), Until.newWindow(), 1000); // Turn off the Do Not Disturb. UiObject2 turnOnDoNotDisturb = device.findObject(By.text("Turn on now")); if(turnOnDoNotDisturb != null) { turnOnDoNotDisturb.click(); } assertTrue(device.wait(Until.hasObject(By.text("Turn off now")), 1000)); }
Ek kaynaklar
Android testlerinde UI Automator'ı kullanma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.
Referans belgeler:
Sana Özel
- BasicSample: Temel Kullanıcı Arayüzü Otomatikleştirici örneği.