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

UI Automator, uygulamalar arası işlevsel kullanıcı arayüzüne uygun bir kullanıcı arayüzü testi çerçevesidir. ve yüklü uygulamalarda test yapabilirsiniz. UI Automator API'leri sayesinde etkileşimde bulunabilirsiniz. Activity nerede olursa olsun, cihazda görünür öğelerle odaklanacak şekilde ayarlayabilirsiniz. Böylece, Ayarlar menüsünü açmak gibi veya uygulama başlatıcıyı kullanabilirsiniz. Testiniz, aşağıdakileri yaparak bir kullanıcı arayüzü bileşeni arayabilir: söz konusu bileşende görüntülenen metin veya bileşende görüntülenen metin gibi uygun tanımlayıcılar içerik açıklaması.

UI Automator test çerçevesi, araç tabanlı bir API'dir ve test aracı ile AndroidJUnitRunner test edin. Yazmaya uygun test kodunun dahili sisteme dayalı olmadığı opak kutu tarzı otomatik testler hedef uygulamanın uygulanma ayrıntılarına bakacağız.

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

  • Durum bilgilerini almak ve hedef üzerinde işlemler gerçekleştirmek için kullanılan bir API olanak tanır. 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 bkz. Kullanıcı Arayüzü Automator API'leri hakkında daha fazla bilgi edinin.
ziyaret edin.

Cihaz durumuna erişiliyor

UI Automator test çerçevesi, test kullanıcılarına erişmek için bir UiDevice sınıfı sağlar ve hedef uygulamanın çalıştığı cihazda işlem gerçekleştirme. Şunları yapabilirsiniz: yön veya mod gibi cihaz özelliklerine erişmek için görüntü boyutu. UiDevice sınıfı aşağıdaki işlemleri de gerçekleştirmenize olanak tanır: işlemler:

  1. Cihazın yönünü değiştirin.
  2. "Sesi artırma" 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 basılmasını simüle etmek için UiDevice.pressHome() işlevini çağırın. yöntemidir.

UI Automator API'leri

UI Automator API'leri, bilmenize gerek kalmadan sağlam testler yazmanıza olanak tanır hedeflediğiniz uygulamanın uygulama ayrıntıları hakkında. Tekliflerinizi otomatikleştirmek ve optimize etmek için kullanıcı arayüzü bileşenlerini yakalamak ve değiştirmek için aşağıdaki API'leri kullanabilirsiniz:

  • UiObject2: Cihazda görünür olan bir kullanıcı arayüzü öğesini temsil eder.
  • BySelector: Eşleşen kullanıcı arayüzü öğeleriyle ilgili ölçütleri belirtir.
  • By: BySelector kısa ve öz bir şekilde oluşturulur.
  • Configurator: UI Automator testlerini çalıştırmak için temel parametreleri ayarlamanızı sağlar.
ziyaret edin.

Örneğin, aşağıdaki kodda kullanılabilecek bir test komut dosyasını Cihazda bir Gmail uygulaması açtığında:

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'ı kurma

UI Automator ile kullanıcı arayüzü testinizi oluşturmadan önce testinizi yapılandırdığınızdan emin olun Projeyi kurma adımlarında açıklandığı gibi kaynak kodu konumu ve proje bağımlılıkları AndroidX Test için.

Android uygulama modülünüzün build.gradle dosyasında bir bağımlılık ayarlamanız gerekir kullanıcı arayüzü otomatikleştirme kitaplığına referans:

Kotlin

dependencies {
  ...
  androidTestImplementation('androidx.test.uiautomator:uiautomator:2.3.0-alpha03')
}

Eski

dependencies {
  ...
  androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.3.0-alpha03'
}

UI Automator testinizi optimize etmek için önce hedef uygulamanın Kullanıcı arayüzü bileşenlerini ve erişilebilir olduklarından emin olun. Bu optimizasyon ipuçları, açıklayacağım.

Bir cihazda kullanıcı arayüzünü inceleme

Testinizi tasarlamadan önce olanak tanır. UI Automator testlerinizin bu bileşenlere erişebildiğinden emin olmak için bu bileşenlerin görünür metin etiketlerine sahip olduğundan emin olun. android:contentDescription değerleri veya her ikisi.

uiautomatorviewer aracı, kontrol etmek için kullanışlı bir görsel arayüz sağlar düzen hiyerarşisini gösterme ve görünür olan kullanıcı arayüzü bileşenlerinin özelliklerini görüntüleme ekranda görünür. Bu bilgiler, daha fazla ayrıntılı testler yapabilirsiniz. Örneğin, kullanıcı arayüzü seçici, belirli bir görünür özellikle eşleşen

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. Kullanıcı arayüzü bileşenlerini görmek için fareyle sol paneldeki anlık görüntünün üzerine gelin uiautomatorviewer aracı tarafından tespit edilir. Tesisler daha düşük düzen hiyerarşisini görürsünüz.
  3. İsterseniz kullanıcı arayüzü bileşenlerini görmek için NAF Düğümlerini Değiştir düğmesini tıklayabilirsiniz. erişilemeyen URL'ler oluşturun. Paydaşlarla sınırlı sayıda kullanılabilir.

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.

