ms-vite-plugin 1.4.43 → 1.4.46

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.
@@ -1,67 +1,92 @@
1
- # 点阵 OCR 模块(dotocr
1
+ # 点阵 OCR 模块 (dotocr)
2
2
 
3
- `dotocr` 使用图色工具生成的固定像素点阵字库识别文字。字库保存在项目的 `res/fonts` 目录,使用方式与 YOLO 模型一致:先加载资源取得字库 ID,再复用该 ID 进行识别,使用完毕后释放。
3
+ 点阵 OCR 模块基于图色工具生成的固定像素点阵字库,提供精确的文字识别与查找功能。字库保存在项目的 `res/fonts` 目录,使用前需先加载字库取得字库 ID,再复用该 ID 进行识别,使用完毕后释放。
4
4
 
5
5
  点阵模板按照制作时的原始像素尺寸匹配,不会自动缩放到其他分辨率。目标文字的字号、缩放比例或像素形状发生变化时,应制作对应的字库特征。
6
6
 
7
+ ## 功能概览
8
+
9
+ - **字库管理**: 加载、缓存和释放项目字库
10
+ - **文字识别**: 返回按阅读顺序排列的识别结果数组
11
+ - **文本查找**: 先识别再按行定位目标串,返回命中位置的绝对坐标
12
+ - **多源输入**: 支持屏幕截图、图片文件、URL 或 imageId
13
+ - **区域识别**: 支持指定区域的精确文字识别
14
+ - **绝对坐标**: 裁剪区域内的结果会映射回原图或全屏坐标
15
+ - **资源控制**: 完整的字库生命周期管理
16
+
7
17
  ## 数据类型
8
18
 
9
19
  ### OCRChar
10
20
 
21
+ 识别结果的数据结构,包含完整的文本信息和位置数据。
22
+
11
23
  ```python
12
24
  from kuaijs._types import KuaiJSNamespace
13
25
 
14
26
  class OCRChar(KuaiJSNamespace):
15
- text: str
16
- confidence: float
17
- x: int
18
- y: int
19
- ex: int
20
- ey: int
21
- width: int
22
- height: int
23
- centerX: int
24
- centerY: int
27
+ text: str # 识别的文本内容
28
+ confidence: float # 识别置信度 (0-1)
29
+ x: int # 文本区域左上角 x 坐标
30
+ y: int # 文本区域左上角 y 坐标
31
+ ex: int # 文本区域右下角 x 坐标
32
+ ey: int # 文本区域右下角 y 坐标
33
+ width: int # 文本区域宽度
34
+ height: int # 文本区域高度
35
+ centerX: int # 文本区域中心点 x 坐标
36
+ centerY: int # 文本区域中心点 y 坐标
25
37
  ```
26
38
 
27
- | 字段名 | 类型 | 描述 |
28
- | -------------------- | ----- | -------------------------------------- |
29
- | `OCRChar.text` | str | 识别文本;查找结果中为命中的目标字符串 |
30
- | `confidence` | float | 置信度,范围为 0-1 |
31
- | `x`, `y` | int | 结果区域左上角绝对坐标 |
32
- | `ex`, `ey` | int | 结果区域右下角绝对坐标 |
33
- | `width`, `height` | int | 结果区域宽度和高度 |
34
- | `centerX`, `centerY` | int | 结果区域中心点绝对坐标 |
39
+ **数据结构说明:**
40
+
41
+ | 字段 | 类型 | 描述 |
42
+ | ------------------ | ----- | -------------------------------------------------------- |
43
+ | `text` | str | 识别出的文本内容;查找结果中为命中的目标字符串 |
44
+ | `confidence` | float | 识别置信度,范围 0-1,值越高表示识别越准确 |
45
+ | `x, y, ex, ey` | int | 文本区域的坐标,分别为左上角和右下角的 x、y 绝对坐标 |
46
+ | `width, height` | int | 文本区域的宽度和高度 |
47
+ | `centerX, centerY` | int | 文本区域的中心点绝对坐标 |
35
48
 
36
49
  ## API 参考
37
50
 
38
51
  ### 字库管理
39
52
 
40
- #### `loadFont` - 加载并缓存字库
53
+ #### `loadFont` - 加载并缓存点阵字库
54
+
55
+ 加载字库是使用点阵识别功能的前提。建议在脚本初始化时加载一次并保存 `font_id`,后续识别时复用,不要每次识别都重新加载。
41
56
 
