mangoautomation 1.0.41__tar.gz → 1.0.44__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mangoautomation might be problematic. Click here for more details.

Files changed (62) hide show
  1. {mangoautomation-1.0.41/mangoautomation.egg-info → mangoautomation-1.0.44}/PKG-INFO +3 -2
  2. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/tools/__init__.py +2 -1
  3. mangoautomation-1.0.44/mangoautomation/tools/_uiautodev.py +49 -0
  4. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/android/__init__.py +5 -1
  5. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/android/_application.py +6 -6
  6. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/android/_assertion.py +9 -9
  7. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/android/_equipment.py +26 -26
  8. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/android/_page.py +19 -19
  9. {mangoautomation-1.0.41 → mangoautomation-1.0.44/mangoautomation.egg-info}/PKG-INFO +3 -2
  10. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation.egg-info/SOURCES.txt +1 -0
  11. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation.egg-info/requires.txt +2 -1
  12. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/setup.py +7 -2
  13. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/LICENSE +0 -0
  14. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/MANIFEST.in +0 -0
  15. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/README.md +0 -0
  16. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/__init__.py +0 -0
  17. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/enums/__init__.py +0 -0
  18. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/enums/_base_enum.py +0 -0
  19. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/enums/_ui_enum.py +0 -0
  20. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/exceptions/__init__.py +0 -0
  21. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/exceptions/_error_msg.py +0 -0
  22. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/exceptions/_exceptions.py +0 -0
  23. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/models/__init__.py +0 -0
  24. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/models/_ui_model.py +0 -0
  25. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/tools/_mate.py +0 -0
  26. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/__init__.py +0 -0
  27. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/_async_element.py +0 -0
  28. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/_base_data.py +0 -0
  29. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/_driver_object.py +0 -0
  30. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/_sync_element.py +0 -0
  31. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/android/_customization.py +0 -0
  32. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/android/_element.py +0 -0
  33. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/android/_new_android.py +0 -0
  34. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/pc/__init__.py +0 -0
  35. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/pc/assertion.py +0 -0
  36. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/pc/customization.py +0 -0
  37. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/pc/element.py +0 -0
  38. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/pc/input_device.py +0 -0
  39. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/pc/new_windows.py +0 -0
  40. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/__init__.py +0 -0
  41. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/async_web/__init__.py +0 -0
  42. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/async_web/_assertion.py +0 -0
  43. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/async_web/_browser.py +0 -0
  44. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/async_web/_customization.py +0 -0
  45. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/async_web/_element.py +0 -0
  46. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/async_web/_input_device.py +0 -0
  47. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/async_web/_new_browser.py +0 -0
  48. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/async_web/_page.py +0 -0
  49. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/sync_web/__init__.py +0 -0
  50. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/sync_web/_assertion.py +0 -0
  51. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/sync_web/_browser.py +0 -0
  52. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/sync_web/_customization.py +0 -0
  53. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/sync_web/_element.py +0 -0
  54. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/sync_web/_input_device.py +0 -0
  55. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/sync_web/_new_browser.py +0 -0
  56. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation/uidrive/web/sync_web/_page.py +0 -0
  57. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation.egg-info/dependency_links.txt +0 -0
  58. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/mangoautomation.egg-info/top_level.txt +0 -0
  59. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/setup.cfg +0 -0
  60. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/tests/__init__.py +0 -0
  61. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/tests/test_ui_and.py +0 -0
  62. {mangoautomation-1.0.41 → mangoautomation-1.0.44}/tests/test_ui_web.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mangoautomation
3
- Version: 1.0.41
3
+ Version: 1.0.44
4
4
  Summary: 测试工具
5
5
  Home-page: https://gitee.com/mao-peng/testkit
6
6
  Author: 毛鹏
@@ -12,8 +12,9 @@ Requires-Dist: pydantic==2.9.2
12
12
  Requires-Dist: playwright==1.43.0
13
13
  Requires-Dist: uiautomation==2.0.20
14
14
  Requires-Dist: uiautomator2==3.2.5
15
- Requires-Dist: mangotools>=1.0.23
15
+ Requires-Dist: mangotools>=1.0.28
16
16
  Requires-Dist: adbutils~=2.8.9
17
+ Requires-Dist: uiautodev==0.9.0
17
18
 
18
19
  # testkit
19
20
 