Etkinliğinizin erişilebilir olduğundan emin olma

UI Automator test çerçevesi, Virtual Verde için önerilen ve Android'in erişilebilirlik özellikleri. View türündeki kullanıcı arayüzü öğeleri kullandığınızda veya SDK'daki bir View alt sınıfını bulmak için, erişilebilirliği uygulamanız gerekmez. destek ekibi ile iletişime geçin.

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'dan gelmeyen bir View alt sınıfının örneklerini içeriyorsa şu adımları izleyerek bu öğelere erişilebilirlik özellikleri eklediğinizden emin olun: şu adımları uygulayın:

  1. ExploreByTouchHelper kapsamını genişleten somut bir sınıf oluşturun.
  2. Yeni sınıfınızın bir örneğini belirli bir özel kullanıcı arayüzü öğesiyle ilişkilendirmek için setAccessibilityDelegate() çağrısı yapın.

Özel görünüme erişilebilirlik özellikleri ekleme hakkında daha fazla bilgi için öğeleri için Erişilebilir Özel Görünümler Oluşturma bölümüne bakın. Şu konu hakkında daha fazla bilgi edinmek için: Android'de erişilebilirlikle ilgili genel en iyi uygulamalar için Uygulamaları Daha Fazla Yapın Erişilebilir.

UI Automator test sınıfı oluşturma

UI Automator test sınıfınız, JUnit 4 testiyle aynı şekilde yazılmalıdır sınıfını kullanır. JUnit 4 test sınıfları oluşturma ve JUnit 4'ü kullanma hakkında daha fazla bilgi edinmek için Onaylar ve ek açıklamalar için Araçlı Ünite Test Sınıfı Oluşturma bölümüne bakın.

Testinizin başına @RunWith(AndroidJUnit4.class) ek açıklamasını ekleyin sınıf tanımıdır. Ayrıca, AndroidJUnitRunner sınıfını da belirtmeniz gerekir. sağlanmış olmasını sağlayabilirsiniz. Bu adımın açıklaması Bir cihazda veya emülatörde UI Otomasyonu testlerini çalıştırma konusunu daha ayrıntılı olarak inceleyebilirsiniz.

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

  1. Şu numarayı arayarak test etmek istediğiniz cihaza erişmek için bir UiDevice nesnesi alın: getInstance() yöntemini kullanmalı ve buna bir Enstrümantasyon nesnesini argüman.
  2. Şurada görüntülenen bir kullanıcı arayüzü bileşenine erişmek için bir UiObject2 nesnesi alın (örneğin, ön plandaki mevcut görünüm) çağırarak findObject() yöntemini kullanın.
  3. Söz konusu kullanıcı arayüzü bileşeninde performans göstermek üzere belirli bir kullanıcı etkileşimini simüle ederek bir UiObject2 yöntemini çağırma; örneğin scrollUntil(), bir metin alanını düzenlemek için setText(). 2. ve 3. adımlarda API'leri çağırabilirsiniz kullanıcı etkileşimleri içeren daha karmaşık kullanıcı etkileşimlerini kullanıcı arayüzü bileşenlerinin veya kullanıcı işlem dizilerinin sayısı.
  4. Kullanıcı arayüzünün, bu kullanıcıdan sonra beklenen durumu veya davranışı yansıttığından emin olun dahil edilir.

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, içeriğe erişmenizin ve manipüle etmenin birincil yoludur. cihazın durumunu kontrol edebilirsiniz. Testlerinizde UiDevice yöntemlerini çağırarak geçerli yön veya görüntü boyutu gibi çeşitli özelliklerin durumunu gösterir. Testiniz, cihaz düzeyinde işlemler gerçekleştirmek için UiDevice nesnesini kullanabilir. Örneğin, cihazı belirli bir yöne döndürme, D-pad donanımına basma tuşlarına basarak ve Ana Sayfa ve Menü düğmelerine basabilirsiniz.

Testinizi cihazın ana ekranından başlatmanız önerilir. Başlangıç fiyatı Ana ekran (veya cihazda seçtiğiniz başka bir başlangıç konumu) seçmek ve etkileşimde bulunmak için UI Automator API'nin sağladığı yöntemleri çağırabilirsiniz kullanıcı arayüzü öğeleri kullanın.

Aşağıdaki kod snippet'i, testinizin UiDevice ve Ana Sayfa düğmesine basmayı simüle edin:

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.getApplicationContextC<ontext(>)
  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);
    }
}

Bu örnekte, @SdkSuppress(minSdkVersion = 18) ifadesi, testlerin yalnızca Android 4.3 (API düzeyi 18) veya sonraki sürümlere sahip cihazlarda çalıştırılacağı, gereken şekilde çalışmaya devam eder.

