قرد

توفّر أداة monkeyrunner القديمة واجهة برمجة تطبيقات لكتابة البرامج التي تتحكّم في جهاز Android أو محاكي من خارج رمز Android.

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

تحذير: لا تخضع واجهة برمجة التطبيقات monkeyrunner للصيانة. ننصح باستخدام أداة زاحف التطبيقات أو إطار عمل الاختبار واجهة المستخدم التلقائية بدلاً من ذلك.

لا ترتبط أداة monkeyrunner بواجهة المستخدم/مجموعة بيانات تمارين التطبيق، المعروفة أيضًا باسم أداة monkey. يتم تشغيل أداة monkey في واجهة adb مباشرةً على الجهاز أو المحاكي وتنشئ مجموعات بث عشوائية عشوائية لأحداث المستخدم والنظام. في المقابل، تتحكّم أداة monkeyrunner في الأجهزة وأجهزة المحاكاة من محطة العمل من خلال إرسال أوامر وأحداث محدّدة من واجهة برمجة تطبيقات.

توفّر أداة monkeyrunner الميزات التالية لاختبار Android:

  • التحكّم في الأجهزة المتعدّدة: يمكن لواجهة برمجة التطبيقات monkeyrunner تطبيق مجموعة اختبار واحدة أو أكثر على أجهزة أو أدوات محاكاة متعددة. يمكنك إرفاق جميع الأجهزة أو بدء تشغيل جميع أدوات المحاكاة (أو كليهما) دفعة واحدة، والربط بكل جهاز بدوره آليًا، ثم إجراء اختبار واحد أو أكثر. يمكنك أيضًا بدء إعداد المحاكي بشكل آلي وإجراء اختبار واحد أو أكثر ثم إيقاف المحاكي.
  • الاختبار الوظيفي: بإمكان "monkeyrunner" إجراء اختبار مبرمَج من البداية إلى النهاية لتطبيق Android. ويمكنك تقديم قيم الإدخال من خلال ضغطات المفاتيح أو أحداث اللمس وعرض النتائج على شكل لقطات شاشة.
  • اختبار الانحدار: يمكن لأداة monkeyrunner اختبار ثبات التطبيق من خلال تشغيل أحد التطبيقات ومقارنة لقطات الشاشة التي تم إخراجه بمجموعة من لقطات الشاشة المعروف أنّها صحيحة.
  • التشغيل الآلي القابل للامتداد: بما أنّ monkeyrunner هي مجموعة أدوات لواجهة برمجة التطبيقات، يمكنك تطوير نظام من الوحدات والبرامج المستندة إلى Python للتحكّم في أجهزة Android. بالإضافة إلى استخدام واجهة برمجة تطبيقات monkeyrunner نفسها، يمكنك استخدام وحدتَي Python os وsubprocess العادية لطلب أدوات Android، مثل Android Debug Bridge.

    يمكنك أيضًا إضافة صفوفك الخاصة إلى واجهة برمجة التطبيقات monkeyrunner API. ويمكن الاطّلاع على مزيد من التفاصيل في القسم Extend monkeyrunner باستخدام المكونات الإضافية.

تستخدم أداة monkeyrunner Jython، وهو تنفيذ للغة Python تستخدم لغة برمجة Java. تتيح لغة Jython لواجهة برمجة التطبيقات monkeyrunner إمكانية التفاعل بسهولة مع إطار عمل Android. مع Jython، يمكنك استخدام بنية Python للوصول إلى الثوابت والفئات والطرق الخاصة بواجهة برمجة التطبيقات.

برنامج بسيط لأطفالك

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

# Imports the monkeyrunner modules used by this program.
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device, returning a MonkeyDevice object.
device = MonkeyRunner.waitForConnection()

# Installs the Android package. Notice that this method returns a boolean, so you can test
# whether the installation worked.
device.installPackage('myproject/bin/MyApplication.apk')

# Sets a variable with the package's internal name.
package = 'com.example.android.myapplication'

# Sets a variable with the name of an Activity in the package.
activity = 'com.example.android.myapplication.MainActivity'

# Sets the name of the component to start.
runComponent = package + '/' + activity

# Runs the component.
device.startActivity(component=runComponent)

# Presses the Menu button.
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)

# Takes a screenshot.
result = device.takeSnapshot()

# Writes the screenshot to a file.
result.writeToFile('myproject/shot1.png','png')

واجهة برمجة التطبيقات cloudrunner

تتوفّر واجهة برمجة التطبيقات monkeyrunner في ثلاث وحدات في حزمة com.android.monkeyrunner:

  • MonkeyRunner: فئة من الطرق المساعدة لبرامج monkeyrunner. وتوفّر هذه الفئة طريقة لربط monkeyrunner بجهاز أو محاكي. وتوفّر أيضًا طرقًا لإنشاء واجهات المستخدم لبرنامج monkeyrunner وعرض المساعدة المضمَّنة.
  • MonkeyDevice: يمثل جهازًا أو محاكيًا. توفّر هذه الفئة طرقًا لتثبيت الحِزم وإلغاء تثبيتها وبدء نشاط وإرسال أحداث لوحة المفاتيح أو اللمس إلى أحد التطبيقات. ويمكنك أيضًا استخدام هذه الفئة لتشغيل حِزم الاختبار.
  • MonkeyImage: يمثّل صورة لقطة شاشة. توفّر هذه الفئة طرقًا لالتقاط الشاشات، وتحويل الصور النقطية إلى تنسيقات مختلفة، والمقارنة بين كائن MonkeyImage، وكتابة صورة في ملف.

