UI Automator ile otomatik testler yazma (eski kılavuz)

UI Automator, sistem ve yüklü uygulamalarda uygulamalar arası işlevsel kullanıcı arayüzü testi için uygun bir kullanıcı arayüzü testi çerçevesidir. UI Automator API'leri, hangi Activity'ın odaklandığından bağımsız olarak 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, kullanıcı arayüzü bileşenini aramak için bu bileşende gösterilen metin veya içerik açıklaması gibi uygun tanımlayıcıları kullanabilir.

UI Automator 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 dayanmadığı, opak kutu tarzı otomatik testler yazmak için uygundur.

UI Automator test çerçevesinin temel özellikleri şunlardır:

  • Durum bilgilerini almak ve hedef cihazda işlemler gerçekleştirmek için kullanılan bir API. Daha fazla bilgi için Cihaz durumuna erişme başlıklı makaleyi inceleyin.
  • 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 cihazda işlemler gerçekleştirmek için UiDevice sınıfını sağlar. Mevcut yön veya ekran boyutu gibi cihaz özelliklerine erişmek için yöntemlerini çağırabilirsiniz. UiDevice sınıfında aşağıdaki işlemleri de yapabilirsiniz:

  1. Cihazın 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. Mevcut pencerenin ekran görüntüsünü alma

Örneğin, ana sayfa düğmesine basma işlemini simüle etmek için UiDevice.pressHome() yöntemini çağırın.

UI Automator API'leri

UI Automator API'leri, hedeflediğiniz uygulamanın uygulama ayrıntılarını bilmenize gerek kalmadan sağlam testler yazmanıza olanak tanır. Bu API'leri kullanarak birden fazla uygulamadaki kullanıcı arayüzü bileşenlerini yakalayabilir ve değiştirebilirsiniz:

  • UiObject2: Cihazda görünür olan bir kullanıcı arayüzü öğesini temsil eder.
  • BySelector: Kullanıcı arayüzü öğelerini eşleştirme ölçütlerini belirtir.
  • By: BySelector öğelerini kısa ve öz bir şekilde oluşturur.
  • Configurator: UI Automator testlerini çalıştırmak için temel parametreleri ayarlamanıza olanak tanır.

Örneğin, aşağıdaki kodda cihazda bir Gmail uygulamasını açan bir test komut dosyası nasıl yazabileceğiniz 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);

UI Automator'ı ayarlama

UI Automator ile kullanıcı arayüzü testinizi oluşturmadan önce AndroidX Test için projeyi ayarlama bölümünde açıklandığı şekilde 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 bir 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" }

UI Automator 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.

Cihazda kullanıcı arayüzünü inceleme

Testinizi tasarlamadan önce cihazda görünen kullanıcı arayüzü bileşenlerini inceleyin. UI Automator testlerinizin bu bileşenlere erişebilmesi için bu bileşenlerde 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, UI Automator'ı 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:

  1. Hedef uygulamayı fiziksel bir cihazda başlatın.
  2. Cihazı geliştirme makinenize bağlayın.
  3. Bir terminal penceresi açın ve <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 soldaki panelde anlık görüntünün üzerine gelin. Özellikler sağ alttaki panelde, düzen hiyerarşisi ise sağ üstteki panelde listelenir.
  3. İsteğe bağlı olarak, UI Automator'ın erişemediği kullanıcı arayüzü bileşenlerini görmek için Toggle NAF Nodes (NAF düğmelerini değiştir) düğmesini tıklayın. Bu bileşenler için yalnızca sınırlı bilgiler mevcut olabilir.

Android'in sağladığı yaygın kullanıcı arayüzü bileşenleri 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 özelliklerini uygulayan uygulamalarda daha iyi performans gösterir. View türünde kullanıcı arayüzü öğeleri veya SDK'dan View alt sınıfı kullandığınızda, bu sınıflar sizin için erişilebilirlik desteğini zaten uyguladığından erişilebilirlik desteği 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:

  1. ExploreByTouchHelper'ı genişleten somut bir sınıf oluşturun.
  2. setAccessibilityDelegate() işlevini ç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 onaylarını ve ek açıklamalarını kullanma hakkında daha fazla bilgi edinmek için Araçlı Birim Testi 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, 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, Cihazda veya emülatörde UI Automator testleri çalıştırma bölümünde daha ayrıntılı olarak açıklanmaktadır.