Aşağıdaki değeri temsil eden bir UiObject2 almak için findObject() yöntemini kullanın: Belirli bir seçici ölçütüyle eşleşen bir görünüm UiObject2 yeniden kullanılabilir uygulama testinizin diğer bölümlerinde oluşturduğunuz örnekleri gerektiği gibi. UI Automator test çerçevesinin mevcut ekranda bir testiniz bir kullanıcı arayüzünü tıklamak için UiObject2 örneği kullandığı her seferde eşleştirilir öğesine dokunun veya bir özelliği sorgulayın.

Aşağıdaki snippet, testinizin UiObject2 özelliğini nasıl oluşturabileceğini gösterir bir uygulamada İptal ve Tamam düğmesini temsil eden örnekler.

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();
}

Bir seçici belirtin

Bir uygulamada belirli bir kullanıcı arayüzü bileşenine erişmek isterseniz 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 öğelere ilişkin bir sorguyu temsil eder.

Birden fazla eşleşen öğe bulunursa düzen hiyerarşisi, UiObject2 hedefi olarak döndürülür. Bir BySelector, tesislerinizi birbirine bağlayarak arayın. Eşleşen bir kullanıcı arayüzü öğesi bulunamazsa bir null döndürülür.

İç içe yerleştirmek için hasChild() veya hasDescendant() yöntemini kullanabilirsiniz birden fazla BySelector örneği. Örneğin, aşağıdaki kod örneği testinizin, en çok aranan ilk ListView olanı bulmak için bir aramayı metin özelliğine sahip bir alt kullanıcı arayüzü öğesine sahiptir.

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, kontrol edilen tüm öğelerin bir listesini seçmek bunların işaretini kaldırın. Bağımsız değişken "true" (doğru) olarak ayarlanmış şekilde checked() yöntemini çağırın.

İşlem gerçekleştirin

Testiniz bir UiObject2 nesnesi aldıktan sonra, kullanıcı arayüzü bileşeninde kullanıcı etkileşimleri gerçekleştirmek için UiObject2 sınıfı temsil eder. Bu tür işlemleri şu şekilde 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ın içeriğini kontrol eder. clear() yöntemi ise mevcut metni temizler. bir konuma geri yükleyebilirsiniz.
  • swipe() : Kaydırma işlemini belirtilen yöne doğru gerçekleştirir.
  • scrollUntil(): Kaydırma işlemini belirtilen yöne doğru gerçekleştirir Condition veya EventCondition memnun kalana kadar.

UI Automator test çerçevesi, bir Amaç veya başlatma isteği göndermenize bir Bağlam alarak, kabuk komutlarını kullanmadan bir Etkinlik getContext() aracılığıyla nesnel.

Aşağıdaki snippet, testinizin bir Intent kullanarak iyi bir fikir olabilir. Bu yaklaşım, yalnızca test etmek istediğiniz durumlarda yararlıdır. hesap makinesi uygulamasına girip başlatıcıyı umursamıyorsunuz.

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'in kapsamını genişlettiği için uygulamadaki kullanıcı arayüzü bileşenlerinin döndürüldüğünü test etmek için standart JUnit Assert yöntemleri beklenen sonuçlar.

Aşağıdaki snippet, testinizin tek bir sayfada birkaç düğmeyi nasıl hesap makinesi uygulamasında bunları sırayla tıklayın ve doğru sonucun görüntülenir.

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());
}

Bir cihazda veya emülatörde UI Automator testlerini çalıştırma

UI Automator testlerini Android Studio'dan veya komut satırından erişebilirsiniz. AndroidJUnitRunner öğesini varsayılan olarak belirttiğinizden emin olun enstrümantasyon aracını kullanabilirsiniz.

Diğer örnekler

Sistem kullanıcı arayüzüyle etkileşim kurma

UI Automator, sistem de dahil olmak üzere ekrandaki her şeyle etkileşimde bulunabilir. öğelerini uygulamanızın dışına çıkartın:

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 modunu devre dışı bırak
Şekil 1. Kullanıcı Arayüzü Otomatikleştirici, test cihazı.

Ekran geçişleri zaman alabilir ve sürelerini tahmin etmek güvenilir olmayabilir. Bu nedenle, işlemler gerçekleştirdikten sonra UI Automator'ı beklemelisiniz. Kullanıcı Arayüzü Otomatikleştirici Bunun için birden fazla yöntem sunar:

Aşağıdaki kod snippet'inde, Do Not'u kapatmak için UI Automator'ın nasıl kullanılacağı gösterilmektedir Sistem ayarlarında performActionAndWait() yöntemini kullanarak beklemeye devam ediyor:

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 şu sayfaya bakın: inceleyebilirsiniz.

Referans belgeleri:

Örnekler

  • BasicSample: Temel Kullanıcı Arayüzü Automator örneği.