class ModelInfo(): ''' classdocs ''' def __init__(self, deviceserial): ''' Constructor ''' #sndLog = CLS("test", "test") self.osType = sys.platform self.mstrInfo = {} #self.devSerials = self.instAdb.device_serial() self.mstrDevice = Device(deviceserial) self.mstrInfo = self.mstrDevice.info ''' DEVICE Infoamtions { u'displayRotation': 0, u'displaySizeDpY': 640, u'displaySizeDpX': 360, u'currentPackageName': u'com.android.launcher', u'productName': u'takju', u'displayWidth': 720, u'sdkInt': 18, u'displayHeight': 1184, u'naturalOrientation': True } ''' def getCurrntProductInfo(self): return self.mstrInfo def getProductNmae(self): return self.mstrInfo['productName'] def getCurrntPkg(self): return self.mstrInfo['currentPackageName'] def getSDKInt(self): return self.mstrInfo['sdkInt'] def getRotation(self): return self.mstrInfo['displayRotation'] def getNaturalOri(self): return self.mstrInfo['naturalOrientation'] def getDisplayState(self): return self.mstrDevice.screen def setReflash(self): pass #define Key activity def setDevScrnOn(self): self.mstrDevice.screen.on() def setMstDevScrnOff(self): self.mstrDevice.screen.off() def setWakeup(self): self.mstrDevice.wakeup() def setSleep(self): self.mstrDevice.sleep() #Hard key Soft key def pressHome(self): return self.mstrDevice.press.home() def pressBack(self): return self.mstrDevice.press.back() ###################################################################### def pressLeft(self): return self.mstrDevice.press.left() def pressRight(self): return self.mstrDevice.press.right() def pressUp(self): return self.mstrDevice.press.up() def pressDown(self): return self.mstrDevice.press.down() def pressCenter(self): return self.mstrDevice.press.center() ###################################################################### def pressMenu(self): return self.mstrDevice.press.menu() def pressSearch(self): return self.mstrDevice.press.search() def pressEnter(self): return self.mstrDevice.press.enter() def pressDelete(self): return self.mstrDevice.press.delete() # or del def pressRecent(self): return self.mstrDevice.press.recent() def pressVol_Up(self): return self.mstrDevice.press.volume_up() def pressVol_Down(self): return self.mstrDevice.press.volume_down() def pressVol_Mute(self): return self.mstrDevice.press.volume_mute() def pressPower(self): return self.mstrDevice.press.power() def clik(self, x, y): return self.mstrDevice.click(x, y) def longClik(self,x, y): ''' Description: param: x, y : start first point x, y return : Boolean ''' return self.mstrDevice.long_click(x, y) def swipe(self, sx, sy, ex, ey, steps=10): ''' Description: param: sx, xy : start first x, y ex, ey : move to x, y return : Boolean ''' return self.mstrDevice.swipe(sx, sy, ex, ey, steps) def drage(self,sx, sy, ex, ey, steps=10): ''' Description: param: sx, xy : start first x, y ex, ey : move to x, y return : Boolean ''' return self.mstrDevice.drag(sx, sy, ex, ey, steps) #screen action of the device def setOrientation(self,scrAct='natural', choiceDevice='mstr'): ''' Description param d.orientation = 'l' or 'left' d.orientation = 'r' or 'right' d.orientation = 'n' or 'natural' return : None ''' self.mstrDevice.orientation = scrAct def setFreezeRotation(self,condition=False,choiceDevice='mstr'): ''' param: condition : False un-freeze rotation return : None ''' self.mstrDevice.freeze_rotation(condition) def takeScreenShot(self, choiceDevice = 'mstr'): ''' Description: take screenshot and save to local file 'home.png' can work until android 4.2 param image name ''' def dumpWindowHeirarchy(self,filename='./log/hierachy.xml'): return self.mstrDevice.dump(filename) def dumpWindowHeirarchyStream(self): return self.mstrDevice.dump() def notification(self): ''' Open notification, can not work until android 4.3 return : Boolean ''' return self.mstrDevice.open.Notification() def quickSettings(self): ''' open quick settins, can not work until android 4.3 return : Boolean ''' return self.mstrDevice.open.quick_settings() def waitidle(self): ''' wait for current window to idle return : None ''' self.mstrDevice.wait.idle() def waitWindowUpdate(self): ''' wait until window upate event occurs return : Boolean ''' self.mstrDevice.wait.update() def getCurrentActivityInfo(self, text): ''' INFOMATION: { u'contentDescription': u'', u'checked': False, u'scrollable': False, u'text': u'Settings', u'packageName': u'com.android.launcher', u'selected': False, u'enabled': True, u'bounds': {u'top': 385, u'right': 360, u'bottom': 585, u'left': 200}, u'className': u'android.widget.TextView', u'focused': False, u'focusable': True, u'clickable': True, u'chileCount': 0, u'longClickable': True, u'visibleBounds': {u'top': 385, u'right': 360, u'bottom': 585, u'left': 200}, u'checkable': False } ''' return self.mstrDevice(text).info def uiObjExist(self,text): ''' ture if exists, else False ''' return self.mstrDevice.exists(text) def watcher(self): pass def handler(self): pass def selector(self): pass def __del__(self): pass
class UiAutomator(object): def __init__(self, serial=None): self.device = Device(serial) self.selector_mapping = {'text': 'text', 'id': 'resourceId', 'desc': 'description', 'class': 'className', 'index': 'index'} def do_action(self, **kwargs): action_name = kwargs.get('name').lower() if not action_name: return False elif action_name == 'press': return self.__press(**kwargs) elif action_name == 'click': return self.__click(**kwargs) elif action_name == 'random_click': return self.__random_click(**kwargs) elif action_name == 'edit': return self.__edit(**kwargs) elif action_name == 'wait': return self.__wait(**kwargs) elif action_name == 'wakeup': return self.__wakeup() elif action_name == 'sleep': return self.__sleep() elif action_name == 'objectinfo': return self.__get_object_info(**kwargs) elif action_name == 'orientation': return self.__orientation(**kwargs) elif action_name == 'get_current_package_name': return self.__get_current_package_name() elif action_name == 'open': return self.__open(**kwargs) elif action_name == 'exists': return self.__exists(**kwargs) elif action_name == 'return_to': return self.__return_to(**kwargs) def __get_selector(self, **kwargs): tmp = dict() for key in self.selector_mapping.keys(): parameter_value = kwargs.get(key) if parameter_value: tmp[self.selector_mapping.get(key)] = parameter_value return tmp def __click(self, **kwargs): selector = self.__get_selector(**kwargs) return self.device(**selector).click() def __exists(self, **kwargs): selector = self.__get_selector(**kwargs) return self.device(**selector).exists def __random_click(self, **kwargs): selector = self.__get_selector(**kwargs) count = self.device(**selector).count if count <= 0: return False selector['instance'] = randint(0, count-1) self.device(**selector).click() def __press(self, **kwargs): key = kwargs.get('key') if key in ["home", "back", "left", "right", "up", "down", "center", "menu", "search", "enter", "delete", "del", "recent", "volume_up", "volume_down", "volume_mute", "camera", "power"]: return self.device.press.__getattr__(key)() else: try: key_code = int(key) return self.device.press(key_code) except ValueError: return False def __open(self,**kwargs): key = kwargs.get('key') if key in ["notification", "quick_settings"]: return self.device.open.__getattr__(key)() return False def __orientation(self, **kwargs): # left/l: rotation=90 , displayRotation=1 # right/r: rotation=270, displayRotation=3 # natural/n: rotation=0 , displayRotation=0 # upsidedown/u: rotation=180, displayRotation=2 value = kwargs.get('value') if value in ['l', 'r', 'n', 'u', 'left', 'right', 'natural', 'upsidedown']: self.device.orientation = value return True return False def __freeze_rotation(self, **kwargs): value = kwargs.get('value', 'true') if value in ['False', 'false', 'f']: return self.device.freeze_rotation(freeze=False) return self.device.freeze_rotation(True) def __edit(self, **kwargs): selector = self.__get_selector(**kwargs) text_input = kwargs.get('input') return self.device(**selector).set_text(text=text_input) def __get_object_info(self, **kwargs): selector = self.__get_selector(**kwargs) key = kwargs.get('key') if key: return self.device(**selector).info.get(key) return self.device(**selector).info def __wait(self, **kwargs): try: wait_time = int(kwargs.get('time')) sleep(wait_time/1000.0) except ValueError: sleep(1) return True def __wakeup(self): return self.device.wakeup() def __sleep(self): return self.device.sleep() # def info(self): # return self.device.info # # def dump(self, filename=None, compressed=True, pretty=True): # Utility.output_msg('Dump device window and pull to \"%s\".' % filename) # return self.device.dump(filename=filename, compressed=compressed, pretty=pretty) # # def screenshot(self, filename, scale=1.0, quality=100): # Utility.output_msg('Take screenshot and save to \"%s\".' % filename) # return self.device.screenshot(filename=filename, scale=scale, quality=quality) # # # def long_click(self, **kwargs): # try: # return self.device(**kwargs).long_click() # except JsonRPCError, e: # return 'Error' # # def scroll(self, **kwargs): # return self.device(**kwargs).scroll(steps=steps) # def __get_current_package_name(self): return self.device.info.get('currentPackageName') def get_device_info(self): return self.device.info def __return_to(self, **kwargs): selector = self.__get_selector(**kwargs) for x in range(10): if self.device(**selector).exists: break self.device.press.back()
class Cases(unittest.TestCase): def setUp(self): self._driver = atx.connect() self._device = Device() def test_click(self): self._driver.click(540, 1650) self._driver.delay(2) self._driver.press.home() # self._driver.press("home") self._driver.delay(1) self._driver(description="Apps").click() self._driver.delay(1) self._driver.press.back() # self._driver.press("back") self._driver(text="Settings").long_click() def test_press(self): """press: home, back, left, right, up, down, center, menu, search, enter, delete(or del), recent, volume_up, volume_down, camera, power """ self._driver.press.volume_down() self._driver.delay(1) self._driver.press.volume_down() self._driver.delay(1) self._driver.press.volume_up() self._driver.delay(1) def test_screen(self): self._device.screen.off() self._driver.delay(2) self._device.screen.on() self._driver.delay(2) self._device.sleep() self._driver.delay(2) self._device.wakeup() def test_image(self): self._driver.start_app("com.android.calculator2") self._driver.delay(2) if self._driver.exists("1.jpg"): self._driver.click_image("1.jpg") self._driver.delay(1) else: print "Not find image" self._driver.screenshot("ttt.png") self._driver.stop_app("com.android.calculator2") def test_wait(self): if self._driver(text="1").wait.exists(timeout=10000): print "find it" if self._driver(text="1").wait.gone(timeout=10000): print "it gone" def test_child(self): self._driver(className="android.view.ViewGroup").child( text="Phone").click() self._driver.delay(1) self._driver.press("home") self._driver.delay(1) self._driver(text="Phone").click() self._driver.delay(1) self._driver.press("back") def test_instance(self): # count, instance # count = self._driver(className="android.widget.TextView").count # print count # self._driver(className="android.widget.TextView", instance=7).click() # self._driver.press.home() # self._driver.delay(1) # self._driver(className="android.widget.TextView")[7].click() # 计算器遍历 objs = self._driver(className="android.widget.Button") for obj in objs: obj.click() def test_set_text(self): # self._driver(resourceId="com.android.messaging:id/recipient_text_view").set_text("10086") # self._driver.delay(1) # self._driver.press.enter() # self._driver(resourceId="com.android.messaging:id/recipient_text_view").clear_text() # self._driver.delay(1) # self._driver.type("10086", enter=False) self._driver(resourceId="com.android.messaging:id/compose_message_text" ).long_click() def test_drag(self): self._driver(text="Settings").drag.to(950, 1000) self._driver.delay(1) self._driver(text="Settings").swipe.left(steps=100) def test_swipe(self): self._driver.swipe(1000, 1000, 500, 1000, steps=50) self._driver.delay(1) self._driver.swipe(500, 1000, 1000, 1000, steps=10) def test_scroll(self): self._driver(scrollable=True).scroll.to(text="Google") print "find it" def test_pinch(self): # com.google.android.apps.photos:id/list_photo_tile_view self._driver( resourceId="com.google.android.apps.photos:id/list_photo_tile_view" ).pinch.Out() self._driver.delay(1) self._driver( resourceId= "com.google.android.apps.photos:id/photo_hashtag_fragment_container" ).pinch.In() def test_cmd(self): dev = self._driver.adb_cmd("devices") mem = self._driver.adb_shell("dumpsys meminfo") print dev print mem def test_relative(self): self._driver(text="Cellular data").right( className="android.widget.Switch").click()
class ModelInfo(): ''' classdocs ''' def __init__(self, deviceserial): ''' Constructor ''' #sndLog = CLS("test", "test") self.osType = sys.platform self.mstrInfo = {} #self.devSerials = self.instAdb.device_serial() self.mstrDevice = Device(deviceserial) self.mstrInfo = self.mstrDevice.info ''' DEVICE Infoamtions { u'displayRotation': 0, u'displaySizeDpY': 640, u'displaySizeDpX': 360, u'currentPackageName': u'com.android.launcher', u'productName': u'takju', u'displayWidth': 720, u'sdkInt': 18, u'displayHeight': 1184, u'naturalOrientation': True } ''' def getCurrntProductInfo(self): return self.mstrInfo def getProductNmae(self): return self.mstrInfo['productName'] def getCurrntPkg(self): return self.mstrInfo['currentPackageName'] def getSDKInt(self): return self.mstrInfo['sdkInt'] def getRotation(self): return self.mstrInfo['displayRotation'] def getNaturalOri(self): return self.mstrInfo['naturalOrientation'] def getDisplayState(self): return self.mstrDevice.screen def setReflash(self): pass #define Key activity def setDevScrnOn(self): self.mstrDevice.screen.on() def setMstDevScrnOff(self): self.mstrDevice.screen.off() def setWakeup(self): self.mstrDevice.wakeup() def setSleep(self): self.mstrDevice.sleep() #Hard key Soft key def pressHome(self): return self.mstrDevice.press.home() def pressBack(self): return self.mstrDevice.press.back() ###################################################################### def pressLeft(self): return self.mstrDevice.press.left() def pressRight(self): return self.mstrDevice.press.right() def pressUp(self): return self.mstrDevice.press.up() def pressDown(self): return self.mstrDevice.press.down() def pressCenter(self): return self.mstrDevice.press.center() ###################################################################### def pressMenu(self): return self.mstrDevice.press.menu() def pressSearch(self): return self.mstrDevice.press.search() def pressEnter(self): return self.mstrDevice.press.enter() def pressDelete(self): return self.mstrDevice.press.delete() # or del def pressRecent(self): return self.mstrDevice.press.recent() def pressVol_Up(self): return self.mstrDevice.press.volume_up() def pressVol_Down(self): return self.mstrDevice.press.volume_down() def pressVol_Mute(self): return self.mstrDevice.press.volume_mute() def pressPower(self): return self.mstrDevice.press.power() def clik(self, x, y): return self.mstrDevice.click(x, y) def longClik(self, x, y): ''' Description: param: x, y : start first point x, y return : Boolean ''' return self.mstrDevice.long_click(x, y) def swipe(self, sx, sy, ex, ey, steps=10): ''' Description: param: sx, xy : start first x, y ex, ey : move to x, y return : Boolean ''' return self.mstrDevice.swipe(sx, sy, ex, ey, steps) def drage(self, sx, sy, ex, ey, steps=10): ''' Description: param: sx, xy : start first x, y ex, ey : move to x, y return : Boolean ''' return self.mstrDevice.drag(sx, sy, ex, ey, steps) #screen action of the device def setOrientation(self, scrAct='natural', choiceDevice='mstr'): ''' Description param d.orientation = 'l' or 'left' d.orientation = 'r' or 'right' d.orientation = 'n' or 'natural' return : None ''' self.mstrDevice.orientation = scrAct def setFreezeRotation(self, condition=False, choiceDevice='mstr'): ''' param: condition : False un-freeze rotation return : None ''' self.mstrDevice.freeze_rotation(condition) def takeScreenShot(self, choiceDevice='mstr'): ''' Description: take screenshot and save to local file 'home.png' can work until android 4.2 param image name ''' def dumpWindowHeirarchy(self, filename='./log/hierachy.xml'): return self.mstrDevice.dump(filename) def dumpWindowHeirarchyStream(self): return self.mstrDevice.dump() def notification(self): ''' Open notification, can not work until android 4.3 return : Boolean ''' return self.mstrDevice.open.Notification() def quickSettings(self): ''' open quick settins, can not work until android 4.3 return : Boolean ''' return self.mstrDevice.open.quick_settings() def waitidle(self): ''' wait for current window to idle return : None ''' self.mstrDevice.wait.idle() def waitWindowUpdate(self): ''' wait until window upate event occurs return : Boolean ''' self.mstrDevice.wait.update() def getCurrentActivityInfo(self, text): ''' INFOMATION: { u'contentDescription': u'', u'checked': False, u'scrollable': False, u'text': u'Settings', u'packageName': u'com.android.launcher', u'selected': False, u'enabled': True, u'bounds': {u'top': 385, u'right': 360, u'bottom': 585, u'left': 200}, u'className': u'android.widget.TextView', u'focused': False, u'focusable': True, u'clickable': True, u'chileCount': 0, u'longClickable': True, u'visibleBounds': {u'top': 385, u'right': 360, u'bottom': 585, u'left': 200}, u'checkable': False } ''' return self.mstrDevice(text).info def uiObjExist(self, text): ''' ture if exists, else False ''' return self.mstrDevice.exists(text) def watcher(self): pass def handler(self): pass def selector(self): pass def __del__(self): pass