@midscene/ios 0.30.9 → 0.30.10

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.
package/dist/es/bin.mjs CHANGED
@@ -11999,6 +11999,49 @@ class IOSWebDriverClient extends WebDriverClient {
11999
11999
  debugIOS(`Warning: Key "${key}" is not supported on iOS platform`);
12000
12000
  throw new Error(`Key "${key}" is not supported on iOS platform`);
12001
12001
  }
12002
+ async getActiveElement() {
12003
+ this.ensureSession();
12004
+ debugIOS('Getting active element');
12005
+ try {
12006
+ var _response_value, _response_value1;
12007
+ const response = await this.makeRequest('GET', `/session/${this.sessionId}/element/active`);
12008
+ const elementId = (null == (_response_value = response.value) ? void 0 : _response_value.ELEMENT) || (null == (_response_value1 = response.value) ? void 0 : _response_value1['element-6066-11e4-a52e-4f735466cecf']) || response.ELEMENT || response['element-6066-11e4-a52e-4f735466cecf'];
12009
+ if (elementId) {
12010
+ debugIOS(`Got active element ID: ${elementId}`);
12011
+ return elementId;
12012
+ }
12013
+ debugIOS('No active element found');
12014
+ return null;
12015
+ } catch (error) {
12016
+ debugIOS(`Failed to get active element: ${error}`);
12017
+ return null;
12018
+ }
12019
+ }
12020
+ async clearElement(elementId) {
12021
+ this.ensureSession();
12022
+ debugIOS(`Clearing element: ${elementId}`);
12023
+ try {
12024
+ await this.makeRequest('POST', `/session/${this.sessionId}/element/${elementId}/clear`);
12025
+ debugIOS('Element cleared successfully');
12026
+ } catch (error) {
12027
+ debugIOS(`Failed to clear element: ${error}`);
12028
+ throw new Error(`Failed to clear element: ${error}`);
12029
+ }
12030
+ }
12031
+ async clearActiveElement() {
12032
+ try {
12033
+ const elementId = await this.getActiveElement();
12034
+ if (!elementId) {
12035
+ debugIOS('No active element to clear');
12036
+ return false;
12037
+ }
12038
+ await this.clearElement(elementId);
12039
+ return true;
12040
+ } catch (error) {
12041
+ debugIOS(`Failed to clear active element: ${error}`);
12042
+ return false;
12043
+ }
12044
+ }
12002
12045
  normalizeKeyName(key) {
12003
12046
  return key.charAt(0).toUpperCase() + key.slice(1).toLowerCase();
12004
12047
  }
@@ -12158,7 +12201,6 @@ function device_define_property(obj, key, value) {
12158
12201
  return obj;
12159
12202
  }
12160
12203
  const debugDevice = getDebug('ios:device');
