كتابة الاختبارات المبرمجة باستخدام واجهة المستخدم التلقائية

UI Automator هو إطار عمل لاختبار واجهة المستخدم يناسب واجهة المستخدم التي تعمل على عدة تطبيقات. للاختبار عبر النظام والتطبيقات المثبّتة. تتيح لك واجهات UI Automator API التفاعل يشتمل على عناصر مرئية على الجهاز، بغض النظر عن Activity الذي يوجد فيه لكي تتمكّن من إجراء عمليات مثل فتح قائمة "الإعدادات" أو مشغّل التطبيقات في جهاز اختباري يمكن أن يبحث الاختبار عن مكوِّن في واجهة المستخدم من خلال: باستخدام وسائل وصف ملائمة مثل النص المعروض في هذا المكوِّن أو وصف المحتوى.

إطار عمل اختبار UI Automator هو واجهة برمجة تطبيقات تستند إلى الأدوات وتعمل مع عدّاء اختبار AndroidJUnitRunner هذا العنوان مناسب جدًا للكتابة هي اختبارات تلقائية بنمط الصندوق المبهم، حيث لا يعتمد رمز الاختبار على البيانات الداخلية تفاصيل تنفيذ التطبيق المستهدف.

تشمل الميزات الرئيسية لإطار عمل اختبار UI Automator ما يلي:

جارٍ الوصول إلى حالة الجهاز

يوفّر إطار عمل اختبار UI Automator فئة UiDevice للوصول إليها. وتنفيذ العمليات على الجهاز الذي يتم تشغيل التطبيق المستهدف عليه. يمكنك طلب طرقه للوصول إلى خصائص الجهاز مثل الاتجاه الحالي أو حجم العرض. تتيح لك الفئة UiDevice أيضًا تنفيذ ما يلي: الإجراءات:

  1. يمكنك من هنا تغيير دوران الجهاز.
  2. اضغط على مفاتيح الأجهزة، مثلاً "رفع الصوت".
  3. اضغط على أزرار الرجوع أو الصفحة الرئيسية أو القائمة.
  4. افتح مركز الإشعارات.
  5. خُذ لقطة شاشة للنافذة الحالية.

على سبيل المثال، لمحاكاة الضغط على زر الشاشة الرئيسية، يمكنك الاتصال بالرقم UiDevice.pressHome(). .

واجهات UI Automator API

تتيح لك واجهات UI Automator API إجراء اختبارات فعّالة بدون الحاجة إلى معرفة حول تفاصيل تنفيذ التطبيق الذي تستهدفه. يمكنك استخدام واجهات برمجة التطبيقات هذه لالتقاط مكونات واجهة المستخدم ومعالجتها في تطبيقات متعددة:

  • UiObject2: يمثل عنصر واجهة مستخدم مرئيًا على الجهاز.
  • BySelector: تحدّد معايير مطابقة عناصر واجهة المستخدم.
  • By: تنشئ BySelector بطريقة موجزة.
  • Configurator: يتيح لك ضبط المَعلمات الرئيسية لتنفيذ اختبارات UI Automator.

على سبيل المثال، توضح التعليمة البرمجية التالية كيف يمكنك كتابة نص برمجي تجريبي فتح تطبيق Gmail على الجهاز:

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

قبل إنشاء اختبار واجهة المستخدم باستخدام UI Automator، احرص على ضبط إعدادات الاختبار موقع رمز المصدر وتبعيات المشروع، كما هو موضّح في إعداد المشروع لاختبار AndroidX.

في الملف build.gradle الخاص بوحدة تطبيق Android، يجب ضبط إعدادات اعتمادية. الرجوع إلى مكتبة UI Automator:

Kotlin

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

Groovy

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

لتحسين اختبار UI Automator، يجب أولاً فحص واجهة برمجة التطبيقات المستهدَفة مكونات واجهة المستخدم والتأكد من إمكانية الوصول إليها. تتضمّن نصائح التحسين هذه الموضحة في القسمين التاليين.

فحص واجهة المستخدم على جهاز

قبل تصميم الاختبار، افحص مكونات واجهة المستخدم التي تظهر على الخاص بك. للتأكّد من إمكانية وصول اختبارات UI Automator إلى هذه المكوّنات، والتحقق من أن هذه المكونات لها تسميات نصية مرئية، android:contentDescription أو كليهما.

توفّر أداة uiautomatorviewer واجهة مرئية سهلة الاستخدام لفحصها التسلسل الهرمي للتخطيط وعرض خصائص مكونات واجهة المستخدم المرئية في مقدّمة الجهاز تتيح لك هذه المعلومات إنشاء المزيد من بالغ الدقة باستخدام UI Automator. على سبيل المثال، يمكنك إنشاء أداة اختيار لواجهة المستخدم. التي تتطابق مع خاصية مرئية محددة

