Utilizzare l'API legacy UI Automator

UI Automator è un framework di test dell'interfaccia utente adatto per i test funzionali dell'interfaccia utente cross-app su app di sistema e installate. Le API UI Automator ti consentono di interagire con gli elementi visibili su un dispositivo, indipendentemente da quale Activity è in primo piano, quindi ti consentono di eseguire operazioni come l'apertura del menu Impostazioni o del launcher dell'app su un dispositivo di test. Il test può cercare un componente dell'interfaccia utente utilizzando descrittori pratici come il testo visualizzato nel componente o la relativa descrizione dei contenuti.

Il framework di test UI Automator è un'API basata su strumentazione e funziona con l'AndroidJUnitRunner esecutore di test. È ideale per scrivere test automatici in stile black box, in cui il codice di test non si basa sui dettagli di implementazione interni dell'app di destinazione.

Le funzionalità principali del framework di test UI Automator includono le seguenti:

  • Un'API per recuperare le informazioni sullo stato ed eseguire operazioni sul dispositivo di destinazione. Per ulteriori informazioni, vedi Accedere allo stato del dispositivo.
  • API che supportano i test dell'interfaccia utente cross-app. Per ulteriori informazioni, vedi API UI Automator.

Accedere allo stato del dispositivo

Il framework di test UI Automator fornisce una UiDevice classe per accedere ed eseguire operazioni sul dispositivo su cui è in esecuzione l'app di destinazione. Puoi chiamare i relativi metodi per accedere alle proprietà del dispositivo, ad esempio l'orientamento corrente o le dimensioni di visualizzazione. La classe UiDevice consente anche di eseguire le seguenti azioni:

  1. Modificare la rotazione del dispositivo.
  2. Premere i tasti hardware, ad esempio "Alza il volume".
  3. Premere i pulsanti Indietro, Home o Menu.
  4. Aprire l'area notifiche.
  5. Acquisire uno screenshot della finestra corrente.

Ad esempio, per simulare la pressione del pulsante Home, chiama il metodo UiDevice.pressHome().

API UI Automator

Le API UI Automator ti consentono di scrivere test solidi senza dover conoscere i dettagli di implementazione dell'app di destinazione. Puoi utilizzare queste API per acquisire e manipolare i componenti dell'interfaccia utente in più app:

  • UiObject2: rappresenta un elemento dell'interfaccia utente visibile sul dispositivo.
  • BySelector: specifica i criteri per la corrispondenza degli elementi dell'interfaccia utente.
  • By: crea BySelector in modo conciso.
  • Configurator: consente di impostare i parametri chiave per l'esecuzione dei test UI Automator.

Ad esempio, il seguente codice mostra come scrivere uno script per il test che apre un'app Gmail sul dispositivo:

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

Configurare UI Automator

Prima di creare il test dell'interfaccia utente con UI Automator, assicurati di configurare la posizione del codice sorgente di test e le dipendenze del progetto, come descritto in Configurare il progetto per AndroidX Test.

Nel file build.gradle del modulo dell'app per Android, devi impostare un riferimento di dipendenza alla libreria UI Automator:

Kotlin

