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
« 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"""
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
14class Android_PDL_Driver(Driver):
15 """The pdl driver for Android
16 """
18 droidbot = None
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
28 def __call__(self, **kwargs: Any) -> "Ui":
29 return Ui(self, Selector(**kwargs), droidbot=self.droidbot)
31 def set_droidbot(self, droidbot:"DroidBot"):
32 self.droidbot = droidbot
34 def rotate(self, mode: str): # TODO: what does mode mean? why "rotate"/"press" not included in the Ui class
35 """
37 """
38 self.droidbot.device.save_screenshot_for_report(event_name="rotate", event = self)
39 super().set_orientation(mode)
40 time.sleep(1)
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)
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
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)
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)
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)
74 def child(self, **kwargs):
75 return Ui(self.session, self.selector.clone().child(**kwargs), self.droidbot)
77 def sibling(self, **kwargs):
78 return Ui(self.session, self.selector.clone().sibling(**kwargs), self.droidbot)