لتشغيل أداة "uiautomatorviewer":

  1. افتح التطبيق المستهدَف على جهاز فعلي.
  2. وصِّل الجهاز بجهاز التطوير.
  3. افتح نافذة طرفية وانتقِل إلى دليل <android-sdk>/tools/.
  4. شغِّل الأداة باستخدام الأمر التالي:
 $ uiautomatorviewer

لعرض خصائص واجهة المستخدم لتطبيقك:

  1. في واجهة uiautomatorviewer، انقر على الزر لقطة شاشة للجهاز.
  2. مرِّر مؤشر الماوس فوق اللقطة في اللوحة اليمنى للاطّلاع على مكونات واجهة المستخدم. التي حددتها أداة uiautomatorviewer. ويتمّ سرد الخصائص في أقل اللوحة اليمنى والتسلسل الهرمي للتخطيط في اللوحة اليمنى العليا.
  3. اختياريًا، انقر على الزر التبديل بين عُقد NAF للاطّلاع على مكونات واجهة المستخدم. والتي لا يمكن الوصول إليها من خلال UI Automator. قد تكون معلومات محدودة فقط المتاحة لهذه المكونات.

للتعرّف على الأنواع الشائعة لمكونات واجهة المستخدم التي يوفرها Android، راجع قسم واجهة المستخدم الواجهة.

التأكّد من سهولة الوصول إلى نشاطك

يقدم إطار عمل اختبار UI Automator أداءً أفضل على التطبيقات التي تم تنفيذها ميزات تسهيل الاستخدام في Android. عند استخدام عناصر واجهة المستخدم من النوع View هي فئة فرعية من View من حزمة SDK، ولن تحتاج إلى تنفيذ تسهيل الاستخدام الدعم، حيث أن هذه الصفوف قد قامت بذلك بالفعل.

ومع ذلك، تستخدم بعض التطبيقات عناصر مخصّصة في واجهة المستخدم لتقديم تجربة مستخدم أكثر ثراءً. ولن تتيح هذه العناصر إمكانية الوصول تلقائيًا. إذا كان تطبيقك يحتوي على مثيلات من فئة فرعية من View ليست من حزمة SDK، من إضافة ميزات إمكانية الوصول إلى هذه العناصر من خلال إكمال الخطوات التالية:

  1. أنشئ فئة ملموسة توسّع نطاق ExploreByTouchHelper.
  2. اربط مثيل الفئة الجديدة بعنصر مخصص لواجهة مستخدم مخصصة من خلال استدعاء setAccessibilityDelegate()

للحصول على إرشادات إضافية حول إضافة ميزات تسهيل الاستخدام إلى طريقة العرض المخصّصة اطلع على إنشاء طرق عرض مخصصة يسهل الوصول إليها. لمزيد من المعلومات حول أفضل الممارسات العامة المتعلقة بإمكانية الوصول على Android، راجع جعل التطبيقات أكثر تسهيل الاستخدام:

إنشاء فئة اختبار UI Automator

يجب كتابة صف اختبار UI Automator بالطريقة نفسها التي تتم بها كتابة اختبار JUnit 4 الصف. لمعرفة المزيد من المعلومات حول إنشاء صفوف اختبار JUnit 4 واستخدام JUnit 4 التأكيدات والتعليقات التوضيحية، يُرجى مراجعة إنشاء صف وحدة اختبارية لقياس الأداء.

إضافة التعليق التوضيحي @RunWith(AndroidJUnit4.class) في بداية الاختبار تعريف الفئة. ستحتاج أيضًا إلى تحديد الفئة AndroidJUnitRunner، المقدمة في اختبار AndroidX، كمشغِّل الاختبار الافتراضي. يتم توضيح هذه الخطوة بمزيد من التفاصيل في مقالة تشغيل اختبارات UI Automator على جهاز أو محاكي.

