UI Automator, sistem ve yüklü uygulamalar genelinde uygulamalar arası işlevsel kullanıcı arayüzü testi için uygun bir kullanıcı arayüzü test çerçevesidir. UI Automator API'leri, hangi Activity
'in odakta olduğuna bakılmaksızın bir cihazdaki görünür öğelerle etkileşim kurmanıza olanak tanır. Böylece, test cihazında Ayarlar menüsünü veya uygulama başlatıcıyı açma gibi işlemleri gerçekleştirebilirsiniz. Testiniz, ilgili bileşende gösterilen metin veya içerik açıklaması gibi uygun tanımlayıcıları kullanarak bir kullanıcı arayüzü bileşenini arayabilir.
UI Automator test çerçevesi, enstrümantasyon tabanlı bir API'dir ve AndroidJUnitRunner
test çalıştırıcısıyla çalışır. Test kodunun hedef uygulamanın dahili uygulama ayrıntılarına bağlı olmadığı opak kutu tarzı otomatik testler yazmak için idealdir.
UI Automator test çerçevesinin temel özellikleri şunlardır:
- Durum bilgilerini almak ve hedef cihazda işlem yapmak için kullanılan bir API. Daha fazla bilgi için Cihaz durumuna erişme bölümüne bakın.
- Uygulamalar arası kullanıcı arayüzü testini destekleyen API'ler. Daha fazla bilgi için UI Automator API'leri başlıklı makaleyi inceleyin.
Cihaz durumuna erişme
UI Automator test çerçevesi, hedef uygulamanın çalıştığı cihaza erişmek ve işlem yapmak için bir UiDevice
sınıfı sağlar. Mevcut yön veya ekran boyutu gibi cihaz özelliklerine erişmek için bu sınıfın yöntemlerini çağırabilirsiniz. UiDevice
sınıfı, aşağıdaki işlemleri de yapmanıza olanak tanır:
- Cihazın dönüşünü değiştirin.
- "Sesi artır" gibi donanım tuşlarına basın.
- Geri, Ana Sayfa veya Menü düğmelerine basın.
- Bildirim gölgesini açın.
- Mevcut pencerenin ekran görüntüsünü alın.
Örneğin, ana sayfa düğmesine basmayı 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üçlü testler yazmanıza olanak tanır. Birden fazla uygulamadaki kullanıcı arayüzü bileşenlerini yakalamak ve değiştirmek için aşağıdaki API'leri kullanabilirsiniz:
UiObject2
: Cihazda görünen bir kullanıcı arayüzü öğesini temsil eder.BySelector
: Kullanıcı arayüzü öğelerinin eşleşmesi için ölçütleri belirtir.By
:BySelector
öğesini kısa bir şekilde oluşturur.Configurator
: Kullanıcı Arayüzü Otomatikleştirici testlerini çalıştırmak için temel parametreleri ayarlamanıza olanak tanır.
Örneğin, aşağıdaki kodda cihazda Gmail uygulaması açan bir test komut dosyası nasıl yazılabileceği gösterilmektedir:
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ştirici'yi ayarlama
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ızı yapılandırdığınızdan emin olun.
Android uygulama modülünüzün build.gradle
dosyasında, UI Automator kitaplığına bağımlılık referansı ayarlamanız gerekir:
Kotlin
dependencies {
...
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
}
Groovy
dependencies {
...
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.3.0'
}
Kullanıcı Arayüzü Otomasyonu testinizi optimize etmek için öncelikle hedef uygulamanın kullanıcı arayüzü bileşenlerini inceleyip erişilebilir olduklarından emin olmanız gerekir. Bu optimizasyon ipuçları sonraki iki bölümde açıklanmıştır.
Bir 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ü otomasyon testlerinizin bu bileşenlere erişebildiğinden emin olmak için bu bileşenlerin görünür metin etiketleri, android:contentDescription
değerleri veya her ikisinin de bulunduğ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ü otomasyon aracını kullanarak daha ayrıntılı testler oluşturmanıza olanak tanır. Örneğin, belirli bir görünür mülkle 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ğ alt panelde, düzen hiyerarşisi ise sağ üst panelde listelenir.- İsteğe bağlı olarak, UI Automator'un erişemediği kullanıcı arayüzü bileşenlerini görmek için NAF Düğümlerini Aç/Kapat 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ü başlıklı makaleyi inceleyin.
Etkinliğinize erişilebildiğinden emin olun
UI Automator test çerçevesi, Android erişilebilirlik özelliklerinin uygulandığı uygulamalarda daha iyi performans gösterir. View
türündeki kullanıcı arayüzü öğelerini veya SDK'daki View
alt sınıfını kullandığınızda bu sınıflar erişilebilirlik desteğini sizin için zaten sağladığı için erişilebilirlik desteğini uygulamanız gerekmez.
Ancak bazı uygulamalar, daha zengin bir kullanıcı deneyimi sunmak için özel kullanıcı arayüzü öğeleri kullanır.
Bu tür öğeler otomatik erişilebilirlik desteği sağlamaz. Uygulamanızda, SDK'dan olmayan bir View
alt sınıfının örnekleri varsa aşağıdaki adımları uygulayarak bu öğelere erişilebilirlik özellikleri eklediğinizden emin olun:
- ExploreByTouchHelper sınıfını genişleten somut bir sınıf oluşturun.
- setAccessibilityDelegate() yöntemini çağırarak 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 başlıklı makaleyi inceleyin. Android'de erişilebilirlikle ilgili genel en iyi uygulamalar hakkında daha fazla bilgi edinmek için Uygulamaları Daha Erişilebilir Hale Getirme başlıklı makaleyi inceleyin.
UI Automator test sınıfı oluşturma
UI Automator 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 iddiaları ile ek açıklamalarını kullanma hakkında daha fazla bilgi edinmek için Araçlarla Birimi Test Sınıfı Oluşturma başlıklı makaleyi inceleyin.
Test sınıfı tanımınızın başına @RunWith(AndroidJUnit4.class) ek açıklamasını ekleyin. Ayrıca, varsayılan test çalıştırıcınız olarak AndroidX Test'te sağlanan AndroidJUnitRunner sınıfını da belirtmeniz gerekir. Bu adım, UI Automator testlerini cihazda veya emülatörde çalıştırma bölümünde daha ayrıntılı olarak açıklanmıştır.
UI Automator test sınıfınızda aşağıdaki programlama modelini uygulayın:
- getInstance() yöntemini çağırıp bağımsız değişken olarak bir Instrumentation nesnesi ile test etmek istediğiniz cihaza erişmek için bir
UiDevice
nesnesi alın. - findObject() yöntemini çağırarak cihazda görüntülenen bir kullanıcı arayüzü bileşenine (ör. ön plandaki mevcut görünüm) erişmek için bir
UiObject2
nesnesi alın. UiObject2
yöntemini çağırarak belirli bir kullanıcı etkileşimini simüle edin. Örneğin, kaydırma yapmak için scrollUntil(), metin alanını düzenlemek için setText() yöntemini çağırın. Birden fazla kullanıcı arayüzü bileşeni veya kullanıcı işlemi sırası içeren daha karmaşık kullanıcı etkileşimlerini test etmek için 2. ve 3. adımlardaki API'leri gerektiği kadar tekrar çağırabilirsiniz.- Bu kullanıcı etkileşimleri gerçekleştirildikten sonra kullanıcı arayüzünün beklenen durumu veya davranışı yansıtıp yansıtmadığını kontrol edin.
Bu adımlar aşağıdaki bölümlerde daha ayrıntılı olarak açıklanmıştır.
Kullanıcı arayüzü bileşenlerine erişme
UiDevice
nesnesi, cihazın durumuna erişip bu durumu değiştirmenin birincil yoludur. Testlerinizde, mevcut yön veya ekran boyutu gibi çeşitli özelliklerin durumunu kontrol etmek için UiDevice
yöntemlerini çağırabilirsiniz.
Testiniz, cihazı belirli bir dönüşe zorlama, D-pad donanım düğmelerine ve Ana Sayfa ve Menü düğmelerine basma gibi cihaz düzeyinde işlemleri gerçekleştirmek için UiDevice
nesnesini kullanabilir.
Testinizi cihazın ana ekranından başlatmanız önerilir. Belirli kullanıcı arayüzü öğelerini seçip bunlarla etkileşim kurmak için ana ekrandan (veya cihazda seçtiğiniz başka bir başlangıç konumundan) UI Automator API tarafından sağlanan yöntemleri çağırabilirsiniz.
Aşağıdaki kod snippet'inde, testinizin nasıl bir UiDevice
örneği alabileceği ve Ana Sayfa düğmesine basmayı nasıl simüle edebileceği gösterilmektedir:
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); } }
Örnekte, @SdkSuppress(minSdkVersion = 18) ifadesi, UI Automator çerçevesinin gerektirdiği şekilde testlerin yalnızca Android 4.3 (API düzeyi 18) veya sonraki sürümlere sahip cihazlarda çalıştırılmasını sağlar.
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.
UI Automator test çerçevesinin, testiniz bir kullanıcı arayüzü öğesini tıklamak veya bir mülkü sorgulamak için her UiObject2
örneği kullandığında mevcut ekranda eşleşme aradığını unutmayın.
Aşağıdaki snippet'te, testinizin bir uygulamadaki İptal düğmesini ve Tamam düğmesini temsil eden UiObject2
örnekleri 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 belirtme
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 öğelerle ilgili bir sorguyu temsil eder.
Birden fazla eşleşen öğe bulunursa hedef UiObject2
olarak, düzen hiyerarşisindeki ilk eşleşen öğe döndürülür. Bir BySelector
oluştururken aramanızı hassaslaştırmak için birden fazla mülkü birbirine bağlayabilirsiniz. Eşleşen bir kullanıcı arayüzü öğesi bulunamazsa null
döndürülür.
Birden fazla 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, text mülküne sahip bir alt kullanıcı arayüzü öğesi içeren ilk ListView
öğesini bulmak için nasıl arama 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 belirtmek yararlı olabilir. Örneğin, işaretlerini kaldırabilmek için tüm işaretli öğelerin listesini seçmek istiyorsanız bağımsız değişkeni true olarak ayarlayarak checked()
yöntemini çağırın.
İşlem gerçekleştirin
Testiniz bir UiObject2
nesnesi elde ettikten sonra, bu nesne tarafından temsil edilen kullanıcı arayüzü bileşeninde kullanıcı etkileşimlerini gerçekleştirmek için UiObject2
sınıfındaki yöntemleri çağırabilirsiniz. Aşağıdaki gibi işlemleri belirtebilirsiniz:
click()
: Kullanıcı arayüzü öğesinin görünür sınırlarının ortasını tıklar.drag()
: Bu nesneyi rastgele koordinatlara sürükler.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
koşulu karşılanana kadar kaydırma işlemini belirtilen yönde gerçekleştirir.
UI Automator test çerçevesi, getContext()
aracılığıyla bir bağlam nesnesi alarak kabuk komutları kullanmadan Intent göndermenize veya etkinlik başlatmanıza olanak tanır.
Aşağıdaki snippet'te, testinizin test edilen uygulamayı başlatmak için nasıl Intent kullanabileceği gösterilmektedir. Bu yaklaşım, yalnızca hesap makinesi uygulamasını test etmek istediğinizde ve başlatıcıyı önemsemediğinizde kullanışlı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
InstrumentationTestCase, TestCase'yi genişletir. Bu nedenle, 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ında çeşitli düğmeleri nasıl bulabileceği, bunları sırayla nasıl tıklayabileceği ve ardından doğru sonucun gösterilip gösterilmediğini nasıl doğrulayabileceği gösterilmektedir.
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()); }
UI Automator testlerini cihazda veya emülatörde çalıştırma
UI Automator testlerini Android Studio'dan veya komut satırından çalıştırabilirsiniz. Projenizde varsayılan enstrümantasyon çalıştırıcı olarak AndroidJUnitRunner
değerini belirttiğinizden emin olun.
Diğer örnekler
Sistem kullanıcı arayüzüyle etkileşim kurma
UI Automator, 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şim kurabilir:
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 bekleyin

