def testUiViewServerDump_windowIntM1(self): try: device = MockDevice(version=15, startviewserver=True) vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False) vc.dump(window=-1) vc.findViewByIdOrRaise('id/home') finally: device.shutdownMockViewServer()
def testFindViewsContainingPoint_filterApi15(self): try: device = MockDevice(version=15, startviewserver=True) vc = ViewClient(device, device.serialno, adb=TRUE) list = vc.findViewsContainingPoint((200, 200), filter=View.isClickable) self.assertNotEquals(None, list) self.assertNotEquals(0, len(list)) finally: device.shutdownMockViewServer()
def testUiViewServerDump_windowIntStr(self): device = None try: device = MockDevice(version=15, startviewserver=True) vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False) vc.dump(window='0xb52f7c88') vc.findViewByIdOrRaise('id/status_bar') finally: if device: device.shutdownMockViewServer()
def testFindViewWithContentDescriptionOrRaiseExceptionMessage_regexpRoot( self): device = None root = View({'text:mText': '0', 'content-desc': 'CD0'}, device) root.add(View({'text:mText': '1', 'content-desc': 'CD1'}, device)) root.add(View({'text:mText': '2', 'content-desc': 'CD2'}, device)) v3 = View({'text:mText': '3', 'content-desc': 'CD3'}, device) root.add(v3) v35 = View({'text:mText': '35', 'content-desc': 'CD35'}, device) v3.add(v35) v4 = View({'text:mText': '4', 'conent-desc': 'CD4'}, device) root.add(v4) v45 = View({'text:mText': '45', 'content-desc': 'CD45'}, device) v4.add(v45) device = MockDevice() vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False) self.assertNotEquals(None, vc) vc.root = root try: vc.findViewWithContentDescriptionOrRaise( re.compile('Non Existent'), root=v4) self.fail() except ViewNotFoundException, e: self.assertNotEquals( None, re.search("that matches 'Non Existent'", e.message))
def testInit_adbNone(self): device = MockDevice() vc = ViewClient(device, serialno=device.serialno, adb=None, autodump=False) self.assertNotEqual(None, vc)
def testMapSerialNo_None(self): device = MockDevice() try: ViewClient(device, None, adb=TRUE, autodump=False) self.fail() except ValueError: pass
def testCopyConstructor(self): device = MockDevice() mv = VIEW_MAP_API_17.copy() mv['class'] = u'android.widget.View' v = View(mv, device, 17) self.assertEqual(v.getClass(), u'android.widget.View') mt = VIEW_MAP_API_17.copy() mt['class'] = u'android.widget.TextView' t = TextView(mt, device, 17) self.assertEqual(t.getClass(), u'android.widget.TextView') me = VIEW_MAP_API_17.copy() me['class'] = u'android.widget.EditText' e = TextView(me, device, 17) self.assertEqual(e.getClass(), u'android.widget.EditText') v1 = View.clone(v) self.assertEqual(u'android.widget.View', v1.getClass()) t1 = TextView.clone(t) self.assertEqual(u'android.widget.TextView', t1.getClass()) e1 = EditText.clone(e) self.assertEqual(u'android.widget.EditText', e1.getClass()) t2 = TextView.clone(v) self.assertEqual(u'android.widget.TextView', t2.getClass()) e2 = EditText.clone(v) self.assertEqual(u'android.widget.EditText', e2.getClass()) e2.setText("hello")
def testFindViewWithText_root(self): device = None root = View({'text:mText':'0'}, device) root.add(View({'text:mText':'1'}, device)) root.add(View({'text:mText':'2'}, device)) v3 = View({'text:mText':'3'}, device) root.add(v3) v35 = View({'text:mText':'5', 'getTag()':'v35'}, device) v3.add(v35) v4 = View({'text:mText':'4'}, device) root.add(v4) v45 = View({'text:mText':'5', 'getTag()':'v45'}, device) v4.add(v45) device = MockDevice() vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False) self.assertNotEquals(None, vc) vc.root = root v5 = vc.findViewWithText('5') self.assertNotEqual(v5, None) self.assertEqual('v35', v5.getTag()) v5 = vc.findViewWithText('5', root=v4) self.assertNotEqual(v5, None) self.assertEqual('v45', v5.getTag()) v5 = vc.findViewWithText('5', root=v3) self.assertNotEqual(v5, None) self.assertEqual('v35', v5.getTag())
def testFindViewWithContentDescription_regexRoot(self): device = None root = View({'text:mText':'0', 'content-desc':'CD0'}, device) root.add(View({'text:mText':'1', 'content-desc':'CD1'}, device)) root.add(View({'text:mText':'2', 'content-desc':'CD2'}, device)) v3 = View({'text:mText':'3', 'content-desc':'CD3'}, device) root.add(v3) v35 = View({'text:mText':'35', 'content-desc':'CD35'}, device) v3.add(v35) v4 = View({'text:mText':'4', 'conent-desc':'CD4'}, device) root.add(v4) v45 = View({'text:mText':'45', 'content-desc':'CD45'}, device) v4.add(v45) device = MockDevice() vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False) self.assertNotEquals(None, vc) vc.root = root v45 = vc.findViewWithContentDescription(re.compile('CD4\d')) self.assertNotEqual(v45, None) self.assertEqual('45', v45.getText()) v45 = vc.findViewWithContentDescription(re.compile('CD4\d'), root=v4) self.assertNotEqual(v45, None) self.assertEqual('45', v45.getText()) v35 = vc.findViewWithContentDescription(re.compile('CD3\d'), root=v3) self.assertNotEqual(v35, None) self.assertEqual('35', v35.getText())
def testServiceStoppedAfterDestructor(self): device = MockDevice() self.assertTrue(device.service == STOPPED) if True: vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False) self.assertTrue(device.service == RUNNING) vc.__del__()
def testFindViewWithTextOrRaise_root_disappearingView(self): device = None root = View({'text:mText':'0'}, device) root.add(View({'text:mText':'1'}, device)) root.add(View({'text:mText':'2'}, device)) v3 = View({'text:mText':'3'}, device) root.add(v3) v35 = View({'text:mText':'5', 'getTag()':'v35'}, device) v3.add(v35) v4 = View({'text:mText':'4'}, device) root.add(v4) v45 = View({'text:mText':'5', 'getTag()':'v45'}, device) v4.add(v45) device = MockDevice() vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False) self.assertNotEquals(None, vc) vc.root = root v5 = vc.findViewWithTextOrRaise('5') self.assertEqual('v35', v5.getTag()) v5 = vc.findViewWithTextOrRaise('5', root=v4) self.assertEqual('v45', v5.getTag()) v5 = vc.findViewWithTextOrRaise('5', root=v3) self.assertEqual('v35', v5.getTag()) # Then remove v4 and its children root.children.remove(v4) #vc.dump() v4 = vc.findViewWithText('4') self.assertEqual(v4, None, "v4 has not disappeared")
def testInit_adbNone(self): device = MockDevice() try: vc = ViewClient(device, device.serialno, adb=None, autodump=False) self.assertNotEqual(None, vc) except subprocess.CalledProcessError: # This is needed because the ports cannot be forwarded if there is no device connected pass
def testContainsPoint_api17(self): v = View(VIEW_MAP_API_17, MockDevice(), 17) (X, Y, W, H) = v.getPositionAndSize() self.assertEqual(X, v.getX()) self.assertEqual(Y, v.getY()) self.assertEqual(W, v.getWidth()) self.assertEqual(H, v.getHeight()) self.assertTrue(v.containsPoint((v.getCenter())))
def __mockWindows(self, windows=WINDOWS): device = MockDevice() vc = ViewClient(device, serialno=device.serialno, adb=TRUE, autodump=False) self.assertNotEquals(None, vc) vc.windows = windows return vc
def testMapSerialNo_regex(self): # This is an edge case. A regex should not be used as the serialno in ViewClient as it's # behavior is not well defined. # MonkeyRunner.waitForConnection() accepts a regexp as serialno but adb -s doesn't try: ViewClient(MockDevice(), serialno='.*', adb=TRUE, autodump=False) self.fail() except ValueError: pass
def __mockTree(self, dump=DUMP, version=15, language='en'): device = MockDevice(version=version, language=language) vc = ViewClient(device, serialno=device.serialno, adb=TRUE, autodump=False) self.assertNotEquals(None, vc) if version <= 15: # We don't want to invoke the ViewServer or MockViewServer for this vc.setViews(dump) else: vc.dump() return vc
def testTraverseShowClassIdTextAndCenter(self): device = MockDevice() root = View( { 'mID': '0', 'text:mText': '0', 'layout:mLeft': 0, 'layout:mTop': 0 }, device) root.add( View( { 'mID': '1', 'text:mText': '1', 'layout:mLeft': 1, 'layout:mTop': 1 }, device)) root.add( View( { 'mID': '2', 'text:mText': '2', 'layout:mLeft': 2, 'layout:mTop': 2 }, device)) v3 = View( { 'mID': '3', 'text:mText': '3', 'layout:mLeft': 3, 'layout:mTop': 3 }, device) root.add(v3) v35 = View( { 'mID': '5', 'text:mText': '5', 'getTag()': 'v35', 'layout:mLeft': 5, 'layout:mTop': 5 }, device) v3.add(v35) vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False) self.assertNotEquals(None, vc) treeStr = StringIO.StringIO() vc.traverse(root=root, transform=ViewClient.TRAVERSE_CITC, stream=treeStr) self.assertNotEquals(None, treeStr.getvalue()) lines = treeStr.getvalue().splitlines() self.assertEqual(5, len(lines)) self.assertEqual('None 0 0 (0, 0)', lines[0]) citRE = re.compile(' +None \d+ \d+ \(\d+, \d+\)') for l in lines[1:]: self.assertTrue(citRE.match(l))
def testUiAutomatorKilled(self): device = MockDevice(version=16, uiautomatorkilled=True) try: vc = ViewClient(device, device.serialno, adb=TRUE, autodump=True, ignoreuiautomatorkilled=True) except Exception, e: self.assertIsNotNone( re.search( '''ERROR: UiAutomator output contains no valid information. UiAutomator was killed, no reason given.''', str(e)))
def testTextPropertyForDifferentSdkVersions_device(self): VP = { -1: TEXT_PROPERTY, 8: TEXT_PROPERTY_API_10, 10: TEXT_PROPERTY_API_10, 15: TEXT_PROPERTY, 16: TEXT_PROPERTY_UI_AUTOMATOR, 17: TEXT_PROPERTY_UI_AUTOMATOR } for version, textProperty in VP.items(): device = MockDevice(version=version) view = View(None, device, -1) self.assertEqual(textProperty, view.textProperty, msg='version %d' % version)
def testHeightPropertyForDifferentSdkVersions_device(self): VP = { -1: HEIGHT_PROPERTY, 8: HEIGHT_PROPERTY_API_8, 10: HEIGHT_PROPERTY, 15: HEIGHT_PROPERTY, 16: HEIGHT_PROPERTY, 17: HEIGHT_PROPERTY } for version, heightProperty in VP.items(): device = MockDevice(version=version) view = View(None, device, -1) self.assertEqual(heightProperty, view.heightProperty, msg='version %d' % version)
def testWidthPropertyForDifferentSdkVersions_device(self): VP = { -1: WIDTH_PROPERTY, 8: WIDTH_PROPERTY_API_8, 10: WIDTH_PROPERTY, 15: WIDTH_PROPERTY, 16: WIDTH_PROPERTY, 17: WIDTH_PROPERTY } for version, widthProperty in VP.items(): device = MockDevice(version=version) view = View(None, device, -1) self.assertEqual(widthProperty, view.widthProperty, msg='version %d' % version)
def testTopPropertyForDifferentSdkVersions_device(self): VP = { -1: TOP_PROPERTY, 8: TOP_PROPERTY_API_8, 10: TOP_PROPERTY, 15: TOP_PROPERTY, 16: TOP_PROPERTY, 17: TOP_PROPERTY } for version, topProperty in VP.items(): device = MockDevice(version=version) view = View(None, device, -1) self.assertEqual(topProperty, view.topProperty, msg='version %d' % version)
def testLeftPropertyForDifferentSdkVersions_device(self): VP = { -1: LEFT_PROPERTY, 8: LEFT_PROPERTY_API_8, 10: LEFT_PROPERTY, 15: LEFT_PROPERTY, 16: LEFT_PROPERTY, 17: LEFT_PROPERTY } for version, leftProperty in VP.items(): device = MockDevice(version=version) view = View(None, device, -1) self.assertEqual(leftProperty, view.leftProperty, msg='version %d' % version)
def testInit_adbNone(self): # FIXME: there's a problem here when the mock device is created, # it's intended to be API=15, mock ViewServer is started and then # adb tries (unsuccessfuly) to forward the ports (expected because # adb does not know anything about mock devices). # Then # error: device not found # appears in the console device = MockDevice() try: vc = ViewClient(device, device.serialno, adb=None, autodump=False) self.assertIsNotNone(vc) except subprocess.CalledProcessError: # This is needed because the ports cannot be forwarded if there is no device connected pass
def testTraverseShowClassIdAndText(self): device = MockDevice() root = View( { 'text:mText': '0', 'class': 'android.widget.View', 'mID': 0 }, device) root.add( View({ 'text:mText': '1', 'class': 'android.widget.View', 'mID': 1 }, device)) root.add( View({ 'text:mText': '2', 'class': 'android.widget.View', 'mID': 2 }, device)) v3 = View({ 'text:mText': '3', 'class': 'android.widget.View', 'mID': 3 }, device) root.add(v3) v35 = View( { 'text:mText': '5', 'getTag()': 'v35', 'class': 'android.widget.View', 'mID': 35 }, device) v3.add(v35) vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False) self.assertNotEquals(None, vc) treeStr = StringIO.StringIO() vc.traverse(root=root, transform=ViewClient.TRAVERSE_CIT, stream=treeStr) self.assertNotEquals(None, treeStr.getvalue()) lines = treeStr.getvalue().splitlines() self.assertEqual(5, len(lines), "lines=%s" % lines) self.assertEqual('android.widget.View 0 0', lines[0]) citRE = re.compile(' +android.widget.View \d+ \d+') for l in lines[1:]: self.assertTrue(citRE.match(l), 'l=%s' % l)
def testTraverseShowClassIdAndText(self): device = MockDevice() root = View({'text:mText':'0'}, device) root.add(View({'text:mText':'1'}, device)) root.add(View({'text:mText':'2'}, device)) v3 = View({'text:mText':'3'}, device) root.add(v3) v35 = View({'text:mText':'5', 'getTag()':'v35'}, device) v3.add(v35) vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False) self.assertNotEquals(None, vc) treeStr = StringIO.StringIO() vc.traverse(root=root, transform=ViewClient.TRAVERSE_CIT, stream=treeStr) self.assertNotEquals(None, treeStr.getvalue()) lines = treeStr.getvalue().splitlines() self.assertEqual(5, len(lines)) self.assertEqual('None None 0', lines[0]) citRE = re.compile(' +None None \d+') for l in lines[1:]: self.assertTrue(citRE.match(l))
def testFindViewWithTextOrRaise_rootNonExistent(self): device = None root = View({'text:mText':'0'}, device) root.add(View({'text:mText':'1'}, device)) root.add(View({'text:mText':'2'}, device)) v3 = View({'text:mText':'3'}, device) root.add(v3) v35 = View({'text:mText':'5', 'getTag()':'v35'}, device) v3.add(v35) v4 = View({'text:mText':'4'}, device) root.add(v4) v45 = View({'text:mText':'5', 'getTag()':'v45'}, device) v4.add(v45) device = MockDevice() vc = ViewClient(device, device.serialno, adb=TRUE, autodump=False) self.assertNotEquals(None, vc) vc.root = root try: vc.findViewWithTextOrRaise('Non Existent', root=v4) self.fail() except ViewNotFoundException: pass
def testGetProperty_displayHeight(self): device = MockDevice() self.assertEqual(1184, device.getProperty('display.height'))
def testGetProperty_displayWidth(self): device = MockDevice() self.assertEqual(768, device.getProperty('display.width'))
def testView_specifiedSdkVersion(self): view = View(VIEW_MAP, MockDevice(), 10) self.assertEqual(10, view.build[VERSION_SDK_PROPERTY])
def testMapSerialNo_emulator(self): vc = ViewClient(MockDevice(), serialno='emulator-5556', adb=TRUE, autodump=False) self.assertEqual('emulator-5556', vc.serialno)
def __mockTree(self, dump=DUMP): device = MockDevice() vc = ViewClient(device, serialno=device.serialno, adb=TRUE, autodump=False) self.assertNotEquals(None, vc) vc.setViews(dump) return vc