تست های خودکار را با UI Automator بنویسید

UI Automator یک چارچوب تست UI است که برای آزمایش UI کاربردی بین برنامه ای در سیستم و برنامه های نصب شده مناسب است. APIهای UI Automator به شما امکان می دهند با عناصر قابل مشاهده روی یک دستگاه تعامل داشته باشید، صرف نظر از اینکه کدام Activity در تمرکز است، بنابراین به شما امکان می دهد عملیات هایی مانند باز کردن منوی تنظیمات یا راه اندازی برنامه را در یک دستگاه آزمایشی انجام دهید. آزمون شما می تواند با استفاده از توصیفگرهای مناسب مانند متن نمایش داده شده در آن مؤلفه یا توضیحات محتوای آن، یک مؤلفه رابط کاربری را جستجو کند.

چارچوب تست UI Automator یک API مبتنی بر ابزار دقیق است و با برنامه آزمایشی AndroidJUnitRunner کار می کند. این برای نوشتن تست‌های خودکار به سبک جعبه‌ای غیرشفاف، که در آن کد تست به جزئیات پیاده‌سازی داخلی برنامه هدف متکی نیست، مناسب است.

ویژگی های کلیدی چارچوب تست UI Automator شامل موارد زیر است:

  • یک API برای بازیابی اطلاعات وضعیت و انجام عملیات روی دستگاه مورد نظر. برای اطلاعات بیشتر، دسترسی به وضعیت دستگاه را ببینید.
  • API هایی که از تست رابط کاربری متقابل پشتیبانی می کنند. برای اطلاعات بیشتر، APIهای UI Automator را ببینید.

دسترسی به وضعیت دستگاه

چارچوب تست UI Automator یک کلاس UiDevice را برای دسترسی و انجام عملیات روی دستگاهی که برنامه مورد نظر روی آن اجرا می‌شود، فراهم می‌کند. می‌توانید برای دسترسی به ویژگی‌های دستگاه مانند جهت فعلی یا اندازه نمایش، روش‌های آن را فراخوانی کنید. کلاس UiDevice همچنین به شما امکان می دهد اقدامات زیر را انجام دهید:

  1. چرخش دستگاه را تغییر دهید.
  2. کلیدهای سخت افزاری مانند "افزایش صدا" را فشار دهید.
  3. دکمه های برگشت، صفحه اصلی یا منو را فشار دهید.
  4. سایه اعلان را باز کنید.
  5. از پنجره فعلی اسکرین شات بگیرید.

برای مثال، برای شبیه سازی فشار دادن دکمه Home، متد UiDevice.pressHome() را فراخوانی کنید.

APIهای UI Automator

API های UI Automator به شما امکان می دهند بدون نیاز به دانستن جزئیات پیاده سازی برنامه مورد نظر خود، تست های قوی بنویسید. می‌توانید از این APIها برای ضبط و دستکاری مؤلفه‌های رابط کاربری در چندین برنامه استفاده کنید:

  • UiObject2 : نشان دهنده یک عنصر UI است که در دستگاه قابل مشاهده است.
  • BySelector : معیارهایی را برای تطبیق عناصر UI مشخص می کند.
  • By : BySelector را به صورت مختصر می سازد.
  • Configurator : به شما امکان می دهد پارامترهای کلیدی را برای اجرای تست های UI Automator تنظیم کنید.

به عنوان مثال، کد زیر نشان می دهد که چگونه می توانید یک اسکریپت آزمایشی بنویسید که یک برنامه Gmail را در دستگاه باز می کند:

کاتلین

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

جاوا

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 را راه اندازی کنید

قبل از ساختن تست UI خود با UI Automator، مطمئن شوید که مکان کد منبع آزمایش و وابستگی های پروژه خود را پیکربندی کرده اید، همانطور که در پروژه راه اندازی برای AndroidX Test توضیح داده شده است.

