ÔÚAndroid 4.1·¢²¼µÄʱºò°üº¬ÁËÒ»ÖÖеIJâÊÔ¹¤¾ß¨Cuiautomator£¬uiautomatorÊÇÓÃÀ´×öUI²âÊԵġ£Ò²¾ÍÊÇÆÕͨµÄÊÖ¹¤²âÊÔ£¬µã»÷ÿ¸ö¿Ø¼þÔªËØ
¿´¿´Êä³öµÄ½á¹ûÊÇ·ñ·ûºÏÔ¤ÆÚ¡£±ÈÈç µÇ½½çÃæ ·Ö±ðÊäÈëÕýÈ·ºÍ´íÎóµÄÓû§ÃûÃÜÂëÈ»ºóµã»÷µÇ½°´Å¥¿´¿´ÊÇ·ñÄÜ·ñµÇ½ÒÔ¼°ÊÇ·ñÓдíÎóÌáʾµÈ¡£
¹¦ÄÜÐÔ»òÕߺںÐUI²âÊÔ²»ÐèÒª²âÊÔÈËÔ±Á˽â³ÌÐòÈçºÎʵÏֵģ¬Ö»ÐèÒªÑéÖ¤¸÷ÖÖ²Ù×÷µÄ½á¹ûÊÇ·ñ·ûºÏÔ¤ÆÚ¼´¿É¡£ÕâÑùµÄ²âÊÔ¿ÉÒÔ·ÖÀëÍŶӵĿª·¢ÈËÔ±ºÍ²âÊÔÈËÔ±¡£´ó¼Ò¸÷¸É¸÷µÄûÓÐÌ«¶àµÄ½»¼¯¡£
³£ÓõÄUI²âÊÔ·½Ê½¾ÍÊÇÈ˹¤ÑéÖ¤À²£¬¾ÍÊDzâÊÔÈËÔ±ÄÃן÷ÖÖÊÖ»ú·Ö±ð°²×°Òª²âÊԵijÌÐòÈ»ºó¿´¿´ÊÇ·ñÄÜÕýÈ·Íê³É¸÷ÖÖÔ¤¶¨µÄ¹¦ÄÜ¡£µ«ÊÇÕâÖÖÑéÖ¤·½Ê½ÊǷdz£ºÄʱ¼äµÄ£¬Ã¿´Î»Ø¹é¶¼ÒªÈ«²¿ÑéÖ¤Ò»±ß£¬²¢ÇÒ»¹ÈÝÒ׳öÏÖÈËΪ´íÎ󡣱ȽϸßЧºÍ¿É¿¿µÄUI²âÊÔ·½Ê½¾ÍÊÇ×Ô¶¯»¯²âÊÔ¡£×Ô¶¯»¯UI²âÊÔ´´½¨²âÊÔ´úÂëÀ´Ö´ÐвâÊÔÈÎÎñ£¬¸÷ÖÖ²âÊÔÈÎÎñ·Ö±ð¸²¸Ç²»Í¬µÄʹÓó¡¾°£¬È»ºóʹÓòâÊÔ¿ò¼ÜÀ´ÔËÐÐÕâЩ²âÊÔÈÎÎñ¡£
uiautomator ¾ÍÊÇÄãµÄ×Ô¶¯»¯UI²âÊÔ¹¤¾ß¡£
¸ÅÊö
Android SDKÔÚ4.1ÖÐÌṩÁËÈçϹ¤¾ßÀ´Ö§³ÖUI×Ô¶¯»¯²âÊÔ£º
uiautomatorviewer ¨C Ò»¸öͼÐνçÃæ¹¤¾ßÀ´É¨ÃèºÍ·ÖÎöÓ¦ÓõÄUI¿Ø¼þ¡£
uiautomator ¨C Ò»¸ö²âÊÔµÄJava¿â£¬°üº¬ÁË´´½¨UI²âÊԵĸ÷ÖÖAPIºÍÖ´ÐÐ×Ô¶¯»¯²âÊÔµÄÒýÇæ¡£
ҪʹÓøù¤¾ß£¬ÐèÒªÂú×ãÈçÏÂÌõ¼þ£º
Android SDK Tools, Revision 21 or higher
Android SDK Platform, API 16 or higher
uiautomator ²âÊÔ¹¤¾ßµÄ¹¤×÷Á÷³Ì
ÏÂÃæÊÇuiautomator ¹¤×÷Á÷³Ì¸ÅÊö£º
°²×°Òª²âÊÔµÄÓ¦Óõ½ÊÖ»úÖУ¬·ÖÎöÓ¦ÓõÄUI½çÃæÔªËØ ²¢È·±£±»²âÊÔÓ¦Óõĸ÷¸ö¿Ø¼þ¿ÉÒÔ±»²âÊÔ¹¤¾ß»ñÈ¡µ½¡£
´´½¨ÖªµÀ²âÊÔ°¸ÀýÀ´Ä£ÄâÓ¦ÓÃÖеÄÓû§²Ù×÷²½Öè¡£
±àÒë²âÊÔ°¸Àý´úÂëΪJar°ü²¢¸´ÖƸÃJar°üµ½°²×°ÁË´ý²âÓ¦ÓõIJâÊÔÊÖ»úÖС£
ÔËÐвâÊÔ²¢²é¿´½á¹û
ÐÞ¸ÄÈκη¢ÏÖµÄbug£¬È»ºóÐÞ¸´²¢ÖØÐ²âÊÔ¡£
·ÖÎö´ý²âÓ¦ÓõÄUIÔªËØ
ÔÚ¿ªÊ¼±àд²âÊÔ°¸Àý´úÂë֮ǰ£¬ÐèÒªÊìϤ´ý²âÓ¦ÓõÄUIÔªËØ¡£¿ÉÒÔͨ¹ýuiautomatorviewer
¹¤¾ßÀ´»ñȡӦÓõĽçÃæ½ØÍ¼²¢·ÖÎö¡£uiautomatorviewer ¹¤¾ßÌṩÁËÒ»¸ö±ãÀûµÄ·½Ê½À´²é¿´UI²¼¾Ö½á¹¹£¬²¢ÇÒ¿ÉÒԲ鿴¸÷¸ö¿Ø¼þµÄÏà¹ØÊôÐÔ¡£ÀûÓÃÕâЩÐÅÏ¢¿ÉÒÔÓÃÀ´´´½¨UI²âÊÔ´úÂë¡£