42
57
  ```python
43
58
  def loadFont(fontPath: str) -> Optional[str]
44
59
  ```
45
60
 
61
+ **参数:**
62
+
46
63
  | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
47
64
  | ---------- | ---- | -------- | ------ | --------------------------------------------------------------------------- |
48
65
  | `fontPath` | str | 是 | | 资源路径,运行时会自动处理 `res` 目录解析;常见写法如 `/fonts/default.json` |
49
66
 
50
- **返回值:**加载成功返回 `fontId`,失败返回 `None`。加载后的字库 ID 会复用到后续识别与释放流程。
67
+ **返回值:**
68
+
69
+ | 类型 | 描述 |
70
+ | ---------------- | ----------------------------------------- |
71
+ | `Optional[str]` | 加载成功返回字库 ID 字符串,失败返回 None |
72
+
73
+ **示例:**
51
74
 
52
75
  ```python
53
76
  from kuaijs import dotocr
54
77
 
55
78
  font_id = dotocr.loadFont("/fonts/default.json")
56
79
  if not font_id:
57
- raise RuntimeError("字库加载失败")
80
+ print("字库加载失败")
81
+ else:
82
+ print(f"字库加载成功: {font_id}")
58
83
  ```
59
84
 
60
- 建议在脚本初始化时加载一次并保存 `font_id`,后续识别时复用,不要每次识别都重新加载。
61
-
62
85
  ### 文字识别
63
86
 
64
- #### `recognizeAbs` - 识别文字并返回绝对坐标
87
+ #### `recognizeAbs` - 执行点阵 OCR 识别,并将结果坐标映射为原图/全屏绝对坐标
88
+
89
+ 传入裁剪区域时,返回坐标会映射回原图或全屏坐标,可直接用于点击。结果按行从上到下、同一行从左到右排列。颜色按字库各字自带的前景色/偏色匹配,无需额外传色。
65
90
 
66
91
  ```python
67
92
  def recognizeAbs(
@@ -75,25 +100,39 @@ def recognizeAbs(
75
100
  ) -> List[OCRChar]
76
101
  ```
77
102
 
78
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
79
- | --------------------- | ----- | -------- | ------ | -------------------------------------------------------------------------------------------- |
80
- | `fontId` | str | | | `loadFont` 返回的字库 ID |
81
- | `input` | str | | | 输入源,支持 `"screen"`、图片文件路径、URL imageId |
82
- | `x`, `y` | int | | 0 | 裁剪区域左上角坐标 |
83
- | `ex`, `ey` | int | | 0 | 裁剪区域右下角坐标;`ex` 或 `ey` 为 0 时分别使用图像宽度或高度 |
84
- | `confidenceThreshold` | float | 否 | 0.8 | 相似度下限;`<=0` 时按 `0.8`;低于阈值的字符会被过滤;`>0.95` 时要求像素完全一致 |
103
+ **参数:**
104
+
105
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
106
+ | --------------------- | ----- | -------- | ------ | --------------------------------------------------------------------------------------------- |
107
+ | `fontId` | str | | | 字库 ID,通过 `loadFont` 获取 |
108
+ | `input` | str | | | 输入源,支持 `"screen"`、图片文件路径、URLimageId |
109
+ | `x` | int | 否 | 0 | 裁剪区域左上角 x 坐标;全屏识别传 0 |
110
+ | `y` | int | 否 | 0 | 裁剪区域左上角 y 坐标;全屏识别传 0 |
111
+ | `ex` | int | 否 | 0 | 裁剪区域右下角 x 坐标;全屏识别传 0;为 0 时使用图像宽度 |
112
+ | `ey` | int | 否 | 0 | 裁剪区域右下角 y 坐标;全屏识别传 0;为 0 时使用图像高度 |
113
+ | `confidenceThreshold` | float | 否 | 0.8 | 相似度下限;`<=0` 时按 `0.8`;低于阈值的字符会被过滤;`>0.95` 时要求像素完全一致 |
114
+
115
+ **返回值:**
85
116
 
86
- **返回值:**`List[OCRChar]`。按行从上到下、同一行从左到右排列。颜色按字库各字自带的前景色/偏色匹配,无需额外传色。
117
+ | 类型 | 描述 |
118
+ | ---------------- | ---------------------------------------------- |
119
+ | `List[OCRChar]` | 识别结果列表,坐标为原图或全屏绝对坐标 |
120
+
121
+ **示例:**
87
122
 
