UI Automator هو إطار عمل لاختبار واجهة المستخدم يناسب واجهة المستخدم التي تعمل على عدة تطبيقات.
للاختبار عبر النظام والتطبيقات المثبّتة. تتيح لك واجهات UI Automator API التفاعل
يشتمل على عناصر مرئية على الجهاز، بغض النظر عن Activity
الذي يوجد فيه
لكي تتمكّن من إجراء عمليات مثل فتح قائمة "الإعدادات"
أو مشغّل التطبيقات في جهاز اختباري يمكن أن يبحث الاختبار عن مكوِّن في واجهة المستخدم من خلال:
باستخدام وسائل وصف ملائمة مثل النص المعروض في هذا المكوِّن أو
وصف المحتوى.
إطار عمل اختبار UI Automator هو واجهة برمجة تطبيقات تستند إلى الأدوات وتعمل
مع عدّاء اختبار AndroidJUnitRunner
هذا العنوان مناسب جدًا للكتابة
هي اختبارات تلقائية بنمط الصندوق المبهم، حيث لا يعتمد رمز الاختبار على البيانات الداخلية
تفاصيل تنفيذ التطبيق المستهدف.
تشمل الميزات الرئيسية لإطار عمل اختبار UI Automator ما يلي:
- يشير هذا المصطلح إلى واجهة برمجة تطبيقات تتيح استرداد معلومات الحالة وإجراء العمليات على مستوى الهدف. الخاص بك. لمزيد من المعلومات، يمكنك الاطّلاع على الوصول إلى حالة الجهاز.
- واجهات برمجة التطبيقات التي تتيح اختبار واجهة المستخدم على مستوى التطبيقات. لمزيد من المعلومات، راجع واجهة المستخدم واجهات برمجة التطبيقات في Automator:
جارٍ الوصول إلى حالة الجهاز
يوفّر إطار عمل اختبار UI Automator فئة UiDevice
للوصول إليها.
وتنفيذ العمليات على الجهاز الذي يتم تشغيل التطبيق المستهدف عليه. يمكنك
طلب طرقه للوصول إلى خصائص الجهاز مثل الاتجاه الحالي أو
حجم العرض. تتيح لك الفئة UiDevice
أيضًا تنفيذ ما يلي:
الإجراءات:
- يمكنك من هنا تغيير دوران الجهاز.
- اضغط على مفاتيح الأجهزة، مثلاً "رفع الصوت".
- اضغط على أزرار الرجوع أو الصفحة الرئيسية أو القائمة.
- افتح مركز الإشعارات.
- خُذ لقطة شاشة للنافذة الحالية.
على سبيل المثال، لمحاكاة الضغط على زر الشاشة الرئيسية، يمكنك الاتصال بالرقم 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
":
- افتح التطبيق المستهدَف على جهاز فعلي.
- وصِّل الجهاز بجهاز التطوير.
- افتح نافذة طرفية وانتقِل إلى دليل
<android-sdk>/tools/
. - شغِّل الأداة باستخدام الأمر التالي:
$ uiautomatorviewer
لعرض خصائص واجهة المستخدم لتطبيقك:
- في واجهة
uiautomatorviewer
، انقر على الزر لقطة شاشة للجهاز. - مرِّر مؤشر الماوس فوق اللقطة في اللوحة اليمنى للاطّلاع على مكونات واجهة المستخدم.
التي حددتها أداة
uiautomatorviewer
. ويتمّ سرد الخصائص في أقل اللوحة اليمنى والتسلسل الهرمي للتخطيط في اللوحة اليمنى العليا. - اختياريًا، انقر على الزر التبديل بين عُقد NAF للاطّلاع على مكونات واجهة المستخدم. والتي لا يمكن الوصول إليها من خلال UI Automator. قد تكون معلومات محدودة فقط المتاحة لهذه المكونات.
للتعرّف على الأنواع الشائعة لمكونات واجهة المستخدم التي يوفرها Android، راجع قسم واجهة المستخدم الواجهة.
التأكّد من سهولة الوصول إلى نشاطك
يقدم إطار عمل اختبار UI Automator أداءً أفضل على التطبيقات التي تم تنفيذها
ميزات تسهيل الاستخدام في Android. عند استخدام عناصر واجهة المستخدم من النوع View
هي فئة فرعية من View
من حزمة SDK، ولن تحتاج إلى تنفيذ تسهيل الاستخدام
الدعم، حيث أن هذه الصفوف قد قامت بذلك بالفعل.
ومع ذلك، تستخدم بعض التطبيقات عناصر مخصّصة في واجهة المستخدم لتقديم تجربة مستخدم أكثر ثراءً.
ولن تتيح هذه العناصر إمكانية الوصول تلقائيًا. إذا كان تطبيقك
يحتوي على مثيلات من فئة فرعية من View
ليست من حزمة SDK،
من إضافة ميزات إمكانية الوصول إلى هذه العناصر من خلال إكمال
الخطوات التالية:
- أنشئ فئة ملموسة توسّع نطاق ExploreByTouchHelper.
- اربط مثيل الفئة الجديدة بعنصر مخصص لواجهة مستخدم مخصصة من خلال استدعاء setAccessibilityDelegate()
للحصول على إرشادات إضافية حول إضافة ميزات تسهيل الاستخدام إلى طريقة العرض المخصّصة اطلع على إنشاء طرق عرض مخصصة يسهل الوصول إليها. لمزيد من المعلومات حول أفضل الممارسات العامة المتعلقة بإمكانية الوصول على Android، راجع جعل التطبيقات أكثر تسهيل الاستخدام:
إنشاء فئة اختبار UI Automator
يجب كتابة صف اختبار UI Automator بالطريقة نفسها التي تتم بها كتابة اختبار JUnit 4 الصف. لمعرفة المزيد من المعلومات حول إنشاء صفوف اختبار JUnit 4 واستخدام JUnit 4 التأكيدات والتعليقات التوضيحية، يُرجى مراجعة إنشاء صف وحدة اختبارية لقياس الأداء.
إضافة التعليق التوضيحي @RunWith(AndroidJUnit4.class) في بداية الاختبار تعريف الفئة. ستحتاج أيضًا إلى تحديد الفئة AndroidJUnitRunner، المقدمة في اختبار AndroidX، كمشغِّل الاختبار الافتراضي. يتم توضيح هذه الخطوة بمزيد من التفاصيل في مقالة تشغيل اختبارات UI Automator على جهاز أو محاكي.
نفِّذ نموذج البرمجة التالي في فئة اختبار UI Automator:
- يمكنك الحصول على عنصر
UiDevice
للوصول إلى الجهاز الذي تريد اختباره من خلال الاتصال. طريقة getInstance() وتمريره كائن instrumentation باعتباره الوسيطة. - يمكنك الحصول على كائن
UiObject2
للوصول إلى مكوّن واجهة المستخدم المعروض على الجهاز (مثل العرض الحالي في المقدّمة)، من خلال استدعاء findObject(). - يمكنك محاكاة تفاعل مستخدم معين لتنفيذه على مكون واجهة المستخدم هذا، عن طريق
استدعاء طريقة
UiObject2
على سبيل المثال، طلب scrollUntil() للتمرير، وsetText() لتعديل حقل نصي. يمكنك استدعاء واجهات برمجة التطبيقات في الخطوتين 2 و3 بشكل متكرر حسب الضرورة لاختبار تفاعلات المستخدم الأكثر تعقيدًا التي تتضمن العديد من مكونات واجهة المستخدم أو تسلسلات من إجراءات المستخدم. - التحقق من أن واجهة المستخدم تعكس الحالة أو السلوك المتوقع، بعد أن يقوم هؤلاء التفاعلات.
تتناول هذه الخطوات شرحًا أكثر تفصيلاً في الأقسام التالية.
الوصول إلى مكونات واجهة المستخدم
الكائن 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());
انتظار عمليات النقل
يمكن أن تستغرق انتقالات الشاشة بعض الوقت، والتنبؤ بمدتها أمر غير موثوق به، لذا يجب أن تنتظر واجهة المستخدم Automator بعد تنفيذ العمليات. أداة برمجة واجهة المستخدم طرقًا متعددة لإجراء ذلك:
UiDevice.performActionAndWait(Runnable action, EventCondition<U> condition, long timeout)
: على سبيل المثال، للنقر على زر والانتظار حتى تظهر نافذة جديدة، اطلبdevice.performActionAndWait(() -> button.click(), Until.newWindow(), timeout)
UiDevice.wait(Condition<Object, U> condition, long timeout)
: على سبيل المثال، للانتظار إلى حين توفُّرUiObject2
معيّن على الجهاز، يمكنك الاتصال برقمdevice.wait(device.hasObject(By.text("my_text")), timeout);
.UiObject2.wait(@NonNull Condition<Object, U> condition, long timeout)
: على سبيل المثال، للانتظار حتى وضع علامة في مربّع اختيار، اتصل بالرقمcheckbox.wait(Until.checked(true), timeout);
UiObject2.clickAndWait(@NonNull EventCondition<U> condition, long timeout)
: مثلاً للنقر على زر والانتظار حتى ظهور نافذة جديدة، اطلبbutton.clickAndWait(Until.newWindow(), timeout);
.UiObject2.scrollUntil(@NonNull Direction direction, @NonNull Condition<Object, U> condition)
: على سبيل المثال، للانتقال للأسفل حتى يظهر عنصر جديد، يمكنك استدعاءobject.scrollUntil(Direction.DOWN, Until.hasObject(By.text('new_obj')));
UiObject2.scrollUntil(@NonNull Direction direction, @NonNull EventCondition<U> condition)
: على سبيل المثال، للانتقال إلى الأسفل، اطلبobject.scrollUntil(Direction.DOWN, Until.scrollFinished(Direction.DOWN));
يعرض مقتطف الرمز التالي كيفية استخدام 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، يُرجى الرجوع إلى الموارد التالية.
المستندات المرجعية:
نماذج
- BasicSample: نموذج Basic UI Automator