Skip to content

Commit 74071a6

Browse files
committed
Add API Base inner classes
- Add Device, UiDevice, ObjectStore and TargetContext - Select GET or POST depending on arguments - Mark old methods as deprecated
1 parent 1819a39 commit 74071a6

File tree

1 file changed

+263
-13
lines changed

1 file changed

+263
-13
lines changed

src/com/dtmilano/android/uiautomator/uiautomatorhelper.py

Lines changed: 263 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
2-
'''
3-
Copyright (C) 2012-2019 Diego Torres Milano
2+
"""
3+
Copyright (C) 2012-2021 Diego Torres Milano
44
Created on Feb 2, 2015
55
66
Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,7 +16,7 @@
1616
limitations under the License.
1717
1818
@author: Diego Torres Milano
19-
'''
19+
"""
2020

2121
from __future__ import print_function
2222

@@ -31,6 +31,8 @@
3131
import threading
3232

3333
import time
34+
from abc import ABC
35+
3436
from com.dtmilano.android.adb.adbclient import AdbClient
3537
from com.dtmilano.android.common import obtainAdbPath
3638
import culebratester_client
@@ -53,7 +55,7 @@ def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, ver
5355
self.adbClient = adbClient
5456
self.testClass = testClass
5557
self.testRunner = testRunner
56-
self.pkg = re.sub('\.test$', '', self.testClass)
58+
self.pkg = re.sub('\\.test$', '', self.testClass)
5759

5860
def run(self):
5961
if DEBUG:
@@ -71,7 +73,7 @@ def run(self):
7173
if DEBUG:
7274
print("\nFinished test.", file=sys.stderr)
7375
errmsg = out.splitlines()[-1]
74-
m = re.match('ERROR: (\d+)', errmsg)
76+
m = re.match('ERROR: (\\d+)', errmsg)
7577
if m:
7678
exitval = int(m.group(1))
7779
if exitval != 0:
@@ -120,6 +122,10 @@ def __init__(self, adbclient, adb=None, localport=9987, remoteport=9987, hostnam
120122
print('⚠️ CulebraTester2 server should have been started and port redirected.', file=sys.stderr)
121123
# TODO: localport should be in ApiClient configuration
122124
self.api_instance = culebratester_client.DefaultApi(culebratester_client.ApiClient())
125+
self.device = UiAutomatorHelper.Device(self)
126+
self.target_context = UiAutomatorHelper.TargetContext(self)
127+
self.object_store = UiAutomatorHelper.ObjectStore(self)
128+
self.ui_device = UiAutomatorHelper.UiDevice(self)
123129

124130
def __connectSession(self):
125131
if DEBUG:
@@ -128,7 +134,7 @@ def __connectSession(self):
128134
if DEBUG:
129135
print("UiAutomatorHelper: Lock acquired", file=sys.stderr)
130136
print("UiAutomatorHelper: Connecting session", file=sys.stderr)
131-
session = requests.Session()
137+
session = None # requests.Session()
132138
if not session:
133139
raise RuntimeError("Cannot create session")
134140
tries = 10
@@ -141,7 +147,7 @@ def __connectSession(self):
141147
response = session.head(self.baseUrl)
142148
if response.status_code == 200:
143149
break
144-
except requests.exceptions.ConnectionError as ex:
150+
except: # requests.exceptions.ConnectionError as ex:
145151
tries -= 1
146152
lock.release()
147153
if tries == 0:
@@ -184,12 +190,6 @@ def __runTests(self):
184190
def __httpCommand(self, url, params=None, method='GET'):
185191
raise RuntimeError("this method should not be used")
186192

187-
#
188-
# Device
189-
#
190-
def getDisplayRealSize(self):
191-
return self.api_instance.device_display_real_size_get()
192-
193193
#
194194
# UiAutomatorHelper internal commands
195195
#
@@ -201,10 +201,221 @@ def quit(self):
201201
# self.session.close()
202202
pass
203203

204+
#
205+
# API Base
206+
#
207+
class ApiBase(ABC):
208+
209+
def __init__(self, uiAutomatorHelper) -> None:
210+
super().__init__()
211+
self.uiAutomatorHelper = uiAutomatorHelper
212+
213+
def intersection(self, l1, l2):
214+
return list(set(l1) & set(l2))
215+
216+
def some(self, l1, l2):
217+
return len(self.intersection(l1, l2)) > 0
218+
219+
def all(self, l1, l2):
220+
li = len(self.intersection(l1, l2))
221+
return li == len(l1) and li == len(l2)
222+
223+
#
224+
# Device
225+
#
226+
class Device(ApiBase):
227+
"""
228+
Device
229+
"""
230+
231+
def __init__(self, uiAutomatorHelper) -> None:
232+
super().__init__(uiAutomatorHelper)
233+
234+
def get_display_real_size(self):
235+
"""
236+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
237+
:return: the display real size
238+
"""
239+
return self.uiAutomatorHelper.api_instance.device_display_real_size()
240+
241+
def getDisplayRealSize(self):
242+
"""
243+
:deprecated: use uiAutomatorHelper.device.get_display_real_size()
244+
:return: the display real size
245+
"""
246+
return self.api_instance.device_display_real_size_get()
247+
248+
#
249+
# TargetContext
250+
#
251+
class TargetContext(ApiBase):
252+
"""
253+
Target Context.
254+
"""
255+
256+
def __init__(self, uiAutomatorHelper) -> None:
257+
super().__init__(uiAutomatorHelper)
258+
259+
def start_activity(self, pkg, cls):
260+
"""
261+
Starts an activity.
262+
263+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
264+
:param pkg: the package
265+
:param cls: the Activity class
266+
:return: the api response
267+
"""
268+
return self.uiAutomatorHelper.api_instance.target_context_start_activity_get(pkg, cls)
269+
270+
#
271+
# ObjectStore
272+
#
273+
class ObjectStore(ApiBase):
274+
"""
275+
Object Store.
276+
"""
277+
278+
def __init__(self, uiAutomatorHelper) -> None:
279+
super().__init__(uiAutomatorHelper)
280+
281+
def list(self):
282+
"""
283+
List the objects.
284+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
285+
:return: the list of objects
286+
"""
287+
return self.uiAutomatorHelper.api_instance.object_store_list_get()
288+
204289
#
205290
# UiDevice
206291
#
292+
class UiDevice(ApiBase):
293+
"""
294+
UI Device.
295+
"""
296+
297+
def __init__(self, uiAutomatorHelper) -> None:
298+
super().__init__(uiAutomatorHelper)
299+
300+
def click(self, **kwargs):
301+
"""
302+
Clicks.
303+
304+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
305+
:param kwargs:
306+
:return:
307+
"""
308+
if self.all(['x', 'y'], kwargs):
309+
x = int(kwargs['x'])
310+
y = int(kwargs['y'])
311+
return self.uiAutomatorHelper.api_instance.ui_device_click_get(x=x, y=y)
312+
else:
313+
raise ValueError('click: (x, y) must have a value')
314+
315+
def dump_window_hierarchy(self, _format='JSON'):
316+
"""
317+
Dumps the window hierarchy.
318+
319+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
320+
:param _format:
321+
:return:
322+
"""
323+
return self.uiAutomatorHelper.api_instance.ui_device_dump_window_hierarchy_get(format=_format)
324+
325+
def find_object(self, **kwargs):
326+
"""
327+
Finds an object.
328+
329+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
330+
:param kwargs:
331+
:return:
332+
"""
333+
if self.some(['resource_id', 'ui_selector', 'by_selector'], kwargs):
334+
return self.uiAutomatorHelper.api_instance.ui_device_find_object_get(**kwargs)
335+
body = culebratester_client.Selector(**kwargs)
336+
return self.uiAutomatorHelper.api_instance.ui_device_find_object_post(body)
337+
338+
def find_objects(self, **kwargs):
339+
"""
340+
Finds objects.
341+
342+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
343+
:param kwargs:
344+
:return:
345+
"""
346+
return self.uiAutomatorHelper.api_instance.ui_device_find_objects_get(**kwargs)
347+
348+
def press_back(self):
349+
"""
350+
Presses BACK.
351+
352+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
353+
:return:
354+
"""
355+
return self.uiAutomatorHelper.api_instance.ui_device_press_back_get()
356+
357+
def press_home(self):
358+
"""
359+
Presses HOME.
360+
361+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
362+
:return:
363+
"""
364+
return self.uiAutomatorHelper.api_instance.ui_device_press_home_get()
365+
366+
def press_key_code(self, key_code, meta_state=0):
367+
"""
368+
Presses a key code.
369+
370+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
371+
:param key_code:
372+
:param meta_state:
373+
:return:
374+
"""
375+
return self.uiAutomatorHelper.api_instance.ui_device_press_key_code_get(key_code=key_code,
376+
meta_state=meta_state)
377+
378+
def swipe(self, **kwargs):
379+
"""
380+
Swipes.
381+
382+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
383+
:param kwargs:
384+
:return:
385+
"""
386+
if self.all(['start_x', 'start_y', 'end_x', 'end_y', 'steps'], kwargs):
387+
return self.uiAutomatorHelper.api_instance.ui_device_swipe_get(**kwargs)
388+
body = culebratester_client.Body(**kwargs)
389+
return self.uiAutomatorHelper.api_instance.ui_device_swipe_post(body)
390+
391+
def take_screenshot(self, scale=1.0, quality=90, **kwargs):
392+
"""
393+
Takes screenshot.
394+
395+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
396+
:param scale:
397+
:param quality:
398+
:param kwargs:
399+
:return:
400+
"""
401+
return self.uiAutomatorHelper.api_instance.ui_device_screenshot_get(scale=scale, quality=quality, **kwargs)
402+
403+
def wait_for_idle(self, **kwargs):
404+
"""
405+
Waits for idle.
406+
407+
:see https://github.com/dtmilano/CulebraTester2-public/blob/master/openapi.yaml
408+
:param kwargs:
409+
:return:
410+
"""
411+
return self.uiAutomatorHelper.api_instance.ui_device_wait_for_idle_get(**kwargs)
412+
207413
def click(self, **kwargs):
414+
"""
415+
:deprecated:
416+
:param kwargs:
417+
:return:
418+
"""
208419
params = kwargs
209420
if not (('x' in params and 'y' in params) or 'oid' in params):
210421
raise RuntimeError('click: (x, y) or oid must have a value')
@@ -217,15 +428,27 @@ def click(self, **kwargs):
217428
return self.api_instance.ui_device_click_get(x=x, y=y)
218429

219430
def dumpWindowHierarchy(self):
431+
"""
432+
:deprecated:
433+
"""
220434
return self.api_instance.ui_device_dump_window_hierarchy_get(format='JSON')
221435

222436
def findObject(self, **kwargs):
437+
"""
438+
:deprecated:
439+
"""
223440
return self.api_instance.ui_device_find_object_get(**kwargs)
224441

225442
def findObjects(self, **kwargs):
443+
"""
444+
:deprecated:
445+
"""
226446
return self.api_instance.ui_device_find_objects_get(**kwargs)
227447

228448
def longClick(self, **kwargs):
449+
"""
450+
:deprecated:
451+
"""
229452
params = kwargs
230453
if not (('x' in params and 'y' in params) or 'oid' in params):
231454
raise RuntimeError('longClick: (x, y) or oid must have a value')
@@ -236,24 +459,45 @@ def longClick(self, **kwargs):
236459
return self.__httpCommand('/UiDevice/longClick', params)
237460

238461
def openNotification(self):
462+
"""
463+
:deprecated:
464+
"""
239465
return self.__httpCommand('/UiDevice/openNotification')
240466

241467
def openQuickSettings(self):
468+
"""
469+
:deprecated:
470+
"""
242471
return self.__httpCommand('/UiDevice/openQuickSettings')
243472

244473
def pressBack(self):
474+
"""
475+
:deprecated:
476+
"""
245477
return self.api_instance.ui_device_press_back_get()
246478

247479
def pressHome(self):
480+
"""
481+
:deprecated:
482+
"""
248483
return self.api_instance.ui_device_press_home_get()
249484

250485
def pressKeyCode(self, keyCode, metaState=0):
486+
"""
487+
:deprecated:
488+
"""
251489
return self.api_instance.ui_device_press_key_code_get(key_code=keyCode, meta_state=metaState)
252490

253491
def pressRecentApps(self):
492+
"""
493+
:deprecated:
494+
"""
254495
return self.__httpCommand('/UiDevice/pressRecentApps')
255496

256497
def swipe(self, startX=-1, startY=-1, endX=-1, endY=-1, steps=10, segments=[], segmentSteps=5):
498+
"""
499+
:deprecated:
500+
"""
257501
if startX != -1 and startY != -1:
258502
params = {'startX': startX, 'startY': startY, 'endX': endX, 'endY': endY, 'steps': steps}
259503
elif segments:
@@ -265,9 +509,15 @@ def swipe(self, startX=-1, startY=-1, endX=-1, endY=-1, steps=10, segments=[], s
265509
return self.__httpCommand('/UiDevice/swipe', params)
266510

267511
def takeScreenshot(self, scale=1.0, quality=90, **kwargs):
512+
"""
513+
:deprecated:
514+
"""
268515
return self.api_instance.ui_device_screenshot_get(scale=scale, quality=quality, **kwargs)
269516

270517
def waitForIdle(self, timeout):
518+
"""
519+
:deprecated:
520+
"""
271521
params = {'timeout': timeout}
272522
return self.api_instance.ui_device_wait_for_idle_get(**params)
273523

0 commit comments

Comments
 (0)