88
123
  ```python
89
124
  chars = dotocr.recognizeAbs(font_id, "screen", 100, 200, 600, 280, 0.8)
125
+ print(f"识别数量: {len(chars)}")
90
126
  if chars:
91
- print(chars[0].text, chars[0].x, chars[0].width)
127
+ print(f"文本: {chars[0].text}, 坐标: ({chars[0].x}, {chars[0].y})")
128
+ action.click(chars[0].centerX, chars[0].centerY)
92
129
  ```
93
130
 
94
131
  ### 文本查找
95
132
 
96
- #### `findTextAbs` - 查找指定字符串并返回绝对坐标
133
+ #### `findTextAbs` - 查找目标文本,并将结果坐标映射为原图/全屏绝对坐标
134
+
135
+ 先识别再按行定位目标串。传入裁剪区域时,返回坐标会映射回原图或全屏坐标,可直接用于点击。每个目标最多返回一次命中(最先匹配到的行),每项的 `text` 是目标字符串。
97
136
 
98
137
  ```python
99
138
  def findTextAbs(
@@ -109,40 +148,75 @@ def findTextAbs(
109
148
  ) -> List[OCRChar]
110
149
  ```
111
150
 
151
+ **参数:**
152
+
112
153
  | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
113
154
  | --------------------- | --------- | -------- | ------ | --------------------------------------------------------------------- |
114
- | `fontId` | str | 是 | | `loadFont` 返回的字库 ID |
155
+ | `fontId` | str | 是 | | 字库 ID,通过 `loadFont` 获取 |
115
156
  | `input` | str | 是 | | 输入源,支持 `"screen"`、图片文件路径、URL 或 imageId |
116
- | `targetTexts` | List[str] | 是 | | 要查找的字符串数组,例如 `["商店", "背包"]` |
117
- | `x`, `y` | int | 否 | 0 | 裁剪区域左上角坐标 |
118
- | `ex`, `ey` | int | 否 | 0 | 裁剪区域右下角坐标;`ex` `ey` 0 时分别使用图像宽度或高度 |
157
+ | `targetTexts` | List[str] | 是 | | 要查找的字符串列表,例如 `["商店", "背包"]` |
158
+ | `x` | int | 否 | 0 | 裁剪区域左上角 x 坐标;全屏识别传 0 |
159
+ | `y` | int | 否 | 0 | 裁剪区域左上角 y 坐标;全屏识别传 0 |
160
+ | `ex` | int | 否 | 0 | 裁剪区域右下角 x 坐标;全屏识别传 0;为 0 时使用图像宽度 |
161
+ | `ey` | int | 否 | 0 | 裁剪区域右下角 y 坐标;全屏识别传 0;为 0 时使用图像高度 |
119
162
  | `confidenceThreshold` | float | 否 | 0.8 | 单字符识别相似度下限;语义同 `recognizeAbs` |
120
- | `exactMatch` | bool | 否 | false | `false` 为行内子串包含匹配;`true` 要求某一整行文本完全等于目标字符串 |
163
+ | `exactMatch` | bool | 否 | False | `False` 为行内子串包含匹配;`True` 要求某一整行文本完全等于目标字符串 |
121
164
 
122
- **返回值:**命中结果数组。每个目标最多返回一次命中(最先匹配到的行);每项的 `text` 是目标字符串。
165
+ **返回值:**
166
+
167
+ | 类型 | 描述 |
168
+ | --------------- | ------------------------------------------------------ |
169
+ | `List[OCRChar]` | 命中结果列表,坐标为原图或全屏绝对坐标 |
170
+
171
+ **示例:**
123
172
 
124
173
  ```python
125
- hits = dotocr.findTextAbs(font_id, "screen", ["商店", "背包"], 100, 200, 600, 280, 0.8, False)
174
+ hits = dotocr.findTextAbs(
175
+ font_id,
176
+ "screen",
177
+ ["商店", "背包"],
178
+ 100,
179
+ 200,
180
+ 600,
181
+ 280,
182
+ 0.8,
183
+ False,
184
+ )
126
185
  if hits:
127
186
  action.click(hits[0].centerX, hits[0].centerY)
128
187
  ```
129
188
 
130
189
  ### 资源管理
131
190
 
132
- #### `free` - 释放指定字库
191
+ #### `free` - 释放指定字库的资源
133
192
 
134
193
  ```python
135
194
  def free(fontId: str) -> None
136
195
  ```
137
196
 