در فایل build.gradle ماژول برنامه اندروید خود، باید یک مرجع وابستگی به کتابخانه UI Automator تنظیم کنید:

کاتلین

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

شیار

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

برای بهینه‌سازی تست UI Automator، ابتدا باید اجزای رابط کاربری برنامه مورد نظر را بررسی کرده و مطمئن شوید که در دسترس هستند. این نکات بهینه سازی در دو بخش بعدی توضیح داده شده است.

رابط کاربری دستگاه را بررسی کنید

قبل از طراحی آزمایش خود، اجزای رابط کاربری را که روی دستگاه قابل مشاهده هستند، بررسی کنید. برای اطمینان از اینکه تست‌های UI Automator شما می‌توانند به این مؤلفه‌ها دسترسی داشته باشند، بررسی کنید که این مؤلفه‌ها دارای برچسب‌های نوشتاری قابل مشاهده، مقادیر android:contentDescription یا هر دو باشند.

ابزار uiautomatorviewer یک رابط بصری مناسب برای بررسی سلسله‌مراتب طرح‌بندی و مشاهده ویژگی‌های اجزای UI که در پیش‌زمینه دستگاه قابل مشاهده هستند، فراهم می‌کند. این اطلاعات به شما امکان می دهد با استفاده از UI Automator تست های دقیق تری ایجاد کنید. به عنوان مثال، می توانید یک انتخابگر رابط کاربری ایجاد کنید که با یک ویژگی قابل مشاهده خاص مطابقت داشته باشد.

برای راه اندازی ابزار uiautomatorviewer :

  1. برنامه مورد نظر را روی یک دستگاه فیزیکی راه اندازی کنید.
  2. دستگاه را به دستگاه توسعه خود وصل کنید.
  3. یک پنجره ترمینال را باز کنید و به دایرکتوری <android-sdk>/tools/ بروید.
  4. ابزار را با این دستور اجرا کنید:
 $ uiautomatorviewer

برای مشاهده ویژگی های UI برای برنامه خود:

  1. در رابط uiautomatorviewer ، روی دکمه Device Screenshot کلیک کنید.
  2. ماوس را روی عکس فوری در پانل سمت چپ نگه دارید تا اجزای رابط کاربری شناسایی شده توسط ابزار uiautomatorviewer را ببینید. ویژگی ها در پانل سمت راست پایین و سلسله مراتب چیدمان در پانل سمت راست بالا فهرست شده اند.
  3. در صورت تمایل، روی دکمه Toggle NAF Nodes کلیک کنید تا اجزای UI را ببینید که برای UI Automator قابل دسترسی نیستند. ممکن است فقط اطلاعات محدودی برای این اجزا در دسترس باشد.

برای آشنایی با انواع متداول اجزای رابط کاربری ارائه شده توسط Android، به رابط کاربری مراجعه کنید.

اطمینان حاصل کنید که فعالیت شما در دسترس است

چارچوب تست UI Automator در برنامه‌هایی که ویژگی‌های دسترسی اندروید را پیاده‌سازی کرده‌اند، بهتر عمل می‌کند. وقتی از عناصر رابط کاربری از نوع View یا زیر کلاس View از SDK استفاده می‌کنید، نیازی به پیاده‌سازی پشتیبانی دسترسی ندارید، زیرا این کلاس‌ها قبلاً این کار را برای شما انجام داده‌اند.

با این حال، برخی از برنامه‌ها از عناصر رابط کاربری سفارشی برای ارائه تجربه کاربری غنی‌تر استفاده می‌کنند. چنین عناصری پشتیبانی دسترسی خودکار را ارائه نمی کنند. اگر برنامه شما حاوی نمونه‌هایی از زیرکلاس View است که از SDK نیست، مطمئن شوید که ویژگی‌های دسترس‌پذیری را با تکمیل مراحل زیر به این عناصر اضافه کرده‌اید:

  1. یک کلاس مشخص ایجاد کنید که ExploreByTouchHelper را گسترش دهد.
  2. با فراخوانی setAccessibilityDelegate() یک نمونه از کلاس جدید خود را با یک عنصر UI سفارشی خاص مرتبط کنید.