dependencies { ... androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0") }

Alla moda

dependencies { ... androidTestImplementation "androidx.test.uiautomator:uiautomator:2.3.0" }

Per ottimizzare i test UI Automator, devi prima esaminare i componenti dell'interfaccia utente dell'app di destinazione e assicurarti che siano accessibili. Questi suggerimenti per l'ottimizzazione sono descritti nelle due sezioni successive.

Esaminare l'interfaccia utente su un dispositivo

Prima di progettare il test, esamina i componenti dell'interfaccia utente visibili sul dispositivo. Per assicurarti che i test UI Automator possano accedere a questi componenti, verifica che abbiano etichette di testo visibili, android:contentDescription valori o entrambi.

Lo strumento uiautomatorviewer fornisce un'interfaccia visiva pratica per esaminare la gerarchia del layout e visualizzare le proprietà dei componenti dell'interfaccia utente visibili in primo piano sul dispositivo. Queste informazioni ti consentono di creare test più precisi utilizzando UI Automator. Ad esempio, puoi creare un selettore dell'interfaccia utente che corrisponda a una proprietà visibile specifica.

Per avviare lo strumento uiautomatorviewer:

  1. Avvia l'app di destinazione su un dispositivo fisico.
  2. Collega il dispositivo alla macchina di sviluppo.
  3. Apri una finestra del terminale e vai alla directory <android-sdk>/tools/.
  4. Esegui lo strumento con questo comando:
 $ uiautomatorviewer

Per visualizzare le proprietà dell'interfaccia utente della tua applicazione:

  1. Nell'interfaccia uiautomatorviewer, fai clic sul pulsante Screenshot del dispositivo.
  2. Passa il mouse sopra lo snapshot nel riquadro a sinistra per visualizzare i componenti dell'interfaccia utente identificati dallo strumento uiautomatorviewer. Le proprietà sono elencate nel riquadro in basso a destra e la gerarchia del layout nel riquadro in alto a destra.
  3. (Facoltativo) Fai clic sul pulsante Attiva/disattiva nodi NAF per visualizzare i componenti dell'interfaccia utente non accessibili a UI Automator. Per questi componenti potrebbero essere disponibili solo informazioni limitate.

Per scoprire di più sui tipi comuni di componenti dell'interfaccia utente forniti da Android, vedi User Interface.

Assicurarsi che l'attività sia accessibile

Il framework di test UI Automator funziona meglio sulle app che hanno implementato le funzionalità di accessibilità di Android. Quando utilizzi elementi dell'interfaccia utente di tipo View o una sottoclasse di View dell'SDK, non devi implementare il supporto per l'accessibilità , perché queste classi lo hanno già fatto per te.

Alcune app, tuttavia, utilizzano elementi dell'interfaccia utente personalizzati per offrire un'esperienza utente più completa. Questi elementi non forniscono supporto automatico per l'accessibilità. Se la tua app contiene istanze di una sottoclasse di View che non proviene dall'SDK, assicurati di aggiungere funzionalità di accessibilità a questi elementi completando i seguenti passaggi:

  1. Crea una classe concreta che estenda ExploreByTouchHelper.
  2. Associa un'istanza della nuova classe a un elemento dell'interfaccia utente personalizzato specifico chiamando setAccessibilityDelegate().

Per ulteriori indicazioni sull'aggiunta di funzionalità di accessibilità agli elementi di visualizzazione personalizzati, vedi Creare visualizzazioni personalizzate accessibili. Per scoprire di più sulle best practice generali per l'accessibilità su Android, vedi Rendere le app più accessibili.

Creare una classe di test UI Automator

La classe di test UI Automator deve essere scritta nello stesso modo di una classe di test JUnit 4. Per scoprire di più sulla creazione di classi di test JUnit 4 e sull'utilizzo di asserzioni e annotazioni JUnit 4, vedi Creare una classe di test delle unità strumentate.

Aggiungi l'annotazione @RunWith(AndroidJUnit4.class) all'inizio della definizione della classe di test. Devi anche specificare la classe AndroidJUnitRunner, fornita in AndroidX Test, come esecutore di test predefinito. Questo passaggio è descritto in dettaglio in Eseguire test UI Automator su un dispositivo o un emulatore.

Implementa il seguente modello di programmazione nella classe di test UI Automator:

  1. Ottieni un UiDevice oggetto per accedere al dispositivo che vuoi testare chiamando il metodo getInstance() e passandogli un oggetto Instrumentation come argomento.
  2. Ottieni un oggetto UiObject2 per accedere a un componente dell'interfaccia utente visualizzato sul dispositivo (ad esempio, la visualizzazione corrente in primo piano) chiamando il metodo findObject().
  3. Simula un'interazione utente specifica da eseguire sul componente dell'interfaccia utente chiamando un metodo UiObject2; ad esempio, chiama scrollUntil() per scorrere e setText() per modificare un campo di testo. Puoi chiamare le API nei passaggi 2 e 3 ripetutamente, se necessario, per testare interazioni utente più complesse che coinvolgono più componenti dell'interfaccia utente o sequenze di azioni utente.
  4. Verifica che l'interfaccia utente rifletta lo stato o il comportamento previsto dopo l'esecuzione di queste interazioni utente.

Questi passaggi sono descritti in dettaglio nelle sezioni seguenti.

Accedere ai componenti dell'interfaccia utente

L'UiDevice oggetto è il modo principale per accedere e manipolare lo stato del dispositivo. Nei test, puoi chiamare i metodi UiDevice per verificare lo stato di varie proprietà, ad esempio l'orientamento corrente o le dimensioni di visualizzazione. Il test può utilizzare l'oggetto UiDevice per eseguire azioni a livello di dispositivo, ad esempio forzare il dispositivo a una rotazione specifica, premere i tasti hardware del D-pad e premere i pulsanti Home e Menu.

È una buona pratica iniziare il test dalla schermata Home del dispositivo. Dalla schermata Home (o da un'altra posizione iniziale scelta nel dispositivo), puoi chiamare i metodi forniti dall'API UI Automator per selezionare e interagire con elementi dell'interfaccia utente specifici.

Il seguente snippet di codice mostra come il test potrebbe ottenere un'istanza di UiDevice e simulare la pressione del pulsante Home:

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

Nell'esempio, l'istruzione @SdkSuppress(minSdkVersion = 18) consente di garantire che i test vengano eseguiti solo su dispositivi con Android 4.3 (livello API 18) o versioni successive, come richiesto dal framework UI Automator.

Utilizza il metodo findObject() per recuperare un UiObject2 che rappresenta una visualizzazione che corrisponde a determinati criteri di selezione. Puoi riutilizzare le istanze UiObject2 che hai creato in altre parti del test dell'app, se necessario. Tieni presente che il framework di test UI Automator cerca una corrispondenza nella visualizzazione corrente ogni volta che il test utilizza un'istanza UiObject2 per fare clic su un elemento dell'interfaccia utente o eseguire una query su una proprietà.

Il seguente snippet mostra come il test potrebbe creare istanze UiObject2 che rappresentano un pulsante Annulla e un pulsante OK in un'app.

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

Specificare un selettore

Se vuoi accedere a un componente dell'interfaccia utente specifico in un'app, utilizza la By classe per creare un'BySelector istanza. BySelector rappresenta una query per elementi specifici nell'interfaccia utente visualizzata.

Se viene trovato più di un elemento corrispondente, il primo elemento corrispondente nella gerarchia del layout viene restituito come UiObject2 di destinazione. Quando crei un BySelector, puoi concatenare più proprietà per perfezionare la ricerca. Se non viene trovato alcun elemento dell'interfaccia utente corrispondente, viene restituito un valore null.

Puoi utilizzare il hasChild() o il hasDescendant() metodo per nidificare più BySelector istanze. Ad esempio, il seguente esempio di codice mostra come il test potrebbe specificare una ricerca per trovare il primo ListView che ha un elemento dell'interfaccia utente figlio con la proprietà text.

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")
        )
);