في برنامج بايثون، يمكنك الوصول إلى كل فئة كوحدة في لغة بايثون. ولا تستورد أداة monkeyrunner هذه الوحدات تلقائيًا. لاستيراد وحدة، استخدِم عبارة from في Python:

from com.android.monkeyrunner import <module>

حيث يكون <module> هو اسم الصف الذي تريد استيراده. يمكنك استيراد أكثر من وحدة واحدة في عبارة from نفسها من خلال فصل أسماء الوحدات بفواصل.

اركض شمسيًا

يمكنك تشغيل برامج monkeyrunner إما من ملف أو عن طريق إدخال عبارات monkeyrunner في جلسة تفاعلية. يمكنك تنفيذ كلا الإجراءين من خلال استدعاء الأمر monkeyrunner الذي يمكن العثور عليه في الدليل الفرعي tools/ في دليل حزمة تطوير البرامج (SDK). في حال تقديم اسم ملف كوسيطة، يبدأ الأمر monkeyrunner محتوى الملف كبرنامج في Python، وإلا فإنّه يبدأ جلسة تفاعلية.

في ما يلي صيغة الأمر monkeyrunner:

monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>

يوضح الجدول 1 العلامات والوسيطات monkeyrunner.

الجدول 1. monkeyrunner علامة ووسيطة

الوسيطة الوصف
-plugin <plugin_jar> (اختياري) تحدِّد هذه العلامة ملف JAR الذي يحتوي على مكوّن إضافي لـ monkeyrunner. لمزيد من المعلومات حول مكوّنات monkeyrunner الإضافية، يُرجى الاطّلاع على القسم Extend monkeyrunner باستخدام المكوّنات الإضافية. لتحديد أكثر من ملف واحد، يمكنك تضمين الوسيطة عدة مرات.
<program_filename> في حال تقديم هذه الوسيطة، يبدأ الأمر monkeyrunner بتشغيل محتوى الملف كبرنامج Python. بخلاف ذلك، يبدأ الأمر جلسة تفاعلية.
<program_options> (اختياري) العلامات والوسيطات للبرنامج في <program_file>.

المساعدة المضمنة

يمكنك إنشاء مرجع واجهة برمجة التطبيقات لـ monkeyrunner عن طريق تشغيل:

monkeyrunner help.py <format> <outfile>

الوسيطات هي:

  • <format> يمكن استخدامها مع text لإخراج النص العادي أو html لإخراج HTML.
  • <outfile> هو اسم مؤهل لمسار لملف الإخراج.

توسيع نطاق البرامج الضارة باستخدام مكونات إضافية

يمكنك توسيع واجهة برمجة تطبيقات monkeyrunner باستخدام الصفوف التي تكتبها بلغة Java وتضمينها في ملف JAR واحد أو أكثر. ويمكنك استخدام هذه الميزة لتوسيع واجهة برمجة التطبيقات monkeyrunner لتشمل صفوفك الخاصة أو لتوسيع نطاق الصفوف الحالية. ويمكنك أيضًا استخدام هذه الميزة لإعداد بيئة monkeyrunner.

لتوفير مكوِّن إضافي لـ monkeyrunner، يمكنك استدعاء الأمر monkeyrunner باستخدام الوسيطة -plugin <plugin_jar> الموضّحة في الجدول 1.

في رمز المكوّن الإضافي، يمكنك استيراد فئات monkeyrunner الرئيسية، وهي MonkeyDevice وMonkeyImage وMonkeyRunner، وتوسيع نطاقها في com.android.monkeyrunner (يمكنك الاطّلاع على القسم الذي يتناول واجهة برمجة التطبيقات monkeyrunner).

تجدر الإشارة إلى أنّ المكوّنات الإضافية لا تتيح لك الوصول إلى حزمة تطوير البرامج (SDK) لنظام التشغيل Android. لا يمكنك استيراد حِزم مثل com.android.app. ويرجع ذلك إلى أنّ monkeyrunner تتفاعل مع الجهاز أو المحاكاة أدنى مستوى واجهات برمجة التطبيقات لإطار العمل.

فئة بدء تشغيل المكوِّن الإضافي

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

<jar jarfile="myplugin" basedir="${build.dir}">
<manifest>
<attribute name="MonkeyRunnerStartupRunner" value="com.myapp.myplugin"/>
</manifest>
</jar>


للوصول إلى بيئة وقت تشغيل أداة monkeyrunner، يمكن لفئة بدء التشغيل تنفيذ com.google.common.base.Predicate<PythonInterpreter>. على سبيل المثال، تقوم هذه الفئة بإعداد بعض المتغيّرات في مساحة الاسم التلقائية:

Kotlin

package com.android.example

import com.google.common.base.Predicate
import org.python.util.PythonInterpreter

class Main: Predicate<PythonInterpreter> {

    override fun apply(anInterpreter: PythonInterpreter): Boolean {
        /*
         * Examples of creating and initializing variables in the monkeyrunner environment's
         * namespace. During execution, the monkeyrunner program can refer to the variables
         * "newtest" and "use_emulator"
         *
         */
        anInterpreter.set("newtest", "enabled")
        anInterpreter.set("use_emulator", 1)
        return true
    }
}

Java

package com.android.example;

import com.google.common.base.Predicate;
import org.python.util.PythonInterpreter;

public class Main implements Predicate<PythonInterpreter> {
    @Override
    public boolean apply(PythonInterpreter anInterpreter) {

        /*
        * Examples of creating and initializing variables in the monkeyrunner environment's
        * namespace. During execution, the monkeyrunner program can refer to the variables "newtest"
        * and "use_emulator"
        *
        */
        anInterpreter.set("newtest", "enabled");
        anInterpreter.set("use_emulator", 1);

        return true;
    }
}