138
- #### `freeAll` - 释放全部点阵字库
197
+ **参数:**
198
+
199
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
200
+ | -------- | ---- | -------- | ------ | --------------- |
201
+ | `fontId` | str | 是 | | 要释放的字库 ID |
202
+
203
+ **示例:**
204
+
205
+ ```python
206
+ if font_id:
207
+ dotocr.free(font_id)
208
+ print(f"字库 {font_id} 资源已释放")
209
+ ```
210
+
211
+ #### `freeAll` - 释放全部已加载点阵字库的资源
139
212
 
140
213
  ```python
141
214
  def freeAll() -> None
142
215
  ```
143
216
 
217
+ **示例:**
218
+
144
219
  ```python
145
- dotocr.free(font_id)
146
- # 或在需要清理全部已加载的点阵字库时:
147
220
  dotocr.freeAll()
221
+ print("所有点阵字库资源已释放")
148
222
  ```
@@ -6,7 +6,7 @@
6
6
 
7
7
  - 应用信息常量:版本号/构建号/名称/包名
8
8
  - 前台切换:将宿主应用切到前台
9
- - Agent 设置:读取和设置 Agent 快速模式
9
+ - Agent 设置:读取和设置 Agent 触控模式
10
10
  - 脚本生命周期:设置停止回调和异常停止回调
11
11
 
12
12
  ## 常量
@@ -55,9 +55,9 @@ from kuaijs import g
55
55
  g.takeMeToFront()
56
56
  ```
57
57
 
58
- #### `setAgentFastMode` - 设置 Agent 快速模式
58
+ #### `setAgentFastMode` - 设置 Agent 快速模式(兼容)
59
59
 
60
- 快速模式默认开启,设置会持久化。开启后,Agent 执行动作响应更快,但开始执行时电量可能快速消耗。
60
+ 兼容旧接口:开启对应模式 `1`,关闭对应模式 `0`。推荐改用 `setAgentTouchMode`。设置会持久化。
61
61
 
62
62
  ```python
63
63
  def setAgentFastMode(enabled: bool) -> bool
@@ -81,9 +81,9 @@ enabled = g.setAgentFastMode(True)
81
81
  print(f"Agent 快速模式: {enabled}")
82
82
  ```
83
83
 
84
- #### `getAgentFastMode` - 获取 Agent 快速模式
84
+ #### `getAgentFastMode` - 获取 Agent 快速模式(兼容)
85
85
 
86
- 快速模式默认开启,设置会持久化。
86
+ 获取 Agent 快速模式当前状态。
87
87
 
88
88
  ```python
89
89
  def getAgentFastMode() -> bool
@@ -102,6 +102,57 @@ if g.getAgentFastMode():
102
102
  print("Agent 快速模式已开启")