برای راهنمایی بیشتر در مورد افزودن ویژگی‌های دسترس‌پذیری به عناصر نمای سفارشی، به ساخت نماهای سفارشی قابل دسترسی مراجعه کنید. برای کسب اطلاعات بیشتر درباره بهترین روش‌های عمومی برای دسترسی در Android، به دسترسی بیشتر برنامه‌ها مراجعه کنید.

یک کلاس تست UI Automator ایجاد کنید

کلاس تست UI Automator شما باید مانند کلاس تست JUnit 4 نوشته شود. برای کسب اطلاعات بیشتر در مورد ایجاد کلاس‌های آزمایشی JUnit 4 و استفاده از اظهارات و حاشیه‌نویسی‌های JUnit 4، به ایجاد کلاس تست واحد ابزاری مراجعه کنید.

حاشیه نویسی @RunWith(AndroidJUnit4.class) را در ابتدای تعریف کلاس آزمایشی خود اضافه کنید. همچنین باید کلاس AndroidJUnitRunner را که در AndroidX Test ارائه شده است، به عنوان اجرای آزمایشی پیش فرض خود مشخص کنید. این مرحله با جزئیات بیشتری در تست‌های Run UI Automator روی دستگاه یا شبیه‌ساز توضیح داده شده است.

مدل برنامه نویسی زیر را در کلاس تست UI Automator خود پیاده کنید:

  1. یک شی UiDevice برای دسترسی به دستگاهی که می خواهید آزمایش کنید، با فراخوانی متد getInstance() و ارسال آن به عنوان یک شیء Instrumentation به عنوان آرگومان دریافت کنید.
  2. با فراخوانی متد findObject() یک شی UiObject2 برای دسترسی به یک مؤلفه UI که در دستگاه نمایش داده می شود (مثلاً نمای فعلی در پیش زمینه) دریافت کنید.
  3. با فراخوانی یک متد UiObject2 ، یک تعامل کاربر خاص را برای انجام بر روی آن مؤلفه UI شبیه سازی کنید. برای مثال، scrollUntil() را برای اسکرول و setText() را برای ویرایش یک فیلد متنی فراخوانی کنید. می‌توانید در صورت لزوم، APIهای مراحل 2 و 3 را به طور مکرر فراخوانی کنید تا تعاملات پیچیده‌تر کاربر را که شامل چندین مؤلفه UI یا توالی اقدامات کاربر است، آزمایش کنید.
  4. بررسی کنید که UI وضعیت یا رفتار مورد انتظار را پس از انجام این تعاملات کاربر منعکس کند.

این مراحل با جزئیات بیشتر در بخش های زیر پوشش داده شده است.

دسترسی به اجزای رابط کاربری

شی UiDevice راه اصلی برای دسترسی و دستکاری وضعیت دستگاه است. در آزمایش‌های خود، می‌توانید با روش‌های UiDevice تماس بگیرید تا وضعیت ویژگی‌های مختلف مانند جهت فعلی یا اندازه نمایش را بررسی کنید. آزمایش شما می‌تواند از شی UiDevice برای انجام اقدامات در سطح دستگاه، مانند وادار کردن دستگاه به چرخش خاص، فشار دادن دکمه‌های سخت‌افزاری D-pad، و فشار دادن دکمه‌های Home و Menu استفاده کند.

تمرین خوبی است که آزمایش خود را از صفحه اصلی دستگاه شروع کنید. از صفحه اصلی (یا مکان شروع دیگری که در دستگاه انتخاب کرده اید)، می توانید روش های ارائه شده توسط UI Automator API را برای انتخاب و تعامل با عناصر UI خاص فراخوانی کنید.