UI Automator test sınıfınızda aşağıdaki programlama modelini uygulayın:

  1. getInstance() yöntemini çağırıp bağımsız değişken olarak Instrumentation nesnesi ileterek test etmek istediğiniz cihaza erişmek için bir UiDevice nesnesi alın.
  2. 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 UiObject2 nesnesi alın.
  3. UiObject2 yöntemini çağırarak söz konusu kullanıcı arayüzü bileşeninde gerçekleştirilecek belirli bir kullanıcı etkileşimini simüle edin. Örneğin, kaydırmak 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şlemleri dizisi içeren daha karmaşık kullanıcı etkileşimlerini test etmek için 2. ve 3. adımlardaki API'leri gerektiği kadar tekrar 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ığını kontrol edin.

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şme

UiDevice nesnesi, cihazın durumuna erişip bu durumu değiştirmenin temel 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öndürmeye zorlama, D-pad donanım düğmelerine basma, Ana Sayfa ve Menü düğmelerine basma gibi cihaz düzeyinde işlemler gerçekleştirmek için UiDevice nesnesini kullanabilir.

Testinize cihazın ana ekranından başlamanız önerilir. Ana ekrandan (veya cihazda seçtiğiniz başka bir başlangıç konumundan) belirli kullanıcı arayüzü öğelerini seçip bunlarla etkileşim kurmak için UI Automator API'si tarafından sağlanan yöntemleri çağırabilirsiniz.

Aşağıdaki kod snippet'inde, testinizin nasıl UiDevice örneği alabileceği ve Ana Sayfa düğmesine basma işlemini 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ümlerin yüklü olduğu cihazlarda çalışmasını sağlamaya yardımcı olur.

Belirli bir seçici ölçütüne uyan bir görünümü temsil eden UiObject2 öğesini almak için findObject() yöntemini kullanın. Uygulama testinizin diğer bölümlerinde oluşturduğunuz UiObject2 örneklerini gerektiğinde yeniden kullanabilirsiniz. UI Automator test çerçevesinin, testiniz bir UI öğesini tıklamak veya bir özelliği sorgulamak için her UiObject2 örneğini kullandığında mevcut ekranda eşleşme aradığını unutmayın.

Aşağıdaki snippet'te, testinizin bir uygulamada İptal düğmesini 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 belirtme

Bir uygulamada belirli bir kullanıcı arayüzü bileşenine erişmek istiyorsanız By sınıfını kullanarak BySelector örneği oluşturun. BySelector , gösterilen kullanıcı arayüzündeki belirli öğelerle ilgili 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. BySelector oluştururken aramanızı hassaslaştırmak için birden çok 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 metin özelliği olan bir alt kullanıcı arayüzü öğesine sahip ilk ListView öğesini bulmak için nasıl bir 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 faydalı olabilir. Örneğin, işaretli tüm öğelerin listesini seçip temizlemek 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 nesnenin temsil ettiği kullanıcı arayüzü bileşeninde kullanıcı etkileşimleri 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() : Düzenlenebilir bir alandaki metni, alanın içeriğini temizledikten sonra ayarlar. Buna karşılık, clear() yöntemi, düzenlenebilir bir alandaki mevcut metni temizler.
  • swipe() : Belirtilen yönde kaydırma işlemini gerçekleştirir.
  • scrollUntil(): Condition veya EventCondition koşulu karşılanana kadar belirtilen yönde kaydırma işlemini gerçekleştirir.

UI Automator test çerçevesi, getContext() aracılığıyla bir Context nesnesi alarak kabuk komutlarını kullanmadan bir Intent göndermenize veya bir Activity 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 etmekle ilgileniyorsanız ve başlatıcıyı önemsemiyorsanız 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'i 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, testinizin bir hesap makinesi uygulamasındaki birkaç düğmeyi nasıl bulabileceğini, bunları sırayla nasıl tıklayabileceğini ve doğru sonucun gösterildiğini nasıl doğrulayabileceğini gösterir.

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 UI Automator testleri ç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ısı olarak AndroidJUnitRunner'yı 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

Rahatsız etme modunu kapatma
1. şekil. UI Automator, test cihazında Rahatsız Etmeyin modunu devre dışı bırakır.

Ekran geçişleri zaman alabilir ve sürelerini tahmin etmek güvenilir değildir. Bu nedenle, işlemler gerçekleştirildikten sonra UI Automator'ın beklemesini sağlamalısınız. UI Automator, bu işlem için çeşitli yöntemler sunar:

Aşağıdaki kod snippet'inde, geçişleri bekleyen performActionAndWait() yöntemini kullanarak UI Automator ile sistem ayarlarında Rahatsız Etmeyin modunun nasıl kapatı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 belgeleri:

Örnekler