Può essere utile specificare lo stato dell'oggetto nei criteri del selettore. Ad esempio, se vuoi selezionare un elenco di tutti gli elementi selezionati in modo da poterli deselezionare, chiama il checked() metodo con l'argomento impostato su true.

Esecuzione azioni

Una volta che il test ha ottenuto un oggetto UiObject2, puoi chiamare i metodi della classe UiObject2 per eseguire interazioni utente sul componente dell'interfaccia utente rappresentato da quell'oggetto. Puoi specificare azioni come:

  • click() : fa clic al centro dei limiti visibili dell'elemento dell'interfaccia utente.
  • drag() : trascina questo oggetto in coordinate arbitrarie.
  • setText() : imposta il testo in un campo modificabile, dopo aver cancellato il contenuto del campo. Al contrario, il metodo clear() cancella il testo esistente in un campo modificabile.
  • swipe() : esegue l'azione di scorrimento verso la direzione specificata.
  • scrollUntil(): esegue l'azione di scorrimento verso la direzione specificata finché non viene soddisfatta la Condition o EventCondition.

Il framework di test UI Automator ti consente di inviare un Intent o avviare un Activity senza utilizzare i comandi della shell, ottenendo un oggetto Context tramite getContext().

Il seguente snippet mostra come il test può utilizzare un Intent per avviare l' app in fase di test. Questo approccio è utile quando ti interessa solo testare l'app Calcolatrice e non ti interessa il launcher.

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

Verificare i risultati

Lo InstrumentationTestCase estende TestCase, quindi puoi utilizzare i metodi JUnit Assert standard per verificare che i componenti dell'interfaccia utente nell'app restituiscano i risultati previsti.

Il seguente snippet mostra come il test può individuare diversi pulsanti in un'app Calcolatrice, fare clic su di essi in ordine e poi verificare che venga visualizzato il risultato corretto.

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

Eseguire test UI Automator su un dispositivo o un emulatore

Puoi eseguire i test UI Automator da Android Studio o dalla riga di comando. Assicurati di specificare AndroidJUnitRunner come esecutore di strumentazione predefinito nel progetto.

Altri esempi

Interagire con l'UI di sistema

UI Automator può interagire con tutti gli elementi sullo schermo, inclusi gli elementi di sistema esterni all'app, come mostrato nei seguenti snippet di codice:

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

Attendere le transizioni

Disattivare la modalità Non disturbare
Figura 1. UI Automator disattiva la modalità Non disturbare su un dispositivo di test.

Le transizioni dello schermo possono richiedere tempo e la previsione della loro durata non è affidabile, quindi devi fare in modo che UI Automator attenda dopo l'esecuzione delle operazioni. UI Automator fornisce più metodi per questo scopo:

Il seguente snippet di codice mostra come utilizzare UI Automator per disattivare la modalità Non disturbare nelle impostazioni di sistema utilizzando il metodo performActionAndWait() che attende le transizioni:

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

Risorse aggiuntive

Per ulteriori informazioni sull'utilizzo di UI Automator nei test Android, consulta le seguenti risorse.

Documentazione di riferimento:

Esempi