103
103
  ```
104
104
 
105
+ #### `setAgentTouchMode` - 设置 Agent 触控模式
106
+
107
+ 默认 `1`,设置会持久化。
108
+
109
+ - `0` 标准:等待完整执行完成
110
+ - `1` 快速:更快的执行速度
111
+ - `2` 真实点击:更接近真实手指触控
112
+
113
+ ```python
114
+ def setAgentTouchMode(mode: int) -> int
115
+ ```
116
+
117
+ **参数:**
118
+ | 参数 | 类型 | 必需 | 默认值 | 描述 |
119
+ | ---- | ---- | ---- | ------ | ---- |
120
+ | `mode` | int | 是 | - | 0 标准 / 1 快速 / 2 真实点击 |
121
+
122
+ **返回值:**
123
+
124
+ - `int` 实际生效的模式
125
+
126
+ **示例:**
127
+
128
+ ```python
129
+ from kuaijs import g
130
+
131
+ mode = g.setAgentTouchMode(1)
132
+ print(f"Agent 触控模式: {mode}")
133
+ ```
134
+
135
+ #### `getAgentTouchMode` - 获取 Agent 触控模式
136
+
137
+ 默认 `1`,设置会持久化。
138
+
139
+ ```python
140
+ def getAgentTouchMode() -> int
141
+ ```
142
+
143
+ **返回值:**
144
+
145
+ - `int` 当前模式(0/1/2)
146
+
147
+ **示例:**
148
+
149
+ ```python
150
+ from kuaijs import g
151
+
152
+ mode = g.getAgentTouchMode()
153
+ print(f"当前触控模式: {mode}")
154
+ ```
155
+
105
156
  #### `setCpuAutoThrottle` - 设置脚本 CPU 自动限流
106
157
 
107
158
  默认开启。开启后,脚本 API 在 CPU 占用接近系统杀进程阈值时会轻微让步,降低被系统终止的风险。
@@ -164,17 +215,17 @@ def setCpuThrottleDelay(min_ms: int, max_ms: int) -> CpuThrottleDelay
164
215
 
165
216
  **参数:**
166
217
 
167
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
168
- | --------- | ----- | -------- | ------ | ---------------------------------- |
169
- | `min_ms` | `int` | 是 | - | 最低延迟(毫秒) |
170
- | `max_ms` | `int` | 是 | - | 最高延迟(毫秒);小于 min_ms 时自动对齐 |
218
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
219
+ | -------- | ----- | -------- | ------ | ---------------------------------------- |
220
+ | `min_ms` | `int` | 是 | - | 最低延迟(毫秒) |
221
+ | `max_ms` | `int` | 是 | - | 最高延迟(毫秒);小于 min_ms 时自动对齐 |
171
222
 
172
223
  **返回值:**
173
224
 
174
- | 字段名 | 类型 | 描述 |
175
- | ------- | ----- | -------------- |
176
- | `minMs` | `int` | 实际最低延迟 |
177
- | `maxMs` | `int` | 实际最高延迟 |
225
+ | 字段名 | 类型 | 描述 |
226
+ | ------- | ----- | ------------ |
227
+ | `minMs` | `int` | 实际最低延迟 |
228
+ | `maxMs` | `int` | 实际最高延迟 |
178
229
 
179
230
  **示例:**
180
231
 
@@ -237,16 +288,16 @@ def setStopCallback(callback: Callable[[Literal["success", "error", "stopped"]],
237
288
 
238
289
  **参数:**
239
290
 
240
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
241
- | ---------- | --------------------------------------------------------- | -------- | ------ | ---- |
242
- | `callback` | `Callable[[Literal["success", "error", "stopped"]], None]` 或 `None` | 是 | - | 停止回调函数,传 `None` 取消回调 |
291
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
292
+ | ---------- | -------------------------------------------------------------------- | -------- | ------ | -------------------------------- |
293
+ | `callback` | `Callable[[Literal["success", "error", "stopped"]], None]` 或 `None` | 是 | - | 停止回调函数,传 `None` 取消回调 |
243
294
 
244
295
  **状态值:**
245
296
 
246
- | 状态 | 描述 |
247
- | ---- | ---- |
248
- | `success` | 脚本正常执行完成 |
249
- | `error` | 脚本发生未捕获异常 |
297
+ | 状态 | 描述 |
298
+ | --------- | ------------------------ |
299
+ | `success` | 脚本正常执行完成 |
300
+ | `error` | 脚本发生未捕获异常 |
250
301
  | `stopped` | 脚本被手动停止或主动退出 |
251
302
 
252
303
  **示例:**
@@ -275,9 +326,9 @@ def setExceptionCallback(callback: Callable[[], None] | None) -> None
275
326
 
276
327
  **参数:**
277
328
 
278
- | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
279
- | ---------- | ---------------------------- | -------- | ------ | ---- |
280
- | `callback` | `Callable[[], None]` 或 `None` | 是 | - | 异常停止回调函数,传 `None` 取消回调 |
329
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
330
+ | ---------- | ------------------------------ | -------- | ------ | ------------------------------------ |
331
+ | `callback` | `Callable[[], None]` 或 `None` | 是 | - | 异常停止回调函数,传 `None` 取消回调 |
281
332
 
282
333
  **示例:**
283
334
 
@@ -111,16 +111,16 @@ list_page = node.createNodeSelector({"mode": 2})
111
111
 
112
112
  | 方法 | 说明 |
113
113
  | --- | --- |
114
- | `hittable()` | 当前是否可点击 |
115
- | `scrollToVisible()` | 滚动到可见区域 |
116
- | `tap()` | 单击(不可见时会先尝试滚到可见) |
117
- | `doubleTap()` | 双击 |
118
- | `press(duration=500)` | 长按,毫秒,默认 500 |
119
- | `clickCenter()` | 点击中心 |
120
- | `clickRandom()` | 范围内随机点击 |
121
- | `clearInput()` | 清空输入 |
122
- | `input(text)` | 追加输入(不先清空) |
123
- | `setValue(text)` | 设置值(见下方) |
114
+ | `hittable()` | 当前是否可点击(可见且未被挡住) |
115
+ | `scrollToVisible()` | 仅滚动到可见,不点击;一般不必手动调用 |
116
+ | `tap()` | 单击;不可见时会先自动滚到可见 |
117
+ | `doubleTap()` | 双击;不可见时会先自动滚到可见 |
118
+ | `press(duration=500)` | 长按,毫秒,默认 500;不可见时会先自动滚到可见 |
119
+ | `clickCenter()` | 点击中心(坐标点击,不会自动滚动) |
120
+ | `clickRandom()` | 范围内随机点击(坐标点击,不会自动滚动) |
121
+ | `clearInput()` | 清空输入(内部会先 `tap` 聚焦,因而也会自动滚到可见) |
122
+ | `input(text)` | 追加输入(不先清空;内部会先 `tap` 聚焦) |
123
+ | `setValue(text)` | 设置值(见下方;不可见时会先自动滚到可见) |
124
124
  | `parent()` / `child(i)` / `allChildren()` | 父 / 子 / 全部子节点 |
125
125
  | `siblings()` / `previousSiblings()` / `nextSiblings()` | 兄弟节点 |
126
126
 
@@ -173,17 +173,19 @@ selector.type("XCUIElementTypeTextField").enabled(True).getOneNodeInfo(3000)
173
173
 
174
174
  ### 是否可点 / 滚到可见
175
175
 
176
+ `tap` / `doubleTap` / `press` / `setValue`(以及内部会先 `tap` 的 `clearInput` / `input`)在元素当前不可见时,会**自动**先滚到可见再操作,一般不用手写滚动:
177
+
176
178
  ```python
