Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓƵ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓÃuiautomator×öUI²âÊÔ
 
×÷Õߣºrain À´Ô´£º51testing ·¢²¼ÓÚ 2016-1-11
  3563  次浏览      18
 

ÔÚ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>

&lt;name&gt;<span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', 
Times, serif; font-size: 13px; line-height: 19px;">
ÊÇ°üº¬²âÊÔ´úÂëµÄÏîÄ¿Ãû³Æ£¬&lt;path&gt;ÊÇ°üº¬²âÊÔ´úÂëµÄÏîÄ¿Îļþ·¾¶¡£-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£¬ÀýÈç µç»°´òÈëÇé¿ö¡¢ÍøÂçÁ¬½Ó¶Ï¿ªµÄÇé¿öµÈ¡£

   
3563 ´Îä¯ÀÀ       18
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù
×îпγ̼ƻ®
ÐÅÏ¢¼Ü¹¹½¨Ä££¨»ùÓÚUML+EA£©3-21[±±¾©]
Èí¼þ¼Ü¹¹Éè¼Æʦ 3-21[±±¾©]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 3-25[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼Æ 4-11[±±¾©]
SysMLºÍEAϵͳÉè¼ÆÓ뽨ģ 4-22[±±¾©]
DoDAF¹æ·¶¡¢Ä£ÐÍÓëʵÀý 5-23[±±¾©]

LoadRunnerÐÔÄܲâÊÔ»ù´¡
Èí¼þ²âÊÔ½á¹û·ÖÎöºÍÖÊÁ¿±¨¸æ
ÃæÏò¶ÔÏóÈí¼þ²âÊÔ¼¼ÊõÑо¿
Éè¼Æ²âÊÔÓÃÀýµÄËÄÌõÔ­Ôò
¹¦ÄܲâÊÔÖйÊÕÏÄ£Ð͵Ľ¨Á¢
ÐÔÄܲâÊÔ×ÛÊö

ÐÔÄܲâÊÔ·½·¨Óë¼¼Êõ
²âÊÔ¹ý³ÌÓëÍŶӹÜÀí
LoadRunner½øÐÐÐÔÄܲâÊÔ
WEBÓ¦ÓõÄÈí¼þ²âÊÔ
ÊÖ»úÈí¼þ²âÊÔ
°×ºÐ²âÊÔ·½·¨Óë¼¼Êõ

ij²©²ÊÐÐÒµ Êý¾Ý¿â×Ô¶¯»¯²âÊÔ
IT·þÎñÉÌ Web°²È«²âÊÔ
IT·þÎñÉÌ ×Ô¶¯»¯²âÊÔ¿ò¼Ü
º£º½¹É·Ý µ¥Ôª²âÊÔ¡¢Öع¹
²âÊÔÐèÇó·ÖÎöÓë²âÊÔÓÃÀý·ÖÎö
»¥ÁªÍøweb²âÊÔ·½·¨Óëʵ¼ù
»ùÓÚSeleniumµÄWeb×Ô¶¯»¯²âÊÔ