11# -*- coding: utf-8 -*-
2- '''
3- Copyright (C) 2012-2019 Diego Torres Milano
2+ """
3+ Copyright (C) 2012-2021 Diego Torres Milano
44Created on Feb 2, 2015
55
66Licensed under the Apache License, Version 2.0 (the "License");
1616limitations under the License.
1717
1818@author: Diego Torres Milano
19- '''
19+ """
2020
2121from __future__ import print_function
2222
3131import threading
3232
3333import time
34+ from abc import ABC
35+
3436from com .dtmilano .android .adb .adbclient import AdbClient
3537from com .dtmilano .android .common import obtainAdbPath
3638import 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 ("\n Finished 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