@@ -6,8 +6,9 @@
6
6
  import sys
7
7
 
8
8
  from ..tools._mate import Meta
9
+ from ..tools._uiautodev import start_uiautodev, stop_uiautodev
9
10
 
10
11
  python_version = sys.version_info
11
12
  if f"{python_version.major}.{python_version.minor}" != "3.10":
12
13
  raise Exception("必须使用>Python3.10.4")
13
- __all__ = ['Meta']
14
+ __all__ = ['Meta', 'start_uiautodev', 'stop_uiautodev']
@@ -0,0 +1,49 @@
1
+ # -*- coding: utf-8 -*-
2
+ # @Project: 芒果测试平台
3
+ # @Description:
4
+ # @Time : 2025-07-01 10:43
5
+ # @Author : 毛鹏
6
+
7
+ import subprocess
8
+
9
+ import time
10
+
11
+ uiautodev_process = None
12
+
13
+
14
+ def start_uiautodev():
15
+ """启动 uiautodev 服务"""
16
+ global uiautodev_process
17
+ if uiautodev_process is not None:
18
+ return "uiautodev 服务已在运行!"
19
+ try:
20
+ # 启动 uiautodev 服务(后台运行)
21
+ uiautodev_process = subprocess.Popen(
22
+ ['uiauto.dev'],
23
+ stdout=subprocess.PIPE,
24
+ stderr=subprocess.PIPE,
25
+ text=True
26
+ )
27
+ print("uiautodev 服务启动成功!PID:", uiautodev_process.pid)
28
+ return 'https://uiauto.devsleep.com/'
29
+ except Exception as e:
30
+ return f"启动 uiautodev 服务失败:{e}"
31
+
32
+
33
+ def stop_uiautodev():
34
+ """关闭 uiautodev 服务"""
35
+ global uiautodev_process
36
+
37
+ if uiautodev_process is None:
38
+ return "uiautodev 服务未运行!"
39
+ try:
40
+ uiautodev_process.terminate()
41
+ uiautodev_process.wait(timeout=5)
42
+ return "uiautodev 服务已关闭"
43
+ except subprocess.TimeoutExpired:
44
+ uiautodev_process.kill()
45
+ return "uiautodev 服务被强制终止"
46
+ except Exception as e:
47
+ return f"关闭 uiautodev 服务失败:{e}"
48
+ finally:
49
+ uiautodev_process = None
@@ -124,4 +124,8 @@ class AndroidDriver(AndroidPage,
124
124
  text = self.a_get_text(loc)
125
125
  except Exception:
126
126
  pass
127
- return loc, loc.count, text
127
+ if exp == ElementExpEnum.XPATH.value:
128
+ count = len(loc.all())
129
+ else:
130
+ count = loc.count
131
+ return loc, count, text
@@ -21,8 +21,8 @@ class AndroidApplication(metaclass=Meta):
21
21
  def is_app_installed(self, package_name: str) -> bool:
22
22
  return any(package_name in str(i) for i in self.base_data.android.shell("pm list packages"))
23
23
 
24
- @sync_method_callback('android', '应用操作', [
25
- MethodModel(f='package_name', p='请输入应用名称', d=True)])
24
+ @sync_method_callback('android', '应用操作', 0,
25
+ [MethodModel(f='package_name', p='请输入应用名称', d=True)])
26
26
  def a_start_app(self, package_name: str):
27
27
  """启动应用"""
28
28
  if not package_name:
@@ -32,7 +32,7 @@ class AndroidApplication(metaclass=Meta):
32
32
  self.base_data.android.app_start(package_name)
33
33
  time.sleep(4)
34
34
 
35
- @sync_method_callback('android', '应用操作', [
35
+ @sync_method_callback('android', '应用操作', 1,[
36
36
  MethodModel(f='package_name', p='请输入应用名称', d=True)])
37
37
  def a_close_app(self, package_name: str):
38
38
  """关闭应用"""
@@ -43,7 +43,7 @@ class AndroidApplication(metaclass=Meta):
43
43
 
44
44
  self.base_data.android.app_stop(package_name)
45
45
 
46
- @sync_method_callback('android', '应用操作', [
46
+ @sync_method_callback('android', '应用操作', 2,[
47
47
  MethodModel(f='package_name', p='请输入应用名称', d=True)])
48
48
  def a_clear_app(self, package_name: str):
49
49
  """清除app数据"""
@@ -54,12 +54,12 @@ class AndroidApplication(metaclass=Meta):
54
54
 
55
55
  self.base_data.android.app_clear(package_name)
56
56
 
57
- @sync_method_callback('android', '应用操作', )
57
+ @sync_method_callback('android', '应用操作',3 )
58
58
  def a_app_stop_all(self):
59
59
  """停止所有app"""
60
60
  self.base_data.android.app_stop_all()
61
61
 
62
- @sync_method_callback('android', '应用操作', [
62
+ @sync_method_callback('android', '应用操作',4, [
63
63
  MethodModel(f='package_name', p='请输入应用名称列表', d=True)])
64
64
  def a_app_stop_appoint(self, package_name_list: list):
65
65
  """停止除指定app外所有app"""
@@ -16,20 +16,20 @@ class AndroidAssertion(metaclass=Meta):
16
16
  def __init__(self, base_data: BaseData):
17
17
  self.base_data = base_data
18
18
 
19
- @sync_method_callback('ass_android', '元素断言', [
19
+ @sync_method_callback('ass_android', '元素断言', 1,[
20
20
  MethodModel(f='actual')])
21
21
  def a_assert_ele_exists(self, actual: UiObject):
22
22
  """元素存在"""
23
23
  assert actual.count
24
24
 
25
- @sync_method_callback('ass_android', '元素断言', [
25
+ @sync_method_callback('ass_android', '元素断言', 2,[
26
26
  MethodModel(f='actual'),
27
27
  MethodModel(f='expect', p='请输入预期内容', d=True)])
28
28
  def a_assert_ele_count(self, actual: UiObject, expect):
29
29
  """元素计数"""
30
30
  assert int(actual.count) == int(expect)
31
31
 
32
- @sync_method_callback('ass_android', '元素断言', [
32
+ @sync_method_callback('ass_android', '元素断言', 3,[
33
33
  MethodModel(f='actual'),
34
34
  MethodModel(f='expect', p='请输入预期文本', d=True)])
35
35
  def a_assert_ele_text(self, actual: UiObject, expect: str):
@@ -37,35 +37,35 @@ class AndroidAssertion(metaclass=Meta):
37
37
  assert actual.get_text() == expect, \
38
38
  f"实际='{actual.get_text()}', 预期='{expect}'"
39
39
 
40
- @sync_method_callback('ass_android', '元素断言', [
40
+ @sync_method_callback('ass_android', '元素断言', 4,[
41
41
  MethodModel(f='actual')])
42
42
  def a_assert_ele_clickable_true(self, actual: UiObject):
43
43
  """元素可点击"""
44
44
  assert actual.info['clickable'], \
45
45
  f"实际={actual.info['clickable']}, 预期=可点击"
46
46
 
47
- @sync_method_callback('ass_android', '元素断言', [
47
+ @sync_method_callback('ass_android', '元素断言', 5,[
48
48
  MethodModel(f='actual')])
49
49
  def a_assert_ele_clickable_false(self, actual: UiObject):
50
50
  """元素不可点击"""
51
51
  assert not actual.info['clickable'], \
52
52
  f"实际={actual.info['clickable']}, 预期=元素不可点击"
53
53
 
54
- @sync_method_callback('ass_android', '元素断言', [
54
+ @sync_method_callback('ass_android', '元素断言', 6,[
55
55
  MethodModel(f='actual')])
56
56
  def a_assert_ele_visible_true(self, actual: UiObject):
57
57
  """元素可见"""
58
58
  assert actual.exists and actual.info['visible'], \
59
59
  f"实际={actual.info['visible']}, 预期=元素可见"
60
60
 
61
- @sync_method_callback('ass_android', '元素断言', [
61
+ @sync_method_callback('ass_android', '元素断言', 7,[
62
62
  MethodModel(f='actual')])
63
63
  def a_assert_ele_visible_false(self, actual: UiObject):
64
64
  """元素不可见"""
65
65
  assert actual.exists and not actual.info['visible'], \
66
66
  f"实际={actual.info['visible']}, 预期=元素不可见"
67
67
 
68
- @sync_method_callback('ass_android', '元素断言', [
68
+ @sync_method_callback('ass_android', '元素断言', 8,[
69
69
  MethodModel(f='expect', p='请输入弹窗标题文本', d=False)])
70
70
  def a_assert_dialog_exists(self, expect: str):
71
71
  """弹窗存在"""
@@ -73,7 +73,7 @@ class AndroidAssertion(metaclass=Meta):
73
73
  className="android.app.AlertDialog")
74
74
  assert dialog.exists, "未找到预期弹窗"
75
75
 
76
- @sync_method_callback('ass_android', '元素断言', [
76
+ @sync_method_callback('ass_android', '元素断言', 9,[
77
77
  MethodModel(f='actual'),
78
78
  MethodModel(f='expect', p='请输入断言目标文本', d=True)])
79
79
  def a_assert_ele_in_list(self, actual: UiObject, expect: str):
@@ -4,10 +4,10 @@
4
4
  # @Author : 毛鹏
5
5
  from time import sleep
6
6
 
7
- from ...tools import Meta
8
- from ...uidrive._base_data import BaseData
9
7
  from mangotools.decorator import sync_method_callback
10
8
  from mangotools.models import MethodModel
9
+ from ...tools import Meta
10
+ from ...uidrive._base_data import BaseData
11
11
 
12
12
 
13
13
  class AndroidEquipment(metaclass=Meta):
@@ -22,129 +22,129 @@ class AndroidEquipment(metaclass=Meta):
22
22
  """强制等待"""
23
23
  sleep(time_)
24
24
 
25
- @sync_method_callback('android', '设备操作', )
25
+ @sync_method_callback('android', '设备操作', 2)
26
26
  def a_screen_on(self):
27
27
  """打开屏幕"""
28
28
  self.base_data.android.screen_on()
29
29
  self.a_sleep(1)
30
30
 
31
- @sync_method_callback('android', '设备操作', )
31
+ @sync_method_callback('android', '设备操作', 3)
32
32
  def a_screen_off(self):
33
33
  """关闭屏幕"""
34
34
  self.base_data.android.screen_off()
35
35
  self.a_sleep(1)
36
36
 
37
- @sync_method_callback('android', '设备操作', )
37
+ @sync_method_callback('android', '设备操作', 4)
38
38
  def a_swipe_left(self):
39
39
  """获取屏幕开关状态"""
40
40
  self.base_data.android.info.get('screenOn')
41
41
 
42
- @sync_method_callback('android', '设备操作', )
42
+ @sync_method_callback('android', '设备操作', 5)
43
43
  def a_get_window_size(self):
44
44
  """提取屏幕尺寸"""
45
45
  w, h = self.base_data.android.window_size()
46
46
  return w, h
47
47
 
48
- @sync_method_callback('android', '设备操作', [
48
+ @sync_method_callback('android', '设备操作', 6, [
49
49
  MethodModel(f='feli_path', p='请输入计算机文件路径', d=True),
50
50
  MethodModel(f='catalogue', p='请输入设备目录', d=True)])
51
51
  def a_push(self, feli_path, catalogue):
52
52
  """推送一个文件到设备"""
53
53
  self.base_data.android.push(feli_path, catalogue)
54
54
 
55
- @sync_method_callback('android', '设备操作', [
55
+ @sync_method_callback('android', '设备操作', 7, [
56
56
  MethodModel(f='feli_path', p='请输入设备文件路径', d=True),
57
57
  MethodModel(f='catalogue', p='请输入计算机目录', d=True)])
58
58
  def a_pull(self, feli_path, catalogue):
59
59
  """提取文件"""
60
60
  self.base_data.android.pull(feli_path, catalogue)
61
61
 
62
- @sync_method_callback('android', '设备操作', )
62
+ @sync_method_callback('android', '设备操作', 8)
63
63
  def a_unlock(self):
64
64
  """解锁屏幕"""
65
65
  self.base_data.android.unlock()
66
66
 
67
- @sync_method_callback('android', '设备操作', )
67
+ @sync_method_callback('android', '设备操作', 9)
68
68
  def a_press_home(self):
69
69
  """按home键"""
70
70
  self.base_data.android.press('home')
71
71
 
72
- @sync_method_callback('android', '设备操作', )
72
+ @sync_method_callback('android', '设备操作', 10)
73
73
  def a_press_back(self):
74
74
  """按back键"""
75
75
  self.base_data.android.press('back')
76
76
 
77
- @sync_method_callback('android', '设备操作', )
77
+ @sync_method_callback('android', '设备操作', 11)
78
78
  def a_press_left(self):
79
79
  """按left键"""
80
80
  self.base_data.android.press('left')
81
81
 
82
- @sync_method_callback('android', '设备操作', )
82
+ @sync_method_callback('android', '设备操作', 12)
83
83
  def a_press_right(self):
84
84
  """按right键"""
85
85
  self.base_data.android.press('right')
86
86
 
87
- @sync_method_callback('android', '设备操作', )
87
+ @sync_method_callback('android', '设备操作', 13)
88
88
  def a_press_up(self):
89
89
  """按up键"""
90
90
  self.base_data.android.press('up')
91
91
 
92
- @sync_method_callback('android', '设备操作', )
92
+ @sync_method_callback('android', '设备操作', 14)
93
93
  def a_press_down(self):
94
94
  """按down键"""
95
95
  self.base_data.android.press('down')
96
96
 
97
- @sync_method_callback('android', '设备操作', )
97
+ @sync_method_callback('android', '设备操作', 15)
98
98
  def a_press_center(self):
99
99
  """按center键"""
100
100
  self.base_data.android.press('center')
101
101
 
102
- @sync_method_callback('android', '设备操作', )
102
+ @sync_method_callback('android', '设备操作', 16)
103
103
  def a_press_menu(self):
104
104
  """按menu键"""
105
105
  self.base_data.android.press('menu')
106
106
 
107
- @sync_method_callback('android', '设备操作', )
107
+ @sync_method_callback('android', '设备操作', 17)
108
108
  def a_press_search(self):
109
109
  """按search键"""
110
110
  self.base_data.android.press('search')
111
111
 
112
- @sync_method_callback('android', '设备操作', )
112
+ @sync_method_callback('android', '设备操作', 18)
113
113
  def a_press_enter(self):
114
114
  """按enter键"""
115
115
  self.base_data.android.press('enter')
116
116
 
117
- @sync_method_callback('android', '设备操作', )
117
+ @sync_method_callback('android', '设备操作', 19)
118
118
  def a_press_delete(self):
119
119
  """按delete键"""
120
120
  self.base_data.android.press('delete')
121
121
 
122
- @sync_method_callback('android', '设备操作', )
122
+ @sync_method_callback('android', '设备操作', 20)
123
123
  def a_press_recent(self):
124
124
  """按recent键"""
125
125
  self.base_data.android.press('recent')
126
126
 
127
- @sync_method_callback('android', '设备操作', )
127
+ @sync_method_callback('android', '设备操作', 21)
128
128
  def a_press_volume_up(self):
129
129
  """按volume_up键"""
130
130
  self.base_data.android.press('volume_up')
131
131
 
132
- @sync_method_callback('android', '设备操作', )
132
+ @sync_method_callback('android', '设备操作', 22)
133
133
  def a_press_volume_down(self):
134
134
  """按volume_down键"""
135
135
  self.base_data.android.press('volume_down')
136
136
 
137
- @sync_method_callback('android', '设备操作', )
137
+ @sync_method_callback('android', '设备操作', 23)
138
138
  def a_press_volume_mute(self):
139
139
  """按volume_mute键"""
140
140
  self.base_data.android.press('volume_mute')
141
141
 
142
- @sync_method_callback('android', '设备操作', )
142
+ @sync_method_callback('android', '设备操作', 24)
143
143
  def a_press_camera(self):
144
144
  """按camera键"""
145
145
  self.base_data.android.press('camera')
146
146
 
147
- @sync_method_callback('android', '设备操作', )
147
+ @sync_method_callback('android', '设备操作', 25)
148
148
  def a_press_power(self):
149
149
  """按power键"""
150
150
  self.base_data.android.press('power')
@@ -6,10 +6,10 @@ import os.path
6
6
 
7
7
  from uiautomator2 import Direction
8
8
 
9
- from ...tools import Meta
10
- from ...uidrive._base_data import BaseData
11
9
  from mangotools.decorator import sync_method_callback
12
10
  from mangotools.models import MethodModel
11
+ from ...tools import Meta
12
+ from ...uidrive._base_data import BaseData
13
13
 
14
14
 
15
15
  class AndroidPage(metaclass=Meta):
@@ -18,27 +18,27 @@ class AndroidPage(metaclass=Meta):
18
18
  def __init__(self, base_data: BaseData):
19
19
  self.base_data = base_data
20
20
 
21
- @sync_method_callback('android', '页面操作')
21
+ @sync_method_callback('android', '页面操作', 1)
22
22
  def a_swipe_right(self):
23
23
  """右滑"""
24
24
  self.base_data.android.swipe_ext(Direction.HORIZ_FORWARD)
25
25
 
26
- @sync_method_callback('android', '页面操作')
26
+ @sync_method_callback('android', '页面操作', 2)
27
27
  def a_swipe_left(self):
28
28
  """左滑"""
29
29
  self.base_data.android.swipe_ext(Direction.HORIZ_BACKWARD)
30
30
 
31
- @sync_method_callback('android', '页面操作')
31
+ @sync_method_callback('android', '页面操作', 3)
32
32
  def a_swipe_up(self):
33
33
  """上滑"""
34
34
  self.base_data.android.swipe_ext(Direction.FORWARD)
35
35
 
36
- @sync_method_callback('android', '页面操作')
36
+ @sync_method_callback('android', '页面操作', 4)
37
37
  def a_swipe_down(self):
38
38
  """下滑"""
39
39
  self.base_data.android.swipe_ext(Direction.BACKWARD)
40
40
 
41
- @sync_method_callback('android', '页面操作', [
41
+ @sync_method_callback('android', '页面操作', 5, [
42
42
  MethodModel(f='sx', p='请输入sx坐标', d=True),
43
43
  MethodModel(f='sy', p='请输入sy坐标', d=True),
44
44
  MethodModel(f='ex', p='请输入ex坐标', d=True),
@@ -47,7 +47,7 @@ class AndroidPage(metaclass=Meta):
47
47
  """坐标滑动"""
48
48
  self.base_data.android.swipe(sx, sy, ex, ey, 0.5)
49
49
 
50
- @sync_method_callback('android', '页面操作', [
50
+ @sync_method_callback('android', '页面操作', 6, [
51
51
  MethodModel(f='sx', p='请输入sx坐标', d=True),
52
52
  MethodModel(f='sy', p='请输入sy坐标', d=True),
53
53
  MethodModel(f='ex', p='请输入ex坐标', d=True),
@@ -56,18 +56,18 @@ class AndroidPage(metaclass=Meta):
56
56
  """坐标拖动"""
57
57
  self.base_data.android.drag(sx, sy, ex, ey, 0.5)
58
58
 
59
- @sync_method_callback('android', '页面操作')
59
+ @sync_method_callback('android', '页面操作', 7)
60
60
  def a_open_quick_settings(self):
61
61
  """打开快速通知"""
62
62
  self.base_data.android.open_quick_settings()
63
63
 
64
- @sync_method_callback('android', '页面操作', [
64
+ @sync_method_callback('android', '页面操作', 8, [
65
65
  MethodModel(f='file_name', p='请输入截图文件名称', d=True)])
66
66
  def a_screenshot(self, file_name: str):
67
67
  """屏幕截图"""
68
68
  self.base_data.android.screenshot(filename=os.path.join(self.base_data.screenshot_path, file_name))
69
69
 
70
- @sync_method_callback('android', '页面操作', [
70
+ @sync_method_callback('android', '页面操作', 9, [
71
71
  MethodModel(f='x', p='请输入按下的x坐标', d=True),
72
72
  MethodModel(f='y', p='请输入按下的x坐标', d=True),
73
73
  MethodModel(f='time_', p='请输入长按时间', d=True)])
@@ -75,42 +75,42 @@ class AndroidPage(metaclass=Meta):
75
75
  """长按屏幕N秒"""
76
76
  self.base_data.android.long_click(x, y, time_)
77
77
 
78
- @sync_method_callback('android', '页面操作')
78
+ @sync_method_callback('android', '页面操作', 10)
79
79
  def a_set_orientation_natural(self):
80
80
  """设置为natural"""
81
81
  self.base_data.android.set_orientation("natural")
82
82
 
83
- @sync_method_callback('android', '页面操作')
83
+ @sync_method_callback('android', '页面操作', 11)
84
84
  def a_set_orientation_left(self):
85
85
  """设置为natural"""
86
86
  self.base_data.android.set_orientation("left")
87
87
 
88
- @sync_method_callback('android', '页面操作')
88
+ @sync_method_callback('android', '页面操作', 12)
89
89
  def a_set_orientation_right(self):
90
90
  """设置为right"""
91
91
  self.base_data.android.set_orientation("right")
92
92
 
93
- @sync_method_callback('android', '页面操作')
93
+ @sync_method_callback('android', '页面操作', 13)
94
94
  def a_set_orientation_upsidedown(self):
95
95
  """设置为upsidedown"""
96
96
  self.base_data.android.set_orientation("upsidedown")
97
97
 
98
- @sync_method_callback('android', '页面操作')
98
+ @sync_method_callback('android', '页面操作', 14)
99
99
  def a_freeze_rotation(self):
100
100
  """冻结旋转"""
101
101
  self.base_data.android.freeze_rotation()
102
102
 
103
- @sync_method_callback('android', '页面操作')
103
+ @sync_method_callback('android', '页面操作', 15)
104
104
  def a_freeze_rotation_false(self):
105
105
  """取消冻结旋转"""
106
106
  self.base_data.android.freeze_rotation(False)
107
107
 
108
- @sync_method_callback('android', '页面操作')
108
+ @sync_method_callback('android', '页面操作', 16)
109
109
  def a_dump_hierarchy(self):
110
110
  """获取转储的内容"""
111
111
  return self.base_data.android.dump_hierarchy()
112
112
 
113
- @sync_method_callback('android', '页面操作')
113
+ @sync_method_callback('android', '页面操作', 17)
114
114
  def a_open_notification(self):
115
115
  """打开通知"""
116
116
  return self.base_data.android.dump_hierarchy()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mangoautomation
3
- Version: 1.0.41
3
+ Version: 1.0.44
4
4
  Summary: 测试工具
5
5
  Home-page: https://gitee.com/mao-peng/testkit
6
6
  Author: 毛鹏
@@ -12,8 +12,9 @@ Requires-Dist: pydantic==2.9.2
12
12
  Requires-Dist: playwright==1.43.0
13
13
  Requires-Dist: uiautomation==2.0.20
14
14
  Requires-Dist: uiautomator2==3.2.5
15
- Requires-Dist: mangotools>=1.0.23
15
+ Requires-Dist: mangotools>=1.0.28
16
16
  Requires-Dist: adbutils~=2.8.9
17
+ Requires-Dist: uiautodev==0.9.0
17
18
 
18
19
  # testkit
19
20
 
@@ -18,6 +18,7 @@ mangoautomation/models/__init__.py
18
18
  mangoautomation/models/_ui_model.py
19
19
  mangoautomation/tools/__init__.py
20
20
  mangoautomation/tools/_mate.py
21
+ mangoautomation/tools/_uiautodev.py
21
22
  mangoautomation/uidrive/__init__.py
22
23
  mangoautomation/uidrive/_async_element.py
23
24
  mangoautomation/uidrive/_base_data.py
@@ -3,5 +3,6 @@ pydantic==2.9.2
3
3
  playwright==1.43.0
4
4
  uiautomation==2.0.20
5
5
  uiautomator2==3.2.5
6
- mangotools>=1.0.23
6
+ mangotools>=1.0.28
7
7
  adbutils~=2.8.9
8
+ uiautodev==0.9.0
@@ -1,6 +1,6 @@
1
1
  from setuptools import setup, find_packages
2
2
 
3
- __version__ = '1.0.41'
3
+ __version__ = '1.0.44'
4
4
 
5
5
  with open("README.md", "r", encoding='utf-8') as fh:
6
6
  long_description = fh.read()
@@ -21,8 +21,9 @@ setup(
21
21
  'playwright==1.43.0',
22
22
  'uiautomation==2.0.20',
23
23
  'uiautomator2==3.2.5',
24
- 'mangotools>=1.0.23',
24
+ 'mangotools>=1.0.28',
25
25
  'adbutils~=2.8.9',
26
+ 'uiautodev==0.9.0',
26
27
 
27
28
  ],
28
29
  classifiers=[
@@ -36,8 +37,12 @@ setup(
36
37
  python -m pip install --upgrade setuptools wheel
37
38
  python -m pip install --upgrade twine
38
39
 
40
+ $env:TWINE_USERNAME = "__token__"
41
+ $env:TWINE_PASSWORD = ""
42
+
39
43
  python setup.py check
40
44
  python setup.py sdist bdist_wheel
41
45
  twine upload --repository-url https://upload.pypi.org/legacy/ dist/*
42
46
 
47
+ twine upload dist/*
43
48
  """