استفاده از میانای برنامه‌سازی کاربردی قدیمی UI Automator

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

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

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

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

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

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

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

برای مثال، برای شبیه‌سازی فشار دادن دکمه «صفحه اصلی»، روش UiDevice.pressHome() را فراخوانی کنید.

UI Automator APIs

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

  • UiObject2: نشان‌دهنده عنصر میانای کاربری است که در دستگاه قابل‌مشاهده است.
  • BySelector: معیارهای مطابقت دادن عناصر میانای کاربر را مشخص می‌کند.
  • 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 Automator، حتماً مکان کد منبع آزمایش و وابستگی‌های پروژه را همان‌طور که در راه‌اندازی پروژه برای AndroidX Test شرح داده شده است پیکربندی کنید.

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

کاتلین

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

شیک

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

برای بهینه‌سازی آزمایش UI Automator، ابتدا باید مؤلفه‌های واسط کاربر برنامه هدف را بازرسی کنید و مطمئن شوید که دردسترس هستند. این نکات بهینه‌سازی در دو بخش بعدی شرح داده شده‌اند.

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

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

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

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

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

برای مشاهده ویژگی‌های میانای کاربری برای برنامه‌تان:

  1. در میانای uiautomatorviewer، روی دکمه نماگرفت دستگاه کلیک کنید.
  2. نشانگر را روی عکس آنی در پانل سمت راست نگه دارید تا مؤلفه‌های میانای کاربر شناسایی‌شده توسط ابزار uiautomatorviewer را ببینید. ویژگی‌ها در پانل پایین سمت راست و سلسله‌مراتب چیدمان در پانل بالا سمت راست فهرست شده‌اند.
  3. اختیاراً، روی دکمه Toggle NAF Nodes (تغییر وضعیت گره‌های NAF) کلیک کنید تا مؤلفه‌های واسط کاربر را که برای UI Automator غیرقابل‌دسترس هستند ببینید. ممکن است فقط اطلاعات محدودی برای این مؤلفه‌ها دردسترس باشد.

برای آشنایی با انواع رایج مؤلفه‌های میانای کاربر که Android ارائه می‌دهد، میانای کاربر را ببینید.

مطمئن شوید فعالیتتان قابل‌دسترسی باشد

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

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

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

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

ایجاد کلاس آزمایشی UI Automator

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

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

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

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

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

دسترسی به مؤلفه‌های واسط کاربر

شیء UiDevice روش اصلی دسترسی و دستکاری وضعیت دستگاه است. در آزمایش‌هایتان، می‌توانید روش‌های UiDevice را برای بررسی وضعیت ویژگی‌های مختلف، مثل جهت فعلی یا اندازه نمایش، فراخوانی کنید. آزمایش شما می‌تواند از شیء UiDevice برای انجام کنش‌های سطح دستگاه استفاده کند، مثلاً مجبور کردن دستگاه به چرخش خاص، فشار دادن دکمه‌های سخت‌افزاری پد کنترل، و فشار دادن دکمه‌های «صفحه اصلی» و «منو».

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

تکه‌کد زیر نشان می‌دهد که چگونه آزمایش شما می‌تواند نمونه‌ای از UiDevice را دریافت کند و فشار دادن دکمه «صفحه اصلی» را شبیه‌سازی کند:

کاتلین

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 نسخه ۴.۳ (سطح API‏ ۱۸) یا بالاتر اجرا می‌شوند، همان‌طور که چارچوب UI Automator لازم دارد.

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

تکه‌کد زیر نشان می‌دهد که چگونه آزمایش شما می‌تواند نمونه‌های 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، می‌توانید چندین ویژگی را به‌هم زنجیر کنید تا جستجویتان را پالایش کنید. اگر عنصر میانای کاربر منطبقی پیدا نشود، null برگردانده می‌شود.

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

کاتلین

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 فراخوانی کنید تا تعاملات کاربر را در مؤلفه واسط کاربر که توسط آن شیء نشان داده شده است انجام دهید. می‌توانید کنش‌هایی مثل موارد زیر را مشخص کنید:

  • click() : روی مرکز مرزهای قابل‌مشاهده عنصر میانای کاربر کلیک می‌کند.
  • ‫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());

انتظار برای گذار

خاموش کردن «مزاحم نشوید»
شکل ۱. UI Automator حالت «مزاحم نشوید» را در دستگاه آزمایشی خاموش می‌کند.

انتقال‌های صفحه می‌تواند زمان‌بر باشد و پیش‌بینی مدت‌زمان آن‌ها قابل‌اعتماد نیست، بنابراین باید 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 در آزمایش‌های Android، به منابع زیر مراجعه کنید.

اسناد مرجع:

نمونه‌ها