قطعه کد زیر نشان می دهد که چگونه آزمایش شما ممکن است نمونه ای از UiDevice را دریافت کند و فشار دادن دکمه Home را شبیه سازی کند:

کاتلین

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

جاوا

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

در مثال، عبارت @SdkSuppress(minSdkVersion = 18) کمک می‌کند تا اطمینان حاصل شود که آزمایش‌ها فقط بر روی دستگاه‌های دارای Android 4.3 (سطح API 18) یا بالاتر اجرا می‌شوند، همانطور که چارچوب UI Automator لازم است.

از متد findObject() برای بازیابی UiObject2 استفاده کنید که نمایانگر نمایی است که با معیارهای انتخابگر مطابقت دارد. می‌توانید در صورت نیاز از نمونه‌های UiObject2 که ایجاد کرده‌اید در بخش‌های دیگر آزمایش برنامه‌تان دوباره استفاده کنید. توجه داشته باشید که چارچوب تست UI Automator هر بار که آزمایش شما از یک نمونه UiObject2 برای کلیک کردن بر روی یک عنصر UI یا پرس و جو از یک ویژگی استفاده می کند، صفحه نمایش فعلی را برای یک مطابقت جستجو می کند.

قطعه زیر نشان می‌دهد که چگونه آزمایش شما می‌تواند نمونه‌های UiObject2 را بسازد که یک دکمه لغو و یک دکمه تأیید را در یک برنامه نشان می‌دهند.

کاتلین

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

جاوا

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

انتخابگر را مشخص کنید

اگر می خواهید به یک مؤلفه رابط کاربری خاص در یک برنامه دسترسی داشته باشید، از کلاس By برای ساختن یک نمونه BySelector استفاده کنید. BySelector یک پرس و جو برای عناصر خاص در رابط کاربری نمایش داده شده را نشان می دهد.

اگر بیش از یک عنصر منطبق پیدا شود، اولین عنصر منطبق در سلسله مراتب طرح به عنوان UiObject2 هدف برگردانده می شود. هنگام ساخت یک BySelector ، می توانید چندین ویژگی را با هم زنجیره بزنید تا جستجوی خود را اصلاح کنید. اگر هیچ عنصر UI منطبقی پیدا نشد، یک null برگردانده می شود.

می‌توانید از متد hasChild() یا hasDescendant() برای قرار دادن چندین نمونه BySelector استفاده کنید. برای مثال، مثال کد زیر نشان می‌دهد که چگونه آزمون شما ممکن است جستجویی را برای یافتن اولین ListView که دارای یک عنصر UI فرزند با ویژگی متن است، مشخص کند.

کاتلین

val listView: UiObject2 = device.findObject(
    By.clazz("android.widget.ListView")
        .hasChild(
            By.text("Apps")
        )
)

جاوا

UiObject2 listView = device.findObject(
    By.clazz("android.widget.ListView")
        .hasChild(
            By.text("Apps")
        )
);

تعیین وضعیت شی در معیارهای انتخابگر می تواند مفید باشد. برای مثال، اگر می‌خواهید فهرستی از تمام عناصر علامت‌گذاری شده را انتخاب کنید تا بتوانید تیک آن‌ها را بردارید، متد checked() با آرگومان تنظیم شده روی true فراخوانی کنید.

اقدامات را انجام دهید

هنگامی که تست شما یک شی UiObject2 به دست آورد، می توانید متدهای کلاس UiObject2 را فراخوانی کنید تا تعاملات کاربر را روی مؤلفه UI نشان داده شده توسط آن شیء انجام دهید. می توانید اقدامات زیر را مشخص کنید:

  • click() : روی مرکز مرزهای قابل مشاهده عنصر UI کلیک می کند.
  • drag() : این شی را به مختصات دلخواه می کشاند.
  • setText() : متن را پس از پاک کردن محتوای فیلد در یک فیلد قابل ویرایش قرار می دهد. برعکس، متد clear() متن موجود را در یک فیلد قابل ویرایش پاک می کند.
  • swipe() : عمل کشیدن انگشت را به سمت جهت مشخص انجام می دهد.
  • scrollUntil() : عمل اسکرول را به سمت جهت مشخص انجام می دهد تا زمانی که Condition یا EventCondition برآورده شود.