12161
- const BackspaceChar = '\u0008';
12162
12204
  class device_IOSDevice {
12163
12205
  actionSpace() {
12164
12206
  const defaultActions = [
@@ -12367,19 +12409,9 @@ ScreenSize: ${size.width}x${size.height} (DPR: ${size.scale})
12367
12409
  if (!element) return;
12368
12410
  await this.tap(element.center[0], element.center[1]);
12369
12411
  await sleep(100);
12370
- try {
12371
- await this.tripleTap(element.center[0], element.center[1]);
12372
- await sleep(200);
12373
- await this.wdaBackend.typeText(BackspaceChar);
12374
- } catch (error2) {
12375
- debugDevice(`Method 1 failed, trying method 2: ${error2}`);
12376
- try {
12377
- const backspaces = Array(100).fill(BackspaceChar).join('');
12378
- await this.wdaBackend.typeText(backspaces);
12379
- } catch (error3) {
12380
- debugDevice(`All clear methods failed: ${error3}`);
12381
- }
12382
- }
12412
+ debugDevice('Attempting to clear input with WebDriver Clear API');
12413
+ const cleared = await this.wdaBackend.clearActiveElement();
12414
+ cleared ? debugDevice('Successfully cleared input with WebDriver Clear API') : debugDevice('WebDriver Clear API returned false (no active element or clear failed)');
12383
12415
  }
12384
12416
  async url() {
12385
12417
  return '';
package/dist/es/index.mjs CHANGED
@@ -150,6 +150,49 @@ class IOSWebDriverClient extends WebDriverClient {
150
150
  debugIOS(`Warning: Key "${key}" is not supported on iOS platform`);
151
151
  throw new Error(`Key "${key}" is not supported on iOS platform`);
152
152
  }
153
+ async getActiveElement() {
154
+ this.ensureSession();
155
+ debugIOS('Getting active element');
156
+ try {
157
+ var _response_value, _response_value1;
158
+ const response = await this.makeRequest('GET', `/session/${this.sessionId}/element/active`);
159
+ const elementId = (null == (_response_value = response.value) ? void 0 : _response_value.ELEMENT) || (null == (_response_value1 = response.value) ? void 0 : _response_value1['element-6066-11e4-a52e-4f735466cecf']) || response.ELEMENT || response['element-6066-11e4-a52e-4f735466cecf'];
160
+ if (elementId) {
161
+ debugIOS(`Got active element ID: ${elementId}`);
162
+ return elementId;
163
+ }
164
+ debugIOS('No active element found');
165
+ return null;
166
+ } catch (error) {
167
+ debugIOS(`Failed to get active element: ${error}`);
168
+ return null;
169
+ }
170
+ }
171
+ async clearElement(elementId) {
172
+ this.ensureSession();
173
+ debugIOS(`Clearing element: ${elementId}`);
174
+ try {
175
+ await this.makeRequest('POST', `/session/${this.sessionId}/element/${elementId}/clear`);
176
+ debugIOS('Element cleared successfully');
177
+ } catch (error) {
178
+ debugIOS(`Failed to clear element: ${error}`);
179
+ throw new Error(`Failed to clear element: ${error}`);
180
+ }
181
+ }
182
+ async clearActiveElement() {
183
+ try {
184
+ const elementId = await this.getActiveElement();
185
+ if (!elementId) {
186
+ debugIOS('No active element to clear');
187
+ return false;
188
+ }
189
+ await this.clearElement(elementId);
190
+ return true;
191
+ } catch (error) {
192
+ debugIOS(`Failed to clear active element: ${error}`);
193
+ return false;
194
+ }
195
+ }
153
196
  normalizeKeyName(key) {
154
197
  return key.charAt(0).toUpperCase() + key.slice(1).toLowerCase();
155
198
  }
@@ -309,7 +352,6 @@ function _define_property(obj, key, value) {
309
352
  return obj;
310
353
  }
311
354
  const debugDevice = getDebug('ios:device');
312
- const BackspaceChar = '\u0008';
313
355
  class IOSDevice {
314
356
  actionSpace() {
315
357
  const defaultActions = [
@@ -518,19 +560,9 @@ ScreenSize: ${size.width}x${size.height} (DPR: ${size.scale})
518
560
  if (!element) return;
519
561
  await this.tap(element.center[0], element.center[1]);
520
562
  await sleep(100);
521
- try {
522
- await this.tripleTap(element.center[0], element.center[1]);
523
- await sleep(200);
524
- await this.wdaBackend.typeText(BackspaceChar);
525
- } catch (error2) {
526
- debugDevice(`Method 1 failed, trying method 2: ${error2}`);
527
- try {
528
- const backspaces = Array(100).fill(BackspaceChar).join('');
529
- await this.wdaBackend.typeText(backspaces);
530
- } catch (error3) {
531
- debugDevice(`All clear methods failed: ${error3}`);
532
- }
533
- }
563
+ debugDevice('Attempting to clear input with WebDriver Clear API');
564
+ const cleared = await this.wdaBackend.clearActiveElement();
565
+ cleared ? debugDevice('Successfully cleared input with WebDriver Clear API') : debugDevice('WebDriver Clear API returned false (no active element or clear failed)');
534
566
  }
535
567
  async url() {
536
568
  return '';
package/dist/lib/bin.js CHANGED
@@ -12137,6 +12137,49 @@ var __webpack_exports__ = {};
12137
12137
  debugIOS(`Warning: Key "${key}" is not supported on iOS platform`);
12138
12138
  throw new Error(`Key "${key}" is not supported on iOS platform`);
12139
12139
  }
12140
+ async getActiveElement() {
12141
+ this.ensureSession();
12142
+ debugIOS('Getting active element');
12143
+ try {
12144
+ var _response_value, _response_value1;
12145
+ const response = await this.makeRequest('GET', `/session/${this.sessionId}/element/active`);
12146
+ const elementId = (null == (_response_value = response.value) ? void 0 : _response_value.ELEMENT) || (null == (_response_value1 = response.value) ? void 0 : _response_value1['element-6066-11e4-a52e-4f735466cecf']) || response.ELEMENT || response['element-6066-11e4-a52e-4f735466cecf'];
12147
+ if (elementId) {
12148
+ debugIOS(`Got active element ID: ${elementId}`);
12149
+ return elementId;
12150
+ }
12151
+ debugIOS('No active element found');
12152
+ return null;
12153
+ } catch (error) {
12154
+ debugIOS(`Failed to get active element: ${error}`);
12155
+ return null;
12156
+ }
12157
+ }
12158
+ async clearElement(elementId) {
12159
+ this.ensureSession();
12160
+ debugIOS(`Clearing element: ${elementId}`);
12161
+ try {
12162
+ await this.makeRequest('POST', `/session/${this.sessionId}/element/${elementId}/clear`);
12163
+ debugIOS('Element cleared successfully');
12164
+ } catch (error) {
12165
+ debugIOS(`Failed to clear element: ${error}`);
12166
+ throw new Error(`Failed to clear element: ${error}`);
12167
+ }
12168
+ }
12169
+ async clearActiveElement() {
12170
+ try {
12171
+ const elementId = await this.getActiveElement();
12172
+ if (!elementId) {
12173
+ debugIOS('No active element to clear');
12174
+ return false;
12175
+ }
12176
+ await this.clearElement(elementId);
12177
+ return true;
12178
+ } catch (error) {
12179
+ debugIOS(`Failed to clear active element: ${error}`);
12180
+ return false;
12181
+ }
12182
+ }
12140
12183
  normalizeKeyName(key) {
12141
12184
  return key.charAt(0).toUpperCase() + key.slice(1).toLowerCase();
12142
12185
  }
@@ -12296,7 +12339,6 @@ var __webpack_exports__ = {};
12296
12339
  return obj;
12297
12340
  }
12298
12341
  const debugDevice = (0, logger_namespaceObject.getDebug)('ios:device');
12299
- const BackspaceChar = '\u0008';
12300
12342
  class device_IOSDevice {
12301
12343
  actionSpace() {
12302
12344
  const defaultActions = [
@@ -12505,19 +12547,9 @@ ScreenSize: ${size.width}x${size.height} (DPR: ${size.scale})
12505
12547
  if (!element) return;
12506
12548
  await this.tap(element.center[0], element.center[1]);
12507
12549
  await (0, utils_namespaceObject.sleep)(100);
12508
- try {
12509
- await this.tripleTap(element.center[0], element.center[1]);
12510
- await (0, utils_namespaceObject.sleep)(200);
12511
- await this.wdaBackend.typeText(BackspaceChar);
12512
- } catch (error2) {
12513
- debugDevice(`Method 1 failed, trying method 2: ${error2}`);
12514
- try {
12515
- const backspaces = Array(100).fill(BackspaceChar).join('');
12516
- await this.wdaBackend.typeText(backspaces);
12517
- } catch (error3) {
12518
- debugDevice(`All clear methods failed: ${error3}`);
12519
- }
12520
- }
12550
+ debugDevice('Attempting to clear input with WebDriver Clear API');
12551
+ const cleared = await this.wdaBackend.clearActiveElement();
12552
+ cleared ? debugDevice('Successfully cleared input with WebDriver Clear API') : debugDevice('WebDriver Clear API returned false (no active element or clear failed)');
12521
12553
  }
12522
12554
  async url() {
12523
12555
  return '';
package/dist/lib/index.js CHANGED
@@ -188,6 +188,49 @@ class IOSWebDriverClient extends webdriver_namespaceObject.WebDriverClient {
188
188
  debugIOS(`Warning: Key "${key}" is not supported on iOS platform`);
189
189
  throw new Error(`Key "${key}" is not supported on iOS platform`);
190
190
  }
191
+ async getActiveElement() {
192
+ this.ensureSession();
193
+ debugIOS('Getting active element');
194
+ try {
195
+ var _response_value, _response_value1;
196
+ const response = await this.makeRequest('GET', `/session/${this.sessionId}/element/active`);
197
+ const elementId = (null == (_response_value = response.value) ? void 0 : _response_value.ELEMENT) || (null == (_response_value1 = response.value) ? void 0 : _response_value1['element-6066-11e4-a52e-4f735466cecf']) || response.ELEMENT || response['element-6066-11e4-a52e-4f735466cecf'];
198
+ if (elementId) {
199
+ debugIOS(`Got active element ID: ${elementId}`);
200
+ return elementId;
201
+ }
202
+ debugIOS('No active element found');
203
+ return null;
204
+ } catch (error) {
205
+ debugIOS(`Failed to get active element: ${error}`);
206
+ return null;
207
+ }
208
+ }
209
+ async clearElement(elementId) {
210
+ this.ensureSession();
211
+ debugIOS(`Clearing element: ${elementId}`);
212
+ try {
213
+ await this.makeRequest('POST', `/session/${this.sessionId}/element/${elementId}/clear`);
214
+ debugIOS('Element cleared successfully');
215
+ } catch (error) {
216
+ debugIOS(`Failed to clear element: ${error}`);
217
+ throw new Error(`Failed to clear element: ${error}`);
218
+ }
219
+ }
220
+ async clearActiveElement() {
221
+ try {
222
+ const elementId = await this.getActiveElement();
223
+ if (!elementId) {
224
+ debugIOS('No active element to clear');
225
+ return false;
226
+ }
227
+ await this.clearElement(elementId);
228
+ return true;
229
+ } catch (error) {
230
+ debugIOS(`Failed to clear active element: ${error}`);
231
+ return false;
232
+ }
233
+ }
191
234
  normalizeKeyName(key) {
192
235
  return key.charAt(0).toUpperCase() + key.slice(1).toLowerCase();
193
236
  }
@@ -347,7 +390,6 @@ function _define_property(obj, key, value) {
347
390
  return obj;
348
391
  }
349
392
  const debugDevice = (0, logger_namespaceObject.getDebug)('ios:device');
350
- const BackspaceChar = '\u0008';
351
393
  class IOSDevice {
352
394
  actionSpace() {
353
395
  const defaultActions = [
@@ -556,19 +598,9 @@ ScreenSize: ${size.width}x${size.height} (DPR: ${size.scale})
556
598
  if (!element) return;
557
599
  await this.tap(element.center[0], element.center[1]);
558
600
  await (0, utils_namespaceObject.sleep)(100);
559
- try {
560
- await this.tripleTap(element.center[0], element.center[1]);
561
- await (0, utils_namespaceObject.sleep)(200);
562
- await this.wdaBackend.typeText(BackspaceChar);
563
- } catch (error2) {
564
- debugDevice(`Method 1 failed, trying method 2: ${error2}`);
565
- try {
566
- const backspaces = Array(100).fill(BackspaceChar).join('');
567
- await this.wdaBackend.typeText(backspaces);
568
- } catch (error3) {
569
- debugDevice(`All clear methods failed: ${error3}`);
570
- }
571
- }
601
+ debugDevice('Attempting to clear input with WebDriver Clear API');
602
+ const cleared = await this.wdaBackend.clearActiveElement();
603
+ cleared ? debugDevice('Successfully cleared input with WebDriver Clear API') : debugDevice('WebDriver Clear API returned false (no active element or clear failed)');
572
604
  }
573
605
  async url() {
574
606
  return '';
@@ -114,6 +114,21 @@ export declare class IOSWebDriverClient extends WebDriverClient {
114
114
  pressHomeButton(): Promise<void>;
115
115
  appSwitcher(): Promise<void>;
116
116
  pressKey(key: string): Promise<void>;
117
+ /**
118
+ * Get the currently focused element's WebDriver ID
119
+ * @returns WebDriver element ID or null if no element is focused
120
+ */
121
+ getActiveElement(): Promise<string | null>;
122
+ /**
123
+ * Clear an element using WebDriver's clear endpoint
124
+ * @param elementId WebDriver element ID
125
+ */
126
+ clearElement(elementId: string): Promise<void>;
127
+ /**
128
+ * Clear the currently focused input field using WebDriver Clear API
129
+ * @returns true if successful, false otherwise
130
+ */
131
+ clearActiveElement(): Promise<boolean>;
117
132
  private normalizeKeyName;
118
133
  dismissKeyboard(keyNames?: string[]): Promise<boolean>;
119
134
  typeText(text: string): Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midscene/ios",
3
- "version": "0.30.9",
3
+ "version": "0.30.10",
4
4
  "description": "iOS automation library for Midscene",
5
5
  "keywords": [
6
6
  "iOS UI automation",
@@ -38,9 +38,9 @@
38
38
  "dependencies": {
39
39
  "@inquirer/prompts": "^7.8.6",
40
40
  "open": "10.1.0",
41
- "@midscene/core": "0.30.9",
42
- "@midscene/shared": "0.30.9",
43
- "@midscene/webdriver": "0.30.9"
41
+ "@midscene/shared": "0.30.10",
42
+ "@midscene/core": "0.30.10",
43
+ "@midscene/webdriver": "0.30.10"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@rslib/core": "^0.11.2",
@@ -49,7 +49,7 @@
49
49
  "typescript": "^5.8.3",
50
50
  "tsx": "^4.19.2",
51
51
  "vitest": "3.0.5",
52
- "@midscene/playground": "0.30.9"
52
+ "@midscene/playground": "0.30.10"
53
53
  },
54
54
  "license": "MIT",
55
55
  "scripts": {
package/static/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html><head><link rel="icon" href="/favicon.ico"><title>Midscene Playground</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script defer src="/static/js/lib-react.f566a9ed.js"></script><script defer src="/static/js/931.dc961e99.js"></script><script defer src="/static/js/index.c7ba8adb.js"></script><link href="/static/css/index.44466eb4.css" rel="stylesheet"></head><body><div id="root"></div></body></html>
1
+ <!doctype html><html><head><link rel="icon" href="/favicon.ico"><title>Midscene Playground</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script defer src="/static/js/lib-react.f566a9ed.js"></script><script defer src="/static/js/931.dc961e99.js"></script><script defer src="/static/js/index.2caaacaf.js"></script><link href="/static/css/index.44466eb4.css" rel="stylesheet"></head><body><div id="root"></div></body></html>