Kullanıcı Arayüzü Otomatikleştirici ile otomatik testler yazma

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:

  1. Cihaz döndürme ayarını değiştirin.
  2. "Sesi aç" gibi donanım tuşlarına basın.
  3. Geri, Ana Sayfa veya Menü düğmelerine basın.
  4. Bildirim gölgesini açın.
  5. 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:

  1. Hedef uygulamayı fiziksel bir cihazda başlatın.
  2. Cihazı geliştirme makinenize bağlayın.
  3. Bir terminal penceresi açıp <android-sdk>/tools/ dizinine gidin.
  4. Aracı şu komutla çalıştırın:
 $ uiautomatorviewer

Uygulamanızın kullanıcı arayüzü özelliklerini görüntülemek için:

  1. uiautomatorviewer arayüzünde, Cihaz Ekran Görüntüsü düğmesini tıklayın.
  2. 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.
  3. İ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:

  1. KeşfetByTouchHelper özelliğini genişleten somut bir sınıf oluşturun.
  2. 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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 veya EventCondition 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

Rahatsız Etmeyin&#39;i devre dışı bırak
Şekil 1. Kullanıcı Arayüzü Otomatikleştirici, test cihazlarında Rahatsız Etmeyin modunu kapatır.

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:

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.