Ekran geçişleri zaman alabilir ve sürelerinin tahmin edilmesi güvenilir değildir. Bu nedenle, kullanıcı arayüzü otomasyonunun işlemleri gerçekleştirdikten sonra beklemesini sağlamanız gerekir. UI Otomasyonu bunun için birden fazla yöntem 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)
işlevini çağırın.UiDevice.wait(Condition<Object, U> condition, long timeout)
: Örneğin, cihazda belirli birUiObject2
gerçekleşene kadar beklemek içindevice.wait(Until.hasObject(By.text("my_text")), timeout);
işlevini çağırın.UiObject2.wait(@NonNull Condition<Object, U> condition, long timeout)
: Örneğin, bir onay kutusunun işaretlenmesini beklemek içincheckbox.wait(Until.checked(true), timeout);
işlevini çağırın.UiObject2.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);
işlevini çağırın.UiObject2.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')));
işlevini çağırın.UiObject2.scrollUntil(@NonNull Direction direction, @NonNull EventCondition<U> condition)
: Örneğin, en alta kaydırmak içinobject.scrollUntil(Direction.DOWN, Until.scrollFinished(Direction.DOWN));
çağrısı yapın.
Aşağıdaki kod snippet'inde, geçişleri bekleyen performActionAndWait()
yöntemini kullanarak Sistem ayarlarında Rahatsız Etmeyin modunu kapatmak için kullanıcı arayüzü otomasyonunun 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'u kullanma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.
Referans dokümanları:
Örnekler
- BasicSample: Temel kullanıcı arayüzü otomasyonu örneği.