نفِّذ نموذج البرمجة التالي في فئة اختبار UI Automator:

  1. يمكنك الحصول على عنصر UiDevice للوصول إلى الجهاز الذي تريد اختباره من خلال الاتصال. طريقة getInstance() وتمريره كائن instrumentation باعتباره الوسيطة.
  2. يمكنك الحصول على كائن UiObject2 للوصول إلى مكوّن واجهة المستخدم المعروض على الجهاز (مثل العرض الحالي في المقدّمة)، من خلال استدعاء findObject().
  3. يمكنك محاكاة تفاعل مستخدم معين لتنفيذه على مكون واجهة المستخدم هذا، عن طريق استدعاء طريقة UiObject2 على سبيل المثال، طلب scrollUntil() للتمرير، وsetText() لتعديل حقل نصي. يمكنك استدعاء واجهات برمجة التطبيقات في الخطوتين 2 و3 بشكل متكرر حسب الضرورة لاختبار تفاعلات المستخدم الأكثر تعقيدًا التي تتضمن العديد من مكونات واجهة المستخدم أو تسلسلات من إجراءات المستخدم.
  4. التحقق من أن واجهة المستخدم تعكس الحالة أو السلوك المتوقع، بعد أن يقوم هؤلاء التفاعلات.

تتناول هذه الخطوات شرحًا أكثر تفصيلاً في الأقسام التالية.

الوصول إلى مكونات واجهة المستخدم

الكائن UiDevice هو الطريقة الأساسية التي يمكنك من خلالها الوصول إلى حالة الجهاز. في اختباراتك، يمكنك استدعاء UiDevice طريقة للتحقق من حالة الخصائص المختلفة، مثل الاتجاه الحالي أو حجم العرض. يمكن أن يستخدِم اختبارك عنصر UiDevice لتنفيذ الإجراءات على مستوى الجهاز، مثل دفع الجهاز إلى دوران معين، والضغط على جهاز لوحة التحكّم والضغط على زر الصفحة الرئيسية وزر القائمة.

يفضَّل أن تبدأ الاختبار من الشاشة الرئيسية للجهاز. مِن الشاشة الرئيسية (أو موقع بداية آخر اخترته في الجهاز) يمكنك استدعاء الطرق التي توفرها واجهة UI Automator API لتحديد التفاعل مع عناصر محددة لواجهة المستخدم.

يوضح مقتطف الرمز التالي كيف يمكن أن يحصل اختبارك على مثيل UiDevice ومحاكاة الضغط على زر الشاشة الرئيسية:

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

