From d93d7647958d51e1aeb9c03dddca68a1e5dac704 Mon Sep 17 00:00:00 2001 From: kaluluosi111 Date: Fri, 24 Nov 2023 00:27:24 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=B8=80=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robotframework_airtest/airtest/__init__.py | 74 +++++++++++++++++++++ tests/test_airtest/btn_start.png | Bin 0 -> 5802 bytes tests/test_airtest/test_airtest.robot | 31 +++++++++ tests/test_device_library_android.robot | 2 +- 4 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 robotframework_airtest/airtest/__init__.py create mode 100644 tests/test_airtest/btn_start.png create mode 100644 tests/test_airtest/test_airtest.robot diff --git a/robotframework_airtest/airtest/__init__.py b/robotframework_airtest/airtest/__init__.py new file mode 100644 index 0000000..3d965c3 --- /dev/null +++ b/robotframework_airtest/airtest/__init__.py @@ -0,0 +1,74 @@ +""" +author: kaluluosi111 +date: 2023-11-23 17:36:57 +Copyright © Kaluluosi All rights reserved +""" +import os +from airtest.core.api import ( + Template, + touch, + wait, + swipe, + exists, + text, + keyevent, + snapshot, + sleep, + assert_exists, + assert_not_exists, + assert_equal, + assert_not_equal, +) +from airtest.utils.transform import TargetPos + +from robot.libraries.BuiltIn import BuiltIn +from robot.api import deco +from typing import Optional, Tuple, Union + +Point = Tuple[float, float] +TargetType = Union[Point, str] + + +class AirtestLibrary: + ROBOT_LIBRARY_SCOPE = "TEST CASE" + ROBOT_LIBRARY_FORMAT = "rsST" + ROBOT_LISTENER_API_VERSION = 2 + + def __init__(self) -> None: + pass + + @property + def curdir(self): + suit_source = BuiltIn().get_variable_value("${SUITE SOURCE}") + curdir = os.path.dirname(suit_source) + return curdir + + @deco.keyword("点击") + def touch( + self, + target: TargetType, + times: int = 1, + threshold: Optional[float] = None, + record_pos: Optional[int] = None, + target_pos: int = TargetPos.MID, + resolution=(), + rgb=False, + scale_max=800, + scale_step=0.005, + ): + v = target + if isinstance(target, str): + v = Template( + os.path.join(self.curdir, target), + threshold=threshold, + record_pos=record_pos, + target_pos=target_pos, + resolution=resolution, + rgb=rgb, + scale_max=scale_max, + scale_step=scale_step, + ) + elif isinstance(target, Tuple): + v = target + + touch(v, times=times) diff --git a/tests/test_airtest/btn_start.png b/tests/test_airtest/btn_start.png new file mode 100644 index 0000000000000000000000000000000000000000..78bf3cf2177e4689ff2634cacc6fc082f1630e2d GIT binary patch literal 5802 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 literal 0 HcmV?d00001 diff --git a/tests/test_airtest/test_airtest.robot b/tests/test_airtest/test_airtest.robot new file mode 100644 index 0000000..0fb1586 --- /dev/null +++ b/tests/test_airtest/test_airtest.robot @@ -0,0 +1,31 @@ +*** Settings *** +Library robotframework_airtest.airtest.AirtestLibrary +Library robotframework_airtest.device.DeviceLibrary + +Test Setup 初始化用例 +# Test Teardown 清理用例 + + +*** Variables *** +${APK路径} tests/demo/com.netease.poco.u3d.tutorial.apk +${包名} com.NetEase + + +*** Test Cases *** +测试当前目录 + Log 当前目录:${CURDIR} level=CONSOLE + +测试点击 + Touch btn_start.png + + +*** Keywords *** +初始化用例 + 连接设备 android:/// + ${已安装} 是否已安装APP ${包名} + IF ${已安装} == ${False} 安装APP ${APK路径} + 启动APP ${包名} + Sleep 3s + +清理用例 + 停止APP ${包名} diff --git a/tests/test_device_library_android.robot b/tests/test_device_library_android.robot index e5e1ef6..8d924ba 100644 --- a/tests/test_device_library_android.robot +++ b/tests/test_device_library_android.robot @@ -1,6 +1,6 @@ *** Settings *** Library robotframework_airtest.device.DeviceLibrary -Library ../.venv/lib/site-packages/robot/libraries/OperatingSystem.py +Library OperatingSystem Test Setup 初始化用例 Test Teardown 断开设备 From ed3b5491f2e993686a6a86eb30d593805143d2cf Mon Sep 17 00:00:00 2001 From: kaluluosi111 Date: Fri, 24 Nov 2023 00:34:44 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robotframework_airtest/device/__init__.py | 26 ++++++++++++----------- tests/test_airtest/test_airtest.robot | 6 +++--- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/robotframework_airtest/device/__init__.py b/robotframework_airtest/device/__init__.py index 9cd595e..b2107c3 100644 --- a/robotframework_airtest/device/__init__.py +++ b/robotframework_airtest/device/__init__.py @@ -1,8 +1,8 @@ -from typing import Tuple +from typing import Optional, Tuple, List from airtest.core.settings import Settings from robot.api import logger, deco from robot.libraries.BuiltIn import BuiltIn -from .connects import ConnectStrategyBase, factory +from .connects import factory # 坐标点类型声明 Point = Tuple[float, float] @@ -13,7 +13,10 @@ class DeviceLibrary: ROBOT_LIBRARY_FORMAT = "rsST" def __init__( - self, device_uri: str = "", pkg_name: str = None, auto_start_app: bool = False + self, + device_uri: str = "", + pkg_name: Optional[str] = None, + auto_start_app: bool = False, ): """初始化库是传入的参数将会作为连接设备关键字的默认参数用 @@ -26,7 +29,6 @@ def __init__( self.auto_start_app = auto_start_app or self.var("${auto_start_app}") == "True" self.device_uri = device_uri or self.var("${device_uri}") self.pkg_name = pkg_name or self.var("${pkg_name}") - self.conn: ConnectStrategyBase = None logger.console( "DeviceLibrary初始化 device_uri:{} pkg_name:{} auto_start_app:{}".format( self.device_uri, @@ -47,7 +49,7 @@ def var(self, name): def connect_device( self, _device_uri: str = "", - _pkg_name: str = None, + _pkg_name: Optional[str] = None, _auto_start_app: bool = False, ): """如果传入了 _device_uri参数那么就会在这一次连接设备覆盖掉DeviceLibrary初始化时的默认参数。 @@ -79,13 +81,13 @@ def disconnect_device(self): self.conn.disconnect() if self.conn else logger.console("设备并没有连接") @deco.keyword("开始录像") - def start_recording(self, output: str = None, *args, **kwargs): + def start_recording(self, output: Optional[str] = None, *args, **kwargs): save_path = self.conn.device.start_recording(output=output, *args, **kwargs) logger.console("设备开始录像") return save_path @deco.keyword("结束录像") - def stop_recording(self, output: str = None, *args, **kwargs): + def stop_recording(self, output: Optional[str] = None, *args, **kwargs): """结束录像 args和kwargs可以传递具体Device的start_recording的参数过去。 @@ -104,9 +106,9 @@ def is_disconnected(self): return not self.conn.is_connected @deco.keyword("截图") - def snapshot(self, filename: str = None, *args, **kwargs) -> bytes: + def snapshot(self, filename: Optional[str] = None, *args, **kwargs) -> bytes: data = self.conn.device.snapshot(filename=filename, *args, **kwargs) - return data + return data # type:ignore @deco.keyword("点击") def touch(self, pos: Point, **kwargs): @@ -148,8 +150,8 @@ def clear_app(self, package: str): self.conn.device.clear_app(package) @deco.keyword("列出安装的APP") - def list_app(self, **kwargs): - return self.conn.device.list_app(**kwargs) + def list_app(self, **kwargs) -> List[str]: + return self.conn.device.list_app(**kwargs) # type:ignore @deco.keyword("是否已安装APP") def is_app_installed(self, package: str, **kwargs): @@ -183,6 +185,6 @@ def get_ip_address(self): @deco.keyword("shell命令") def shell(self, *args, **kwargs) -> str: - return self.conn.device.shell(*args, **kwargs) + return self.conn.device.shell(*args, **kwargs) # type:ignore # endregion diff --git a/tests/test_airtest/test_airtest.robot b/tests/test_airtest/test_airtest.robot index 0fb1586..2f123f5 100644 --- a/tests/test_airtest/test_airtest.robot +++ b/tests/test_airtest/test_airtest.robot @@ -1,6 +1,6 @@ *** Settings *** -Library robotframework_airtest.airtest.AirtestLibrary -Library robotframework_airtest.device.DeviceLibrary +Library robotframework_airtest.airtest.AirtestLibrary WITH NAME airtest +Library robotframework_airtest.device.DeviceLibrary WITH NAME device Test Setup 初始化用例 # Test Teardown 清理用例 @@ -16,7 +16,7 @@ ${包名} com.NetEase Log 当前目录:${CURDIR} level=CONSOLE 测试点击 - Touch btn_start.png + airtest.点击 btn_start.png *** Keywords *** From 86cfb64f5295894698cc31f0f4856117a9964056 Mon Sep 17 00:00:00 2001 From: kaluluosi111 Date: Fri, 24 Nov 2023 09:55:59 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=B8=80=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robotframework_airtest/__init__.py | 22 ++ robotframework_airtest/airtest/__init__.py | 330 +++++++++++++++++++-- robotframework_airtest/poco/__init__.py | 13 +- tests/test_airtest/test_airtest.robot | 8 +- 4 files changed, 345 insertions(+), 28 deletions(-) diff --git a/robotframework_airtest/__init__.py b/robotframework_airtest/__init__.py index 8b13789..ac42450 100644 --- a/robotframework_airtest/__init__.py +++ b/robotframework_airtest/__init__.py @@ -1 +1,23 @@ +from .device import DeviceLibrary +from .poco import ( + AndroidUiAutomationPocoLibrary, + CocosJsPocoLibrary, + IOSPocoLibrary, + StdPocoLibrary, + UE4PocoLibrary, + UnityPocoLibrary, +) + +from .airtest import AirtestLibrary + +__all__ = [ + "AndroidUiAutomationPocoLibrary", + "CocosJsPocoLibrary", + "IOSPocoLibrary", + "StdPocoLibrary", + "UE4PocoLibrary", + "UnityPocoLibrary", + "AirtestLibrary", + "DeviceLibrary", +] diff --git a/robotframework_airtest/airtest/__init__.py b/robotframework_airtest/airtest/__init__.py index 3d965c3..3bf0086 100644 --- a/robotframework_airtest/airtest/__init__.py +++ b/robotframework_airtest/airtest/__init__.py @@ -5,7 +5,7 @@ """ import os from airtest.core.api import ( - Template, + Template as AirTemplate, touch, wait, swipe, @@ -23,10 +23,54 @@ from robot.libraries.BuiltIn import BuiltIn from robot.api import deco -from typing import Optional, Tuple, Union +from robot.utils import timestr_to_secs + +from typing import Any, Callable, Optional, Tuple, Union Point = Tuple[float, float] -TargetType = Union[Point, str] +TargetType = Union["Template", Point, str] + + +class Template(AirTemplate): + def __init__( + self, + filename: str, + threshold: Optional[float] = None, + target_pos=TargetPos.MID, + record_pos: Optional[Point] = None, + resolution=..., + rgb: bool = False, + scale_max: int = 800, + scale_step: float = 0.005, + ): + """ + Args: + filename (str): 文件名,相对于robot脚本的路径 \n + threshold (Optional[float], optional): 识别阈值,越高越严格. Defaults to None. \n + record_pos (Optional[Point], optional): 录制坐标. Defaults to None. \n + target_pos (int, optional): 点击目标坐标偏移. Defaults to TargetPos.MID. \n + resolution (tuple, optional): 分辨率. Defaults to (). \n + rgb (bool, optional): 是否rgb三通道识别,默认是将图片转单通道灰度图,灰度更快. Defaults to False. \n + scale_max (int, optional): 最大缩放倍数. Defaults to 800. \n + scale_step (float, optional): 缩放步进. Defaults to 0.005. \n + """ + super().__init__( + filename, + threshold, + target_pos, + record_pos, + resolution, + rgb, + scale_max, + scale_step, + ) + self.filename = os.path.join(self.curdir, filename) + + @property + def curdir(self): + suit_source = BuiltIn().get_variable_value("${SUITE SOURCE}") + curdir = os.path.dirname(suit_source) + return curdir class AirtestLibrary: @@ -43,32 +87,272 @@ def curdir(self): curdir = os.path.dirname(suit_source) return curdir - @deco.keyword("点击") - def touch( + def template( self, target: TargetType, - times: int = 1, threshold: Optional[float] = None, - record_pos: Optional[int] = None, target_pos: int = TargetPos.MID, - resolution=(), - rgb=False, - scale_max=800, - scale_step=0.005, + record_pos: Optional[Point] = None, + resolution: Any = None, + rgb: bool = False, + scale_max: int = 800, + scale_step: float = 0.005, ): - v = target + """ + 创建Airtest Template对象 + + `Target` 的路径是`robot`脚本的相对路径,也就是说你只需要将图片放到 `robot` + 相同目录下然后就可以相对路径的方式引用。 + + 例子: + + test.robot、btn_start.png 这两个文件都在同一个目录, + 那么`Template`可以直接引用`btn_start.png`,不需要复杂的转换。 + + ```robotframework + ${开始按钮} Template btn_start.png + ``` + + + + Args: + target (TargetType): _description_ + threshold (Optional[float], optional): _description_. Defaults to None. + target_pos (int, optional): _description_. Defaults to TargetPos.MID. + record_pos (Optional[Point], optional): _description_. Defaults to None. + resolution (Any, optional): _description_. Defaults to None. + rgb (bool, optional): _description_. Defaults to False. + scale_max (int, optional): _description_. Defaults to 800. + scale_step (float, optional): _description_. Defaults to 0.005. + + Returns: + _type_: _description_ + """ if isinstance(target, str): - v = Template( - os.path.join(self.curdir, target), - threshold=threshold, - record_pos=record_pos, - target_pos=target_pos, - resolution=resolution, - rgb=rgb, - scale_max=scale_max, - scale_step=scale_step, + return Template( + target, + threshold, + target_pos, + record_pos, + resolution, + rgb, + scale_max, + scale_step, ) - elif isinstance(target, Tuple): - v = target + elif isinstance(target, Template) or isinstance(target, Tuple): + return target + + @deco.keyword("点击") + def touch( + self, + target: TargetType, + times: int = 1, + ): + """ + 点击`Touch` + + NOTE: `threashold` 及其后面的参数可以无视,因为都会默认使用`airtest.core.settings:Settings`的配置。 + Args: + target (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + times (int, optional): 点击次数. Defaults to 1. + """ + v = self.template(target) touch(v, times=times) + + @deco.keyword("等待") + def wait( + self, + target: TargetType, + timeout: str, + interval: float = 0.5, + interval_func: Optional[Callable] = None, + ): + """ + 等待目标出现 `Wait` + + Args: + target (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + timeout (str): 超时,支持`robot`的时间字符串,如'1h 10s', '01:00:10' and '42'等,具体可以看`timestr_to_secs`。 + interval (float, optional): 等待检查间隔. Defaults to 0.5. + interval_func (Optional[str], optional): 每次检查失败时调用回调. Defaults to None. + + """ + timeout_secs = timestr_to_secs(timeout) + v = target + + if interval_func is not None: + + def _callback(): + return BuiltIn().run_keyword(interval_func) + + invoker = _callback + else: + invoker = None + + wait(v, timeout_secs, interval=interval, intervalfunc=invoker) + + def swipe( + self, + target1: TargetType, + target2: TargetType, + vector: Optional[Point] = None, + ): + """ + 滑动 `Swipe` + + 例子 + + ```robotframework + + 滑动 start_btn.png list_view + 滑动 start_btn.png (10,0) + 滑动 (10,10) vector=(20,20) + + ``` + + Args: + target1 (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + target2 (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + vector (Optional[Point], optional): 方向向量 如`(1,0)`-向右. Defaults to None. + """ + v1 = self.template( + target1, + ) + v2 = self.template( + target2, + ) + swipe(v1, v2, vector) + + @deco.keyword("存在") + def exists(self, target: TargetType) -> bool: + """ + 检查目标是否存在 + + NOTE: 不会引发异常 + + Args: + target (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + + Returns: + bool : 存在返回`true` + """ + v = self.template(target) + return exists(v) + + @deco.keyword("输入文字") + def text(self, _text: str, enter: bool = True): + """ + 输入文字 + + Args: + _text (str): 文字 + enter (bool, optional): 输入完后按回车. Defaults to True. + """ + text(_text, enter=enter) + + @deco.keyword("按键事件") + def keyevent(self, keyname: str, *args, **kwargs): + """ + 按键事件 + + Args: + keyname (str): 按键名或者按键码 + """ + keyevent(keyname, *args, **kwargs) + + @deco.keyword("截图") + def snapshot( + self, + filename: Optional[str] = None, + msg: str = "", + quality: Optional[int] = None, + max_size: Optional[int] = None, + ): + """ + 截图 + + Args: + filename (Optional[str], optional): 默认保存到LOG_DIR. Defaults to None. + msg (str, optional): 信息. Defaults to "". + quality (Optional[int], optional): 质量. Defaults to None. + max_size (Optional[int], optional): 最大尺寸. Defaults to None. + + Returns: + _type_: _description_ + """ + return snapshot(filename, msg=msg, quality=quality, max_size=max_size) + + @deco.keyword("睡眠") + def sleep(self, timeout: str): + """ + 睡眠 + + Args: + timeout (str): `robot`时间字符串,如`1h 2m 3s` `2min 3sec` `40 sec`等都能识别。 + """ + secs = timestr_to_secs(timeout) + sleep(secs) + + @deco.keyword("元素必须存在") + def assert_exists(self, target: TargetType, msg: str = ""): + """ + 断言 元素必须存在 + + Args: + target (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + msg (str, optional): 信息. Defaults to "". + """ + v = self.template(target) + assert_exists(v, msg) + + @deco.keyword("元素必须不存在") + def assert_not_exists(self, target: TargetType, msg: str = ""): + """ + 断言 元素必须不存在 + + + Args: + target (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + msg (str, optional): 信息. Defaults to "". + """ + v = self.template(target) + assert_not_exists(v, msg) + + @deco.keyword("必须相等") + def assert_equal( + self, + first: TargetType, + second: TargetType, + msg: str = "", + snapshot: bool = True, + ): + """ + 断言 必须相等 + + Args: + first (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + second (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + msg (str, optional): 信息. Defaults to "". + snapshot (bool, optional): 是否截图. Defaults to True. + """ + assert_equal(first, second, msg=msg, snapshot=snapshot) + + @deco.keyword("必须不相等") + def assert_not_equal( + self, + first: TargetType, + second: TargetType, + msg: str = "", + snapshot: bool = True, + ): + """ + 断言 必须不相等 + + Args: + first (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + second (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + msg (str, optional): 信息. Defaults to "". + snapshot (bool, optional): 是否截图. Defaults to True. + """ + assert_not_equal(first, second, msg=msg, snapshot=snapshot) diff --git a/robotframework_airtest/poco/__init__.py b/robotframework_airtest/poco/__init__.py index 313e274..d93380f 100644 --- a/robotframework_airtest/poco/__init__.py +++ b/robotframework_airtest/poco/__init__.py @@ -1,5 +1,16 @@ from .std import StdPocoLibrary from .unity import UnityPocoLibrary +from .android import AndroidUiAutomationPocoLibrary +from .cocosjs import CocosJsPocoLibrary +from .ios import IOSPocoLibrary +from .ue4 import UE4PocoLibrary -__all__ = ["StdPocoLibrary", "UnityPocoLibrary"] +__all__ = [ + "StdPocoLibrary", + "UnityPocoLibrary", + "AndroidUiAutomationPocoLibrary", + "CocosJsPocoLibrary", + "IOSPocoLibrary", + "UE4PocoLibrary", +] diff --git a/tests/test_airtest/test_airtest.robot b/tests/test_airtest/test_airtest.robot index 2f123f5..8906f94 100644 --- a/tests/test_airtest/test_airtest.robot +++ b/tests/test_airtest/test_airtest.robot @@ -1,9 +1,9 @@ *** Settings *** -Library robotframework_airtest.airtest.AirtestLibrary WITH NAME airtest -Library robotframework_airtest.device.DeviceLibrary WITH NAME device +Library robotframework_airtest.AirtestLibrary WITH NAME airtest +Library robotframework_airtest.DeviceLibrary WITH NAME device -Test Setup 初始化用例 -# Test Teardown 清理用例 +Test Setup 初始化用例 +Test Teardown 清理用例 *** Variables *** From d412a90d57f125da170ca032c21368da1132bd51 Mon Sep 17 00:00:00 2001 From: kaluluosi111 Date: Fri, 24 Nov 2023 11:54:20 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=8F=90=E4=BA=A4airtest=E5=8F=8A=E5=85=B6?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robotframework_airtest/airtest/__init__.py | 91 ++++++++++++++++----- tests/test_airtest/basic.png | Bin 0 -> 8872 bytes tests/test_airtest/drag_drop.png | Bin 0 -> 5086 bytes tests/test_airtest/shell.png | Bin 0 -> 29714 bytes tests/test_airtest/star.png | Bin 0 -> 50577 bytes tests/test_airtest/test_airtest.robot | 61 ++++++++++++++ tests/test_airtest/textbox.png | Bin 0 -> 8455 bytes 7 files changed, 130 insertions(+), 22 deletions(-) create mode 100644 tests/test_airtest/basic.png create mode 100644 tests/test_airtest/drag_drop.png create mode 100644 tests/test_airtest/shell.png create mode 100644 tests/test_airtest/star.png create mode 100644 tests/test_airtest/textbox.png diff --git a/robotframework_airtest/airtest/__init__.py b/robotframework_airtest/airtest/__init__.py index 3bf0086..2a103ef 100644 --- a/robotframework_airtest/airtest/__init__.py +++ b/robotframework_airtest/airtest/__init__.py @@ -18,6 +18,12 @@ assert_not_exists, assert_equal, assert_not_equal, + find_all, + get_clipboard, + set_clipboard, + pinch, + home, + wake, ) from airtest.utils.transform import TargetPos @@ -25,10 +31,10 @@ from robot.api import deco from robot.utils import timestr_to_secs -from typing import Any, Callable, Optional, Tuple, Union +from typing import Any, Callable, Literal, Optional, Tuple, Union Point = Tuple[float, float] -TargetType = Union["Template", Point, str] +TargetType = Union["Template", Point, str, dict] class Template(AirTemplate): @@ -38,7 +44,7 @@ def __init__( threshold: Optional[float] = None, target_pos=TargetPos.MID, record_pos: Optional[Point] = None, - resolution=..., + resolution=(), rgb: bool = False, scale_max: int = 800, scale_step: float = 0.005, @@ -54,8 +60,9 @@ def __init__( scale_max (int, optional): 最大缩放倍数. Defaults to 800. \n scale_step (float, optional): 缩放步进. Defaults to 0.005. \n """ + self.filename = os.path.join(self.curdir, filename) super().__init__( - filename, + self.filename, threshold, target_pos, record_pos, @@ -64,7 +71,6 @@ def __init__( scale_max, scale_step, ) - self.filename = os.path.join(self.curdir, filename) @property def curdir(self): @@ -93,7 +99,7 @@ def template( threshold: Optional[float] = None, target_pos: int = TargetPos.MID, record_pos: Optional[Point] = None, - resolution: Any = None, + resolution=(), rgb: bool = False, scale_max: int = 800, scale_step: float = 0.005, @@ -141,6 +147,8 @@ def template( ) elif isinstance(target, Template) or isinstance(target, Tuple): return target + elif isinstance(target, dict) and "result" in target: + return target.get("result") @deco.keyword("点击") def touch( @@ -157,6 +165,7 @@ def touch( target (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 times (int, optional): 点击次数. Defaults to 1. """ + v = self.template(target) touch(v, times=times) @@ -179,7 +188,7 @@ def wait( """ timeout_secs = timestr_to_secs(timeout) - v = target + v = self.template(target) if interval_func is not None: @@ -192,10 +201,11 @@ def _callback(): wait(v, timeout_secs, interval=interval, intervalfunc=invoker) + @deco.keyword("滑动") def swipe( self, target1: TargetType, - target2: TargetType, + target2: Optional[TargetType] = None, vector: Optional[Point] = None, ): """ @@ -219,9 +229,12 @@ def swipe( v1 = self.template( target1, ) - v2 = self.template( - target2, - ) + + v2 = None + if target2: + v2 = self.template( + target2, + ) swipe(v1, v2, vector) @deco.keyword("存在") @@ -294,7 +307,7 @@ def sleep(self, timeout: str): secs = timestr_to_secs(timeout) sleep(secs) - @deco.keyword("元素必须存在") + @deco.keyword("必须存在") def assert_exists(self, target: TargetType, msg: str = ""): """ 断言 元素必须存在 @@ -306,7 +319,7 @@ def assert_exists(self, target: TargetType, msg: str = ""): v = self.template(target) assert_exists(v, msg) - @deco.keyword("元素必须不存在") + @deco.keyword("必须不存在") def assert_not_exists(self, target: TargetType, msg: str = ""): """ 断言 元素必须不存在 @@ -322,17 +335,19 @@ def assert_not_exists(self, target: TargetType, msg: str = ""): @deco.keyword("必须相等") def assert_equal( self, - first: TargetType, - second: TargetType, + first: Any, + second: Any, msg: str = "", snapshot: bool = True, ): """ 断言 必须相等 + NOTE: 这个断言跟 `robot` 的断言区别在于这个会再Airtest日志中留截图日志 + Args: - first (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 - second (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + first (Any): 任何类型 + second (Any): 任何类型 msg (str, optional): 信息. Defaults to "". snapshot (bool, optional): 是否截图. Defaults to True. """ @@ -341,18 +356,50 @@ def assert_equal( @deco.keyword("必须不相等") def assert_not_equal( self, - first: TargetType, - second: TargetType, + first: Any, + second: Any, msg: str = "", snapshot: bool = True, ): """ - 断言 必须不相等 + 对比两个值或对象 + + NOTE: 这个断言跟 `robot` 的断言区别在于这个会再Airtest日志中留截图日志 Args: - first (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 - second (TargetType): 目标可以是坐标`Tuple`,也可以是`Template`,也可以是文件名。 + first (Any): 任何类型 + second (Any): 任何类型 msg (str, optional): 信息. Defaults to "". snapshot (bool, optional): 是否截图. Defaults to True. """ assert_not_equal(first, second, msg=msg, snapshot=snapshot) + + @deco.keyword("查找所有") + def find_all(self, target: TargetType): + v = self.template(target) + return find_all(v) + + @deco.keyword("获取剪贴板") + def get_clipboard(self, wda_bundle_id: Optional[str] = None): + return get_clipboard() + + @deco.keyword("设置剪贴板") + def set_clipboard(self, content: str): + set_clipboard(content) + + @deco.keyword("双指手势") + def pinch( + self, + in_or_out: Literal["in", "out"], + center: Optional[Point] = None, + percent: float = 0.5, + ): + pinch(in_or_out=in_or_out, center=center, percent=percent) + + @deco.keyword("Home键") + def home(self): + home() + + @deco.keyword("唤醒") + def wake(self): + wake() diff --git a/tests/test_airtest/basic.png b/tests/test_airtest/basic.png new file mode 100644 index 0000000000000000000000000000000000000000..4d7e810d2650801f43f4301454c866da09f038c3 GIT binary patch literal 8872 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 literal 0 HcmV?d00001 diff --git a/tests/test_airtest/drag_drop.png b/tests/test_airtest/drag_drop.png new file mode 100644 index 0000000000000000000000000000000000000000..1d782760b1f8c698af2fbe23f68e85af1d69b07e GIT binary patch literal 5086 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 R{`bdDPwSCpt-5{8{{j5i&ME)^ literal 0 HcmV?d00001 diff --git a/tests/test_airtest/shell.png b/tests/test_airtest/shell.png new file mode 100644 index 0000000000000000000000000000000000000000..1e2f160afe433c323a33f796402c2a635859865d GIT binary patch literal 29714 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⋐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 literal 0 HcmV?d00001 diff --git a/tests/test_airtest/star.png b/tests/test_airtest/star.png new file mode 100644 index 0000000000000000000000000000000000000000..02e4befb5fc945d59ad56d1243cae83b1e831272 GIT binary patch literal 50577 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 literal 0 HcmV?d00001 diff --git a/tests/test_airtest/test_airtest.robot b/tests/test_airtest/test_airtest.robot index 8906f94..0948ff4 100644 --- a/tests/test_airtest/test_airtest.robot +++ b/tests/test_airtest/test_airtest.robot @@ -1,6 +1,7 @@ *** Settings *** Library robotframework_airtest.AirtestLibrary WITH NAME airtest Library robotframework_airtest.DeviceLibrary WITH NAME device +Library OperatingSystem Test Setup 初始化用例 Test Teardown 清理用例 @@ -18,6 +19,66 @@ ${包名} com.NetEase 测试点击 airtest.点击 btn_start.png +测试等待 + airtest.等待 btn_start.png 30s + +测试滑动 + airtest.点击 btn_start.png + airtest.点击 drag_drop.png + airtest.滑动 star.png shell.png + +测试查找所有 + airtest.点击 btn_start.png + airtest.点击 drag_drop.png + ${stars} airtest.查找所有 star.png + FOR ${element} IN @{stars} + Log ${element} level=CONSOLE + airtest.滑动 ${element} shell.png + END + airtest.必须不存在 star.png + +测试存在 + ${存在} airtest.存在 btn_start.png + Should Be True ${存在} + +测试输入文字 + airtest.点击 btn_start.png + airtest.点击 basic.png + airtest.点击 textbox.png + airtest.输入文字 hello + +测试按键事件 + airtest.按键事件 HOME + airtest.必须不存在 btn_start.png + +测试截图 + airtest.截图 screenshot.png + File Should Exist screenshot.png + Remove File screenshot.png + +睡眠 + airtest.睡眠 2s + +断言 + airtest.必须存在 btn_start.png + airtest.必须不存在 star.png + airtest.必须相等 btn_start.png btn_start.png + airtest.必须不相等 btn_start.png star.png + +测试剪贴板 + airtest.设置剪贴板 hello + ${结果} airtest.获取剪贴板 + Should Be Equal As Strings ${结果} hello + +测试双指手势 + airtest.双指手势 in + +测试Home键 + airtest.Home键 + +测试唤醒 + airtest.唤醒 + *** Keywords *** 初始化用例 diff --git a/tests/test_airtest/textbox.png b/tests/test_airtest/textbox.png new file mode 100644 index 0000000000000000000000000000000000000000..eea890500e506a9a1f1b49c1f4c3a689a87eec63 GIT binary patch literal 8455 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

NHh z1=P-=(#k4aq3>MlhkZa-b=>FNTu5r6%FmDLY+C4V{#H;tsTzo}8dTb98|RT`R*Bq6 zkR&I8rU)kz^i_`7Ob-4|YeX)X`Vc0X(=Q%x2gP@l{q0ZY@zQx83rT~YAs|4doHt(}NuO~I z3!}<7^3pP&miXrZ!UV?3D_~K)jyqb&w*^Cpu++7*yTFyfDQ3X?UP)57XBEcemZm=L z0hK#k5YjG#8a{H2$x+-#Q<}c~K_v}tX=y3N#blmoVv^zTkD8A80O)IDVdwE*X+Yp= zdEGgxD81q@{_WMbNDK?)*T2tNp|L5(6Zq%r7vRb1s%S`d$v-_<2+|gMTAi&23&p?K z{O=`mUcYW)QuIc51XE=yw#WW+e(DBaC*mzaD}bpF_=HmAnS1