چارچوب تست UI Automator به شما این امکان را می دهد که با دریافت یک شی Context از طریق getContext() یک Intent ارسال کنید یا یک Activity را بدون استفاده از دستورات پوسته راه اندازی کنید.

قطعه زیر نشان می دهد که چگونه آزمون شما می تواند از یک Intent برای راه اندازی برنامه تحت آزمایش استفاده کند. این رویکرد زمانی مفید است که شما فقط به آزمایش برنامه ماشین حساب علاقه دارید و به لانچر اهمیتی نمی دهید.

کاتلین

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

جاوا

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

نتایج را تأیید کنید

InstrumentationTestCase TestCase را گسترش می دهد، بنابراین می توانید از روش های استاندارد JUnit Assert برای آزمایش اینکه اجزای رابط کاربری در برنامه نتایج مورد انتظار را برمی گرداند استفاده کنید.

قطعه زیر نشان می دهد که چگونه تست شما می تواند چندین دکمه را در یک برنامه ماشین حساب پیدا کند، به ترتیب روی آنها کلیک کنید، سپس بررسی کنید که نتیجه صحیح نمایش داده شود.

کاتلین

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

جاوا

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 را روی دستگاه یا شبیه ساز اجرا کنید

می‌توانید تست‌های UI Automator را از Android Studio یا از خط فرمان اجرا کنید. مطمئن شوید که AndroidJUnitRunner به عنوان پیش‌فرض ابزار دقیق در پروژه خود مشخص کرده‌اید.

نمونه های بیشتر

با رابط کاربری سیستم تعامل داشته باشید

همانطور که در قطعه کد زیر نشان داده شده است، UI Automator می تواند با همه چیز روی صفحه، از جمله عناصر سیستم خارج از برنامه شما تعامل داشته باشد:

کاتلین

// Opens the System Settings.
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
device.executeShellCommand("am start -a android.settings.SETTINGS")

جاوا

// Opens the System Settings.
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
device.executeShellCommand("am start -a android.settings.SETTINGS");

کاتلین

// Opens the notification shade.
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
device.openNotification()

جاوا

// Opens the notification shade.
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
device.openNotification();

کاتلین

// Opens the Quick Settings shade.
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
device.openQuickSettings()

جاوا

// Opens the Quick Settings shade.
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
device.openQuickSettings();

کاتلین

// Get the system clock.
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
UiObject2 clock = device.findObject(By.res("com.android.systemui:id/clock"))
print(clock.getText())

جاوا

// Get the system clock.
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
UiObject2 clock = device.findObject(By.res("com.android.systemui:id/clock"));
print(clock.getText());

منتظر انتقال ها باشید

اختلال را خاموش کنید
شکل 1. UI Automator حالت Do Not Disturb را در یک دستگاه آزمایشی خاموش می کند.

انتقال صفحه ممکن است زمان ببرد و پیش‌بینی مدت زمان آنها غیرقابل اعتماد است، بنابراین باید UI Automator پس از انجام عملیات منتظر بماند. UI Automator چندین روش را برای این کار ارائه می دهد:

قطعه کد زیر نحوه استفاده از UI Automator را برای خاموش کردن حالت مزاحم نشوید در تنظیمات سیستم با استفاده از متد performActionAndWait() که منتظر انتقال است، نشان می دهد:

کاتلین

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

جاوا

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

منابع اضافی

برای اطلاعات بیشتر در مورد استفاده از UI Automator در تست های اندروید، به منابع زیر مراجعه کنید.

مستندات مرجع:

نمونه ها