·ÖÎö´ý²âÓ¦ÓÃUI½çÃæµÄ²½ÖèÈçÏ£º
1. °ÑAndroidÊÖ»úÁ¬½Óµ½µçÄÔÉÏ
2. ´ò¿ªÃüÁîÐд°¿Ú²¢µ¼º½µ½Ä¿Â¼ /tools/
ÔËÐÐÈçÏÂÃüÁ$ uiautomatorviewer
windowsÏÂÔËÐÐ uiautomatorviewer.bat ÃüÁî
3. µã»÷uiautomatorviewer ¹¤¾ßÓÒÉϽÇÎļþ¼Ð°´Å¥ÅԱߵġ°Device
Screenshot¡±°´Å¥À´»ñÈ¡µ±Ç° ÆÁÄ»½çÃæÐÅÏ¢¡£
×¢Ò⣺Èç¹ûµ±Ç°µçÄÔÁ¬½ÓÁ˶à¸öÉ豸£¬Í¨¹ýÉèÖÃANDROID_SERIAL»·¾³±äÁ¿À´Ö¸¶¨Òª·ÖÎöµÄÉ豸¡£²½ÖèÈçÏ£º
a.ÔËÐÐÈçÏÂÃüÁî»ñÈ¡Á¬½Óµ½µçÄÔµÄÉ豸ÐòÁкÅ
$ adb devices
b.ÉèÖÃANDROID_SERIALΪÐèÒª²âÊÔµÄÉ豸ÐòÁкÅ
Windows£ºset ANDROID_SERIAL=
Unix£º export ANDROID_SERIAL=
Èç¹ûµçÄÔÖ»Á¬½ÓÒ»¸öÉ豸ÔòÎÞÐèÉèÖÃANDROID_SERIAL »·¾³±äÁ¿¡£
4. ²é¿´´ý²âÓ¦ÓõÄUI½çÃæÔªËØÊôÐÔ
°ÑÊó±ê·Åµ½uiautomatorviewer¹¤¾ß×ó±ßµÄ½ØÍ¼ÖеĿؼþÉÏÀ´²é¿´¸Ã¿Ø¼þµÄÊôÐÔ¡£ÊôÐÔÏÔʾÔÚÓÒ²à½çÃæÏ·½£¬ÉÏ·½ÏÔʾµ±Ç°½çÃæµÄ²¼¾Ö½á¹¹¡£
µã»÷ÓÒ²àÉÏ·½µÄ»ÆÈý½Ç°´Å¥£¨Toggle NAF Nodes£©À´²é¿´²»Äܱ»uiautomator²âÊÔ¹¤¾ß·ÃÎʵ½µÄ¿Ø¼þ¡£ÕâЩ¿Ø¼þÖ»ÉèÖÃÁËÓÐÏÞµÄÊôÐÔ£¬ËùÒÔµ¼ÖÂuiautomatorÎÞ·¨»ñÈ¡µ½ÕâЩ¿Ø¼þ¡£ËùÒÔÄã¿ÉÄܺÜÄѲâÊÔÕâЩ¿Ø¼þ¡£ÕâÖÖÇé¿öÏÂÄã¿ÉÒÔÒªÇ󿪷¢ÕßΪÕâЩ¿Ø¼þÌí¼Ó±ØÒªµÄÊôÐÔ£¬±ÈÈç
Èç¹ûÊÇImageView»òÕßImageButtonÓ¦¸ÃÌí¼Óandroid:contentDescriptionÊôÐÔ¡£
²âÊÔ×¼±¸¹¤×÷
ÔÚ¿ªÊ¼Ê¹ÓÃuiautomator ֮ǰÐèÒªÍê³ÉÈçÏÂ×¼±¸¹¤×÷£º
1.°Ñ´ý²âÓ¦Óð²×°µ½²âÊÔÊÖ»ú(É豸)ÉÏ
µ±Äã×¼±¸²âÊÔµÄʱºò£¬´ý²âµÄÓ¦ÓÿÉÄÜ»¹Ã»Óз¢²¼µ½Êг¡ÉÏ¡£µ«ÊÇÄãÓ¦¸Ã¾ßÓиÃÓ¦ÓõÄAPK°²×°Îļþ£¬Äã¿ÉÒÔͨ¹ýADB¹¤¾ßÀ´°²×°´ý²âÓ¦Óõ½ÊÖ»úÖУ¬»òÕßͨ¹ýÆäËû¹¤¾ßÀ´°²×°Apk¡£
2.±æ±ð´ý²âÓ¦ÓÃUI¿Ø¼þ
ÔÚ¿ªÊ¼±àдuiautomator²âÊÔ´úÂë֮ǰ£¬ÐèÒªÏȱæ±ð´ý²âÓ¦ÓõÄUI¿Ø¼þÔªËØ¡£Ò»°ã¶øÑÔ£¬ÓÅÐãµÄ´ý²âÓ¦ÓõÄUIÔªËØÓ¦¸ÃÊǿɼûµÄ²¢ÇÒÓû§¿ÉÒÔ²Ù×÷µÄ¡£ÕâЩUIÔªËØÒ²Ó¦¸Ã¾ßÓпɼûµÄÎı¾±êÇ©¡¢android:contentDescriptionÖµ»òÕß¶þÔò¼æ¾ß¡£
ͨ¹ýuiautomatorviewer ¹¤¾ß¿ÉÒԲ鿴ӦÓõĿɼû¿Ø¼þ¡£¾ßÌåʹÓÃÇé¿ö¼ûÉÏÃæËùÊö¡£
3.È·±£´ý²âÓ¦ÓÃÊǿɷÃÎʵÄ
ÓÉÓÚuiautomator ¹¤¾ßÒÀÀµAndroidÉ豸µÄ¿É·ÃÎÊÐÐÀ´»ñÈ¡UI¿Ø¼þ£¬ËùÒÔÕâ²»ÊǷdz£ÖØÒªµÄ¡£ÒªÖ§³Öuiautomator
¹¤¾ßÐèÒªÒ»ÏÂÌõ¼þ£º
ʹÓÃandroid:contentDescriptionÊôÐÔ¸ø ImageButton,
ImageView, CheckBoxºÍÆäËû¿Ø¼þÉèÖñêÇ©¡£
ʹÓÃandroid:hint ÊôÐÔÀ´±ê¼ÇEditText ¿Ø¼þ£¬¶ø²»ÊÇʹÓÃÀïÃæµÄÎı¾£¨Îı¾ÄÚÈÝÓû§ÊÇ¿ÉÒÔÐ޸ĵģ©¡£
¶ÔÓÚÓÃÀ´Ìṩ²Ù×÷ÊÓ¾õ·´À¡µÄUI£¨Îı¾»òÕßͼ±ê£©£¬¶¼Ìí¼ÓÒ»¸öandroid:hint
ÊôÐÔÀ´Ê¶±ð¡£
È·±£ËùÓÐÓû§¿É²Ù×÷µÄ½çÃæÔªËØ¶¼¿ÉÒÔͨ¹ý·½Ïò¿ØÖƼüÑ¡ÖУ¨ÀýÈç¹ì¼£Çò£©¡£
ͨ¹ýuiautomatorviewer ¹¤¾ßÀ´È·±£ËùÓеÄUIÔªËØ¶¼¿ÉÒÔ±»²âÊÔ¹¤¾ß·ÃÎʵ½¡£»¹¿ÉÒÔͨ¹ý¡°¸¨Öú¹¦ÄÜ¡±£¨ÔÚÉèÖýçÃæ£©Öеġ°TalkBack¡±µÈ·þÎñÀ´²âÊÔUIµÄ¿É·ÃÎÊÐÔ¡£
4.ÉèÖÿª·¢»·¾³
Èç¹ûÄãʹÓõÄÊÇEclipse£¨Adt£©£¬ÔòAndroid SDKÌṩÁ˶îÍâµÄ¹¤¾ßÀ´°ïÖúÄã±àдuiautomator²âÊÔ´úÂëºÍ´ò°ü²âÊÔÏîÄ¿¡£ÔÚEclipseÖд´½¨uiautomator²âÊÔÏîÄ¿µÄ¹ý³ÌÈçÏ£º
´´½¨ÐµÄJavaÏîÄ¿£¨×¢Òâ²»ÊÇAndroidÏîÄ¿£©¡£ÔÚ¸ÃÏîÄ¿ÖÐÀ´´´½¨²âÊÔ´úÂë¡£
ÔÚProject ExplorerÊÓͼÖУ¬ÓÒ¼üµã»÷²âÊÔÏîÄ¿£¬Ñ¡Ôñ¡° Properties
> Java Build Path¡±£¬È»ºóÑ¡Ôñ¡°Libraries¡± tab½çÃæ¡£ÔÚ¡°Libraries¡±½çÃæÑ¡Ôñ¡°
Add Library > JUnit¡±À´Ìí¼ÓJUnit3 ¿â¡£È»ºóµã»÷¡°Add External
JARs¡ ¡±²¢µ¼º½µ½Android SDKĿ¼¡£Ñ¡ÔñplatformsĿ¼ÏÂÃæµÄ uiautomator.jar
ºÍ android.jarÎļþ¡£
ÉèÖúõÄbuild pathÈçÏÂͼ£º

