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

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:

  1. Cihazın dönüşünü değiştirin.
  2. "Sesi artır" 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ü 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:

  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ğ alt panelde, düzen hiyerarşisi ise sağ üst panelde listelenir.
  3. İ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:

  1. ExploreByTouchHelper sınıfını genişleten somut bir sınıf oluşturun.
  2. 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:

  1. 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.
  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 bir UiObject2 nesnesi alın.
  3. 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.
  4. 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 veya EventCondition 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

Rahatsız Etmeyin modunu kapatma
Şekil 1. UI Otomasyonu, test cihazında Rahatsız Etmeyin modunu kapatır.

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:

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.