Coverage for kea/android_pdl_driver.py: 93%

44 statements  

« prev     ^ index     » next       coverage.py v7.6.9, created at 2024-12-22 16:05 +0800

1""" 

2This is the PDL (Property Desciption Language) for Android, which is one  

3kind of DSL (Domain Sepcific Language).  

4Please checkout Kea's doc and its paper for the details. 

5""" 

6 

7from uiautomator2._selector import Selector, UiObject 

8from uiautomator2 import Device as Driver 

9from typing import Any, Union, TYPE_CHECKING 

10if TYPE_CHECKING: 

11 from kea.droidbot import DroidBot 

12import time 

13 

14class Android_PDL_Driver(Driver): 

15 """The pdl driver for Android 

16 """ 

17 

18 droidbot = None 

19 

20 def __init__(self, serial, delay=1) -> None: 

21 super().__init__(serial=serial) 

22 self.delay = delay 

23 # set the delay between sending events 

24 self.settings['operation_delay'] = (0, self.delay) 

25 # default timeout for waiting a widget to appear. 

26 self.settings['wait_timeout'] = 5.0 

27 

28 def __call__(self, **kwargs: Any) -> "Ui": 

29 return Ui(self, Selector(**kwargs), droidbot=self.droidbot) 

30 

31 def set_droidbot(self, droidbot:"DroidBot"): 

32 self.droidbot = droidbot 

33 

34 def rotate(self, mode: str): # TODO: what does mode mean? why "rotate"/"press" not included in the Ui class 

35 """ 

36 

37 """ 

38 self.droidbot.device.save_screenshot_for_report(event_name="rotate", event = self) 

39 super().set_orientation(mode) 

40 time.sleep(1) 

41 

42 def press(self, key: Union[int, str], meta=None): # TODO: what does meta mean? 

43 """ 

44 key: home, back, menu, search, recent 

45 meta:  

46 """ 

47 self.droidbot.device.save_screenshot_for_report(event_name="press", event = key) 

48 super().press(key, meta) 

49 

50 

51class Ui(UiObject): 

52 """ 

53 TODO extend more UI operations, e.g., random selecting one tag 

54 """ 

55 def __init__(self, session:"Android_PDL_Driver", selector: Selector, droidbot:"DroidBot"): 

56 super().__init__(session, selector) 

57 self.droidbot=droidbot 

58 

59 def click(self, offset=None): 

60 self.droidbot.device.save_screenshot_for_report(event_name="click", event = self) 

61 print(f"Property Action: click({str(self.selector)})") 

62 super().click(offset) 

63 

64 def long_click(self, duration: float = 0.5): 

65 self.droidbot.device.save_screenshot_for_report(event_name="long_click", event = self) 

66 print(f"Property Action: long_click({str(self.selector)})") 

67 super().long_click(duration) 

68 

69 def set_text(self, text): 

70 self.droidbot.device.save_screenshot_for_report(event_name="set_text " + text, event = self) 

71 print(f"Property Action: set_text({str(self.selector)})") 

72 super().set_text(text) 

73 

74 def child(self, **kwargs): 

75 return Ui(self.session, self.selector.clone().child(**kwargs), self.droidbot) 

76 

77 def sibling(self, **kwargs): 

78 return Ui(self.session, self.selector.clone().sibling(**kwargs), self.droidbot)