uiautomatorÏîÄ¿Àà·¾¶ÉèÖÃ
Èç¹ûÄ㲻ʹÓÃEclipse£¬ÔòÐèҪȷ±£/platforms/Ŀ¼ÖеÄuiautomator.jar
ºÍ android.jar λÓÚÏîÄ¿Build pathÖС£
ÅäÖúÿª·¢»·¾³ºó¾Í¿ÉÒÔ¿ªÊ¼±àд²âÊÔ´úÂëÁË¡£
´´½¨uiautomator ²âÊÔ°¸Àý
uiautomator ²âÊÔ°¸Àý£¨Test case£©ÐèÒª¼Ì³ÐÖÁUiAutomatorTestCase
Àà¡£¶øUiAutomatorTestCase Àà¼Ì³ÐÖÁjunit.framework.TestCaseÀ࣬ËùÒÔ¿ÉÒÔÓÃJUnitµÄAssertÀàÀ´±È½Ï²âÊÔ½á¹û¡£
UI²âÊÔµÄÊ×ÒªÈÎÎñ¾ÍÊÇ·ÃÎʲâÊÔÊÖ»ú¡£Ò»°ã¶¼ÊÇ´ÓÊÖ»úµÄÖ÷ÆÁ¿ªÊ¼²âÊԵġ£Í¨¹ýuiautomator
ÌṩµÄAPI¿ÉÒÔ´ÓÖ÷ÆÁÀ´Ä£ÄâÓû§µÄ²Ù×÷¡£ÏÂÃæ»á½éÉܾßÌåʾÀý¡£
uiautomator API
uiautomator APIÔÚ uiautomator.jar ÎļþÖС£ÕâЩAPI·Ö±ðÈçÏ£º
UiDevice
´ú±íÉ豸״̬¡£ÔÚ²âÊÔÖУ¬¿ÉÒÔͨ¹ýUiDeviceʵÀýÀ´¼ì²âÉ豸µÄ¸÷ÖÖÊôÐÔ£¬ÀýÈ統ǰµÄÆÁÄ»·½ÏòÒÔ¼°ÆÁÄ»³ß´ç¡£Í¬Ê±»¹¿ÉÒÔͨ¹ýUiDeviceʵÀýÀ´Ö´ÐÐÉ豸¼¶±ðµÄ²Ù×÷£¬ÀýÈç
°ÑÉ豸ÉèÖÃΪºáÆÁ»òÕßÊúÆÁ¡¢°´ÏÂHome°´¼üµÈ¡£
ÈçÏÂÊÇÄ£Äâ°´ÏÂHome°´¼üµÄ´úÂ룺
getUiDevice().pressHome();
UiSelector
´ú±íÒ»¸öËÑË÷UI¿Ø¼þµÄÌõ¼þ¡£Èç¹û·¢ÏÖ¶à¸öÂú×ãÌõ¼þµÄ¿Ø¼þÔò»á·µ»ØµÚÒ»¸ö¿Ø¼þ¡£·µ»ØµÄ½á¹ûΪUiObject¶ÔÏó¡£ÔÚ¹¹ÔìUiSelectorµÄʱºò¿ÉÒÔ×éºÏʹÓöà¸öÊôÐÔÀ´¶¨Î»¾ßÌåµÄ¿Ø¼þ¡£Èç¹ûûÓÐÕÒµ½¿Ø¼þÔò»áÅ׳ö
UiAutomatorObjectNotFoundException Òì³£¡£»¹¿ÉÒÔʹÓÃchildSelector()º¯ÊýÀ´Ç¶Ì×UiSelector
¶ÔÏó¡£ÀýÈ磬ÏÂÃæµÄ´úÂëÑÝʾÁËÈçºÎÔÚµ±Ç°½çÃæÖвéÕÒµÚÒ»¸öListViewÖеĴøÓÐÎı¾ÊôÐÔΪAppsµÄ×ӿؼþ¡£
UiObject appItem = new UiObject(new UiSelector() .className("android.widget.ListView").instance(1) .childSelector(new UiSelector().text("Apps")));
|
UiObject
´ú±íÒ»¸öUI¿Ø¼þ¡£Í¨¹ýUiSelectorÀ´²éÕÒUiObject¡£
ÈçÏÂʾÀý´úÂëÑÝʾÁËÈçºÎ²éÕÒµ±Ç°ÏÔʾ½çÃæÖеÄÈ¡Ïû°´Å¥ºÍÈ·Èϰ´Å¥£º
UiObject cancelButton = new UiObject(new UiSelector().text("Cancel")); UiObject okButton = new UiObject(new UiSelector().text("OK"));
|
²éÕÒµ½µÄUiObjectʵÀý¿ÉÒÔÔÚÆäËû²âÊÔ´úÂëÖÐÖØÓá£ÐèҪעÒâµÄÊÇ£ºÃ¿´ÎʹÓÃUiObject×ö²Ù×÷µÄʱºòuiautomator
¶¼»áÔÚµ±Ç°ÆÁĻ֨вéÕҸÿؼþ¡£
ÈçÏ´úÂëuiautomator ¹¤¾ßÔÚµ±Ç°½çÃæ²éÕÒÎı¾ÄÚÈÝΪ¡°OK¡±µÄ¿Ø¼þ¡£Èç¹û´æÔÚ²¢ÇÒ¿ÉÓÃÔòÄ£ÄâÓû§µã»÷¸Ã¿Ø¼þ¡£
if(okButton.exists() && okButton.isEnabled()) { okButton.click(); } |
»¹¿ÉÒÔÏÞÖÆ½ö½ö²éÕÒÌØ¶¨ÀàÐ͵Ŀؼþ¡£ÀýÈç ÈçÏ´úÂëÖ»²éÕÒÎı¾Îª¡°Cancel¡±ºÍ¡°OK¡±µÄandroid.widget.ButtonÀàÐͿؼþ¡£
Read more: http://blog.chengyunfeng.com/?p=504#ixzz3wd1E6lvs
UiObject cancelButton = new UiObject(new UiSelector().text("Cancel") .className("android.widget.Button")); UiObject okButton = new UiObject(new UiSelector().text("OK") .className("android.widget.Button"));
|
UiCollection
´ú±í¿Ø¼þµÄ¼¯ºÏ¡£»ñÈ¡UiCollectionµÄ·½Ê½ºÍUiObjectÒ»Ñù£¬Í¨¹ý
UiSelector²éÕÒ¡£ UiCollection¶ÔÓ¦AndroidϵͳÖеÄViewGroupÒÔ¼°×ӿؼþ¡£
ÈçÏ´úÂëÑÝʾÈçºÎͨ¹ýUiSelectorÀ´»ñÈ¡°üº¬ÊÓÆµ¼¯ºÏµÄUiCollection¡£
UiCollection videos = new UiCollection(new UiSelector() .className("android.widget.FrameLayout")); |
Èç¹ûÿ¸öÊÓÆµÊǷŵ½LinearLayoutÖеģ¬Ôò¿ÉÒÔͨ¹ýÈçÏ·½Ê½»ñÈ¡ÊÓÆµµÄÊýÄ¿£º
Read more: http://blog.chengyunfeng.com/?p=504#ixzz3wd1PshTN
int count = videos.getChildCount(new UiSelector() .className("android.widget.LinearLayout")); |
Èç¹ûÐèÒª²éÕÒ±êǩΪ¡°Cute Baby Laughing¡±µÄÊÓÆµ£¬²¢µã»÷¡£Ôò¿ÉÒÔͨ¹ýÈçÏ·½Ê½£º
UiObject video = videos.getChildByText(new UiSelector() .className("android.widget.LinearLayout"), "Cute Baby Laughing"); video.click();
|
ͬÑù»¹¿ÉÒÔÄ£ÄâÆäËûÓû§²Ù×÷¡£ÀýÈ磬ģÄâÑ¡ÔñÊÓÆµµÄ²Ù×÷ÈçÏ£º
UiObject checkBox = video.getChild(new UiSelector() .className("android.widget.Checkbox")); if(!checkBox.isSelected()) checkbox.click();
|
UiScrollable
´ú±í¿É¹ö¶¯µÄ¿Ø¼þ¡£¿ÉÒÔÓÃUiScrollableÀ´Ä£Äâˮƽ»òÕß´¹Ö±¹ö¶¯µÄUIÔªËØ¡£Èç¹ûÐèÒª²Ù×÷µÄÔªËØÔÚÆÁÄ»ÍâÐèÒª¹ö¶¯ÆÁÄ»²ÅÄÜ¿´µ½µÄÇé¿öÏÂÐèҪʹÓÃUiScrollable¡£
ÀýÈ磬ÏÂÃæµÄ´úÂëÏÔʾÁËÈçºÎÄ£Äâ¹ö¶¯µ½¡°Settings ¡±²Ëµ¥²¢µã»÷¡°About
tablet¡±²Ëµ¥µÄ²Ù×÷¡£
UiScrollable settingsItem = new UiScrollable(new UiSelector() .className("android.widget.ListView")); UiObject about = settingsItem.getChildByText(new UiSelector() .className("android.widget.LinearLayout"), "About tablet"); about.click()
|
ÆäËûAPI²Î¿¼uiautomator apiÎĵµ¡£
Ò»¸ö¼òµ¥µÄuiautomator ²âÊÔ°¸Àý
ÈçÏÂÊÇÒ»¸ö¼òµ¥µÄ²âÊÔ°¸Àý´úÂ룬ģÄâÁ˵ã»÷Home¼ü»Øµ½Ö÷ÆÁ£¬È»ºóµã»÷ËùÒÔÓ¦Óð´Å¥´ò¿ªËùÓÐÓ¦ÓÃÁÐ±í£¬²¢¹ö¶¯µ½Ê±ÖÓÓ¦Óᣴò¿ªÊ±ÖÓÓ¦ÓÃ
²¢Ñ¡ÔñÄÖÁå½çÃæµÄµÚÒ»¸öÄÖÖÓÉèÖã¬Ð޸ĸÃÉèÖõĿª¹Ø¡£È»ºó·µ»Øµ½Ê±ÖÓ½çÃæÔÙ½øÈëµ¹¼ÆÊ±½çÃæ¡£
package com.uia.example.my; import android.widget.ListView; import android.widget.Switch; import com.android.uiautomator.core.UiObject; import com.android.uiautomator.core.UiObjectNotFoundException; import com.android.uiautomator.core.UiScrollable; import com.android.uiautomator.core.UiSelector; import com.android.uiautomator.testrunner.UiAutomatorTestCase; public class LaunchSettings extends UiAutomatorTestCase { // TODO ÖØÒª×¢Ò⣺ ÔÚÔËÐиòâÊÔ´úÂëµÄʱºò ÐèÒªÏȰÑÊÖ»úÓïÑÔ»·¾³ÉèÖÃΪӢÎÄ¡£ public void testDemo() throws UiObjectNotFoundException { // Ä£Äâ HOME ¼üµã»÷ʼþ getUiDevice().pressHome(); // ÏÖÔÚ´ò¿ªÁËÖ÷ÆÁÓ¦Óã¬Ä£Äâµã»÷ËùÓÐÓ¦Óð´Å¥²Ù×÷À´Æô¶¯ËùÓÐÓ¦ÓýçÃæ¡£ // Èç¹ûÄãʹÓÃÁËuiautomatorviewerÀ´²é¿´Ö÷ÆÁ£¬Ôò¿ÉÒÔ·¢ÏÖ¡°ËùÓÐÓ¦Óá±°´Å¥µÄ // content-description ÊôÐÔΪ¡°Apps¡±¡£¿ÉÒÔʹÓøÃÊôÐÔÀ´ÕÒµ½¸Ã°´Å¥¡£ UiObject allAppsButton = new UiObject(new UiSelector().description("Apps")); // Ä£Äâµã»÷ËùÓÐÓ¦Óð´Å¥£¬²¢µÈ´ýËùÓÐÓ¦ÓýçÃæÆðÀ´ allAppsButton.clickAndWaitForNewWindow(); // ÔÚËùÓÐÓ¦ÓýçÃæ£¬Ê±ÖÓÓ¦ÓÃλÓÚApps tab½çÃæÖС£ÏÂÃæÄ£ÄâÓû§µã»÷Apps tab²Ù×÷¡£ // ÕÒµ½ Apps tab °´Å¥ UiObject appsTab = new UiObject(new UiSelector().text("Apps")); // Ä£Äâµã»÷ Apps tab. appsTab.click(); // È»ºóÔÚ Apps tab½çÃæ£¬Ä£ÄâÓû§»¬¶¯µ½Ê±ÖÓÓ¦ÓõIJÙ×÷¡£ // ÓÉÓÚApps½çÃæÊÇ¿ÉÒÔ¹ö¶¯µÄ£¬ËùÓÐÓà // UiScrollable ¶ÔÏó. UiScrollable appViews = new UiScrollable(new UiSelector().scrollable(true)); // ÉèÖùö¶¯Ä£Ê½ÎªË®Æ½¹ö¶¯(ĬÈÏΪ´¹Ö±¹ö¶¯) appViews.setAsHorizontalList(); if (allAppsButton.exists() && allAppsButton.isEnabled()) { // allAppsButtonÔÚµ±Ç°½çÃæÒѾ²»¿É¼ûÁË ËùÒÔÕâÀï²»»áÖ´ÐÐ allAppsButton.click(); } // ²éÕÒʱÖÓÓ¦Óò¢µã»÷ UiObject settingsApp = appViews.getChildByText( new UiSelector().className(android.widget.TextView.class.getName()), "Clock"); settingsApp.clickAndWaitForNewWindow(); // ÑéÖ¤µ±Ç°ÏÔʾ µÄÓ¦ÓðüÃûΪʱÖÓ UiObject settingsValidation = new UiObject(new UiSelector().packageName("com.google.android.deskclock")); // Èç¹û²»´æÔÚÔò³ö´íÌáʾ assertTrue("Unable to detect Clock", settingsValidation.exists()); // Ä£Äâµã»÷ʱ¼ätab UiObject clock = new UiObject(new UiSelector().description("Clock")); clock.clickAndWaitForNewWindow(); // Ä£Äâµã»÷Ï·½µÄÄÖÖÓͼ±ê UiObject alarms = new UiObject(new UiSelector().description("Alarms")); alarms.clickAndWaitForNewWindow(); UiScrollable list = new UiScrollable(new UiSelector().className(ListView.class.getName())); if (list.getChildCount() > 0) { UiObject listIndex0 = list.getChild(new UiSelector().index(0)); UiObject switchBtn = listIndex0.getChild(new UiSelector().className(Switch.class.getName())); boolean isChecked = switchBtn.isChecked(); switchBtn.click(); } // Ä£Äâµã»÷·µ»Ø¼ü getUiDevice().pressBack(); UiObject timer = new UiObject(new UiSelector().description("Timer")); timer.clickAndWaitForNewWindow(); } }
|
´ò°ü²âÊÔ´úÂë²¢ÔÚ²âÊÔ»úÉÏÔËÐÐ
Èçϲ½Öè´ò°ü²âÊÔ´úÂë²¢ÔÚ²âÊÔ»úÔËÐеIJ½Ö裺
1.´´½¨´ò°ü²âÊÔ´úÂëµÄBuild½Å±¾¡£Í¨¹ýÈçÏÂÃüÁîÀ´Éú³ÉBuild½Å±¾£º
<android-sdk>/tools/android create uitest-project -n <name> -t 1 -p <path>
|
<name><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter',
Times, serif; font-size: 13px; line-height: 19px;">
Êǰüº¬²âÊÔ´úÂëµÄÏîÄ¿Ãû³Æ£¬<path>Êǰüº¬²âÊÔ´úÂëµÄÏîÄ¿Îļþ·¾¶¡£-tºóÃæµÄ1ÊÇAndroid sdk°æ±¾id¡£</span>
|
×¢Ò⣺ ÔÚ´´½¨Build½Å±¾Ö®Ç°£¬ÒѾ´´½¨ºÃÁ˲âÊÔÏîÄ¿²¢±àдºÃÁ˲âÊÔ´úÂë¡£Ö»²»¹ý¸Ã²âÊÔÏîÄ¿»¹Ã»Óаüº¬´ò°ü½Å±¾ËùÒÔÎÞ·¨´ò°üÔËÐС£ÔÚ´´½¨Build½Å±¾µÄʱºò£¬<name>ÊôÐÔ¾ÍÊDzâÊÔÏîÄ¿µÄÃû³Æ¡¢<path>¾ÍÊÇÒѾ´´½¨µÄ²âÊÔÏîÄ¿ÔÚµçÄÔÖеÄÎļþ¼Ð·¾¶¡£
Èç¹ûµçÄÔÉϰ²×°Á˶à¸ö°æ±¾µÄAndroid sdk£¬ÔòÐèÒªÔËÐÐ/tools/android list target
À´²é¿´Ã¿¸öSDKµÄid¡£Ñ¡Ôñ4.1ÒÔÉϵÄid¼´¿É¡£
2. ÉèÖÃANDROID_HOME »·¾³±äÁ¿¡£
Windows£ºset ANDROID_HOME=
Unix£ºexport ANDROID_HOME=
3. ´ò¿ªÃüÁîÐд´½¨£¬µ¼º½µ½µÚÒ»²½ÖеÄĿ¼ÖУ¬ÔËÐÐ ant build
À´´ò°ü¡£
4. ͨ¹ýadb pushÃüÁî°ÑÉÏÒ»²½´ò°ü³öÀ´µÄjarÎļþ¸´ÖƵ½²âÊÔÊÖ»úÖС£
adb push <path>/bin/<name>.jar /data/local/tmp/ ÀàËÆÈçÏ´úÂ룺 adb push ~/dev/workspace/LaunchSettings/bin/LaunchSettings.jar /data/local/tmp/
|
ÔËÐÐuiautomator ²âÊÔ
ÏÂÃæÊÇÔËÐÐ LaunchSettings.jar jar°üÖвâÊÔ´úÂëµÄÃüÁî¡£²âÊÔ´úÂëλÓÚcom.uia.example.my°üÖС£
adb shell uiautomator runtest LaunchSettings.jar -c com.uia.example.my.LaunchSettings |
×î¼Ñʵ¼ù
ÏÂÃæÊÇһЩʹÓÃuiautomator ×öUI²âÊÔµÄ×î¼Ñʵ¼ù
ÔÚ´ý²âÓ¦ÓÿÉÄÜÔËÐеľ¡¿ÉÄܶàµÄÉ豸ÉÏÅÜuiautomator ²âÊÔ¡£ÀýÈç ÔÚ²»Í¬µÄÆÁÄ»Ãܶȡ¢²»Í¬µÄÆÁÄ»³ß´çÉÏÔËÐвâÊÔ¡£
»¹Ó¦¸ÃÔÚһЩ³£¹æ³¡¾°Ï²âÊÔUI£¬ÀýÈç µç»°´òÈëÇé¿ö¡¢ÍøÂçÁ¬½Ó¶Ï¿ªµÄÇé¿öµÈ¡£
|