177
- if node.hittable():
178
- node.tap()
179
- else:
180
- node.scrollToVisible()
181
- node.tap()
179
+ # 推荐:直接操作,不可见时会自动滚到可见
180
+ node.tap()
181
+ node.doubleTap()
182
+ node.press(800)
183
+ node.setValue("hello")
182
184
  ```
183
185
 
184
- - `hittable()`:当前能否点到
185
- - `scrollToVisible()`:手动滚到可见
186
- - `tap` / `doubleTap` / `press`:不可见时会自动尝试滚到可见再操作
186
+ - `hittable()`:当前能否点到(可见且未被挡住),用于排查“点了没反应”
187
+ - `scrollToVisible()`:只滚到可见、不点击;仅在你想先露出元素、稍后再操作时使用
188
+ - `clickCenter()` / `clickRandom()`:按坐标点击,**不会**自动滚动
187
189
 
188
190
  ### 点击
189
191
 
@@ -194,10 +196,10 @@ btn = (
194
196
  .getOneNodeInfo(3000)
195
197
  )
196
198
  if btn:
197
- btn.tap()
198
- btn.doubleTap()
199
- btn.press(800)
200
- # btn.clickCenter()
199
+ btn.tap() # 不可见时自动滚到可见
200
+ btn.doubleTap() # 同上
201
+ btn.press(800) # 同上
202
+ # btn.clickCenter() # 坐标点击,不自动滚动
201
203
  # btn.clickRandom()
202
204
  ```
203
205
 
@@ -205,13 +207,13 @@ if btn:
205
207
 
206
208
  | 方法 | 说明 |
207
209
  | --- | --- |
208
- | `clearInput()` | 清空 |
209
- | `input(text)` | 追加输入 |
210
- | `setValue(text)` | 按类型设置 |
210
+ | `clearInput()` | 清空(内部先 `tap` 聚焦,不可见时也会自动滚到可见) |
211
+ | `input(text)` | 追加输入(内部先 `tap` 聚焦) |
212
+ | `setValue(text)` | 按类型设置;不可见时会先自动滚到可见 |
211
213
 
212
214
  | 控件 | 传参 | 效果 |
213
215
  | --- | --- | --- |
214
- | `PickerWheel` | 选项文案,如 `"1小时"` | 滚到该选项 |
216
+ | `PickerWheel` | 选项文案,如 `"1小时"` | 滚到该选项(控件本身不可见时也会先自动滚到可见) |
215
217
  | 文本框类 | 字符串 | 追加输入,不先清空 |
216
218
 
217
219
  ```python
@@ -220,6 +222,7 @@ field.setValue("hello")
220
222
 
221
223
  wheel = selector.type("XCUIElementTypePickerWheel").getOneNodeInfo(3000)
222
224
  if wheel:
225
+ # 不可见时会自动滚到可见,再调到目标选项
223
226
  wheel.setValue("1小时")
224
227
  ```
225
228