في المثال، تساعد العبارة @SdkSuppress(minSdkVersion = 18) على ضمان ألّا يتم إجراء الاختبارات إلا على الأجهزة التي تعمل بالإصدار Android 4.3 (المستوى 18 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث على النحو المطلوب في إطار عمل UI Automator

يمكنك استخدام الطريقة findObject() لاسترداد UiObject2 الذي يمثل ملف شخصي يتطابق مع معايير أداة اختيار معيّنة. ويمكنك إعادة استخدام "UiObject2". التي أنشأتها في أجزاء أخرى من اختبار تطبيقك، حسب الحاجة. يُرجى العلم أنّ إطار عمل اختبار UI Automator يبحث في الشاشة الحالية عن مطابقة في كل مرة يستخدم فيها الاختبار مثيل UiObject2 للنقر على واجهة مستخدم العنصر أو الاستعلام عن خاصية ما.

يوضّح المقتطف التالي كيفية إنشاء اختبارك للسمة UiObject2 التي تمثل زر "Cancel" (إلغاء) وزر "OK" (حسنًا) في أحد التطبيقات.

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

تحديد أداة اختيار

إذا كنت تريد الوصول إلى مكون معين لواجهة المستخدم في أحد التطبيقات، فاستخدم By لإنشاء مثيل BySelector. BySelector استعلامًا عن عناصر محددة في واجهة المستخدم المعروضة.

إذا تم العثور على أكثر من عنصر مطابق، فإن العنصر المطابق الأول في يتم عرض التدرّج الهرمي للتصميم على أنّه UiObject2 الهدف. عند إنشاء BySelector، يمكنك ربط مواقع متعدّدة معًا لتحسين بحث. في حال عدم العثور على عنصر مطابق في واجهة المستخدم، سيتم عرض null.

يمكنك استخدام طريقة hasChild() أو hasDescendant() لدمج عدة مثيلات BySelector. على سبيل المثال، يوضح مثال الرمز التالي كيف يمكن أن يحدد اختبارك عملية بحث للعثور على أول ListView يحتوي على عنصر واجهة مستخدم فرعي بخاصية النص.

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

قد يكون من المفيد تحديد حالة العنصر في معايير أداة الاختيار. بالنسبة على سبيل المثال، إذا كنت تريد تحديد قائمة بجميع العناصر المحددة بحيث يمكنك أزِل العلامة من المربّع، واستدعِ الطريقة checked() مع ضبط الوسيطة على "صحيح".

تنفيذ الإجراءات

بعد حصول الاختبار على كائن UiObject2، يمكنك استدعاء الطرق في فئة UiObject2 لإجراء تفاعلات المستخدمين على مكوّن واجهة المستخدم يمثلها ذلك الكائن. يمكنك تحديد إجراءات مثل:

  • click() : يؤدي النقر على هذا الزر إلى النقر على وسط الحدود المرئية لعنصر واجهة المستخدم.
  • drag() : سحب هذا الكائن إلى إحداثيات عشوائية
  • setText() : لضبط النص في حقل قابل للتعديل بعد محو الحقل بشكل أفضل. في المقابل، تمحو طريقة clear() النص الحالي. في حقل قابل للتعديل.
  • swipe() : لتنفيذ إجراء التمرير السريع نحو الاتجاه المحدّد.
  • scrollUntil(): لتنفيذ إجراء الانتقال للأعلى أو للأسفل في الاتجاه المحدّد إلى أن يكتمل Condition أو EventCondition.

يتيح لك إطار عمل اختبار UI Automator إرسال Intent أو بدء نشاط بدون استخدام أوامر واجهة الأوامر، من خلال الحصول على سياق من خلال getContext().

يوضح المقتطف التالي كيف يمكن أن يستخدم اختبارك نية Intent لإطلاق اختبار تطبيقك. تكون هذه الطريقة مفيدة عندما تكون مهتمًا فقط بالاختبار. تطبيق الآلة الحاسبة ولا تهتم بالمشغل.

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

التحقق من النتائج

يمتد instrumentationTestCase إلى نطاق TestCase، بحيث يمكنك استخدام معايير JUnit التأكيد لاختبار أن مكونات واجهة المستخدم في التطبيق تعرض النتائج المتوقعة.

يوضح المقتطف التالي كيف يمكن للاختبار العثور على عدة أزرار في للآلة الحاسبة، انقر عليها بالترتيب، ثم تحقق من أن النتيجة الصحيحة المعروضة.

Kotlin


private const val CALC_PACKAGE = "com.myexample.calc"

fun testTwoPlusThreeEqualsFive() {
  // Enter an equation: 2 + 3 = ?
  device.findObject(By.res(CALC_PACKAGE, "two")).click()
  device.findObject(By.res(CALC_PACKAGE, "plus")).click()
  device.findObject(By.res(CALC_PACKAGE, "three")).click()
  device.findObject(By.res(CALC_PACKAGE, "equals")).click()

  // Verify the result = 5
  val result: UiObject2 = device.findObject(By.res(CALC_PACKAGE, "result"))
  assertEquals("5", result.text)
}

Java


private static final String CALC_PACKAGE = "com.myexample.calc";

public void testTwoPlusThreeEqualsFive() {
  // Enter an equation: 2 + 3 = ?
  device.findObject(By.res(CALC_PACKAGE, "two")).click();
  device.findObject(By.res(CALC_PACKAGE, "plus")).click();
  device.findObject(By.res(CALC_PACKAGE, "three")).click();
  device.findObject(By.res(CALC_PACKAGE, "equals")).click();

  // Verify the result = 5
  UiObject2 result = device.findObject(By.res(CALC_PACKAGE, "result"));
  assertEquals("5", result.getText());
}

أجرِ اختبارات UI Automator على جهاز أو محاكي

يمكنك إجراء اختبارات UI Automator من استوديو Android أو من سطر الأوامر. تأكَّد من تحديد AndroidJUnitRunner كإعداد تلقائي. الأدوات في مشروعك.

مزيد من الأمثلة

التفاعل مع واجهة مستخدم النظام

يمكن لواجهة UI Automator التفاعل مع جميع العناصر على الشاشة، بما في ذلك النظام من خارج تطبيقك، كما هو موضّح في مقتطفات الرمز التالية:

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

انتظار عمليات النقل

إيقاف الإزعاج
الشكل 1. أداة UI Automator توقِف وضع "عدم الإزعاج" على جهاز اختباري.

يمكن أن تستغرق انتقالات الشاشة بعض الوقت، والتنبؤ بمدتها أمر غير موثوق به، لذا يجب أن تنتظر واجهة المستخدم Automator بعد تنفيذ العمليات. أداة برمجة واجهة المستخدم طرقًا متعددة لإجراء ذلك:

يعرض مقتطف الرمز التالي كيفية استخدام UI Automator لإيقاف ميزة Do Not وضع الإزعاج في إعدادات النظام باستخدام طريقة performActionAndWait() التي تنتظر الانتقالات:

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

مصادر إضافية

لمزيد من المعلومات عن استخدام UI Automator في اختبارات Android، يُرجى الرجوع إلى الموارد التالية.

المستندات المرجعية:

نماذج