appium-uiautomator2-driver 4.1.2 → 4.1.4

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.
@@ -22,19 +22,6 @@ export async function mobileInstallMultipleApks(apks, options) {
22
22
  await this.adb.installMultipleApks(configuredApks, options);
23
23
  }
24
24
 
25
- /**
26
- * Puts the app to background and waits the given number of seconds then restores the app
27
- * if necessary. The call is blocking.
28
- *
29
- * @this {AndroidUiautomator2Driver}
30
- * @param {number} [seconds=-1] The amount of seconds to wait between putting the app to background and restoring it.
31
- * Any negative value means to not restore the app after putting it to background.
32
- * @returns {Promise<void>}
33
- */
34
- export async function mobileBackgroundApp(seconds = -1) {
35
- await this.background(seconds);
36
- }
37
-
38
25
  /**
39
26
  * @typedef {import('../driver').AndroidUiautomator2Driver} AndroidUiautomator2Driver
40
27
  */
package/lib/driver.ts CHANGED
@@ -53,7 +53,6 @@ import {
53
53
  } from './commands/alert';
54
54
  import {
55
55
  mobileInstallMultipleApks,
56
- mobileBackgroundApp,
57
56
  } from './commands/app-management';
58
57
  import {
59
58
  mobileGetBatteryInfo,
@@ -1010,7 +1009,6 @@ class AndroidUiautomator2Driver
1010
1009
  postDismissAlert = postDismissAlert;
1011
1010
 
1012
1011
  mobileInstallMultipleApks = mobileInstallMultipleApks;
1013
- mobileBackgroundApp = mobileBackgroundApp;
1014
1012
 
1015
1013
  mobileGetBatteryInfo = mobileGetBatteryInfo;
1016
1014
 
@@ -214,13 +214,6 @@ export const executeMethodMap = {
214
214
  }
215
215
  },
216
216
 
217
- 'mobile: backgroundApp': {
218
- command: 'mobileBackgroundApp',
219
- params: {
220
- optional: ['seconds'],
221
- }
222
- },
223
-
224
217
  'mobile: pressKey': {
225
218
  command: 'mobilePressKey',
226
219
  params: {
@@ -11,12 +11,14 @@ import B from 'bluebird';
11
11
  import axios from 'axios';
12
12
 
13
13
  const REQD_PARAMS = ['adb', 'tmpDir', 'host', 'systemPort', 'devicePort', 'disableWindowAnimation'];
14
- const SERVER_LAUNCH_TIMEOUT = 30000;
14
+ const SERVER_LAUNCH_TIMEOUT_MS = 30000;
15
15
  const SERVER_INSTALL_RETRIES = 20;
16
- const SERVICES_LAUNCH_TIMEOUT = 30000;
17
- const SERVER_PACKAGE_ID = 'io.appium.uiautomator2.server';
18
- const SERVER_TEST_PACKAGE_ID = `${SERVER_PACKAGE_ID}.test`;
19
- const INSTRUMENTATION_TARGET = `${SERVER_TEST_PACKAGE_ID}/androidx.test.runner.AndroidJUnitRunner`;
16
+ const SERVICES_LAUNCH_TIMEOUT_MS = 30000;
17
+ const SERVER_SHUTDOWN_TIMEOUT_MS = 5000;
18
+ const SERVER_REQUEST_TIMEOUT_MS = 500;
19
+ export const SERVER_PACKAGE_ID = 'io.appium.uiautomator2.server';
20
+ export const SERVER_TEST_PACKAGE_ID = `${SERVER_PACKAGE_ID}.test`;
21
+ export const INSTRUMENTATION_TARGET = `${SERVER_TEST_PACKAGE_ID}/androidx.test.runner.AndroidJUnitRunner`;
20
22
 
21
23
  class UIA2Proxy extends JWProxy {
22
24
  /** @type {boolean} */
@@ -36,7 +38,7 @@ class UIA2Proxy extends JWProxy {
36
38
  }
37
39
  }
38
40
 
39
- class UiAutomator2Server {
41
+ export class UiAutomator2Server {
40
42
  /** @type {string} */
41
43
  host;
42
44
 
@@ -209,7 +211,7 @@ class UiAutomator2Server {
209
211
  }
210
212
 
211
213
  async verifyServicesAvailability () {
212
- this.log.debug(`Waiting up to ${SERVICES_LAUNCH_TIMEOUT}ms for services to be available`);
214
+ this.log.debug(`Waiting up to ${SERVICES_LAUNCH_TIMEOUT_MS}ms for services to be available`);
213
215
  let isPmServiceAvailable = false;
214
216
  let pmOutput = '';
215
217
  let pmError = null;
@@ -236,7 +238,7 @@ class UiAutomator2Server {
236
238
  }
237
239
  return isPmServiceAvailable;
238
240
  }, {
239
- waitMs: SERVICES_LAUNCH_TIMEOUT,
241
+ waitMs: SERVICES_LAUNCH_TIMEOUT_MS,
240
242
  intervalMs: 1000,
241
243
  });
242
244
  } catch {
@@ -260,7 +262,7 @@ class UiAutomator2Server {
260
262
  this.log.info(`Using UIAutomator2 server from '${apkPath}' and test from '${testApkPath}'`);
261
263
  }
262
264
 
263
- const timeout = caps.uiautomator2ServerLaunchTimeout || SERVER_LAUNCH_TIMEOUT;
265
+ const timeout = caps.uiautomator2ServerLaunchTimeout || SERVER_LAUNCH_TIMEOUT_MS;
264
266
  const timer = new timing.Timer().start();
265
267
  let retries = 0;
266
268
  const maxRetries = 2;
@@ -344,81 +346,67 @@ class UiAutomator2Server {
344
346
  }
345
347
 
346
348
  async stopInstrumentationProcess () {
347
- if (!this.instrumentationProcess) {
348
- return;
349
- }
350
-
351
349
  try {
352
- if (this.instrumentationProcess.isRunning) {
350
+ if (this.instrumentationProcess?.isRunning) {
353
351
  await this.instrumentationProcess.stop();
354
352
  }
355
353
  } finally {
356
- this.instrumentationProcess.removeAllListeners();
354
+ this.instrumentationProcess?.removeAllListeners();
357
355
  this.instrumentationProcess = null;
358
356
  }
359
357
  }
360
358
 
361
359
  async deleteSession () {
362
360
  this.log.debug('Deleting UiAutomator2 server session');
363
- // rely on jwproxy's intelligence to know what we're talking about and
364
- // delete the current session
361
+
365
362
  try {
366
363
  await this.jwproxy.command('/', 'DELETE');
367
364
  } catch (err) {
368
- this.log.warn(`Did not get confirmation UiAutomator2 deleteSession worked; ` +
369
- `Error was: ${err}`);
365
+ this.log.warn(
366
+ `Did not get the confirmation of UiAutomator2 server session deletion. ` +
367
+ `Original error: ${err.message}`
368
+ );
370
369
  }
370
+
371
+ // Theoretically we could also force kill instumentation and server processes
372
+ // without waiting for them to properly quit on their own.
373
+ // This may cause unexpected error reports in device logs though.
374
+ await this._waitForTermination();
375
+
371
376
  try {
372
377
  await this.stopInstrumentationProcess();
373
378
  } catch (err) {
374
379
  this.log.warn(`Could not stop the instrumentation process. Original error: ${err.message}`);
375
380
  }
381
+
382
+ try {
383
+ await B.all([
384
+ this.adb.forceStop(SERVER_PACKAGE_ID),
385
+ this.adb.forceStop(SERVER_TEST_PACKAGE_ID)
386
+ ]);
387
+ } catch {}
376
388
  }
377
389
 
378
390
  async cleanupAutomationLeftovers (strictCleanup = false) {
379
391
  this.log.debug(`Performing ${strictCleanup ? 'strict' : 'shallow'} cleanup of automation leftovers`);
380
392
 
381
- const axiosTimeout = 500;
382
-
383
- const waitStop = async () => {
384
- // Wait for the process stop by sending a status request to the port.
385
- // We observed the process stop could be delayed, thus causing unexpected crashes
386
- // in the middle of the session preparation process. It caused an invalid session error response
387
- // by the uia2 server, but that was because the process stop's delay.
388
- const timeout = 3000;
389
- try {
390
- await waitForCondition(async () => {
391
- try {
392
- await axios({
393
- url: `http://${this.host}:${this.systemPort}/status`,
394
- timeout: axiosTimeout,
395
- });
396
- } catch {
397
- return true;
398
- }
399
- }, {
400
- waitMs: timeout,
401
- intervalMs: 100,
402
- });
403
- } catch {
404
- this.log.warn(`The ${SERVER_TEST_PACKAGE_ID} process might fail to stop within ${timeout}ms timeout.`);
405
- }
406
- };
407
-
393
+ const serverBase = `http://${this.host}:${this.systemPort}`;
408
394
  try {
409
395
  const {value} = (await axios({
410
- url: `http://${this.host}:${this.systemPort}/sessions`,
411
- timeout: axiosTimeout,
396
+ url: `${serverBase}/sessions`,
397
+ timeout: SERVER_REQUEST_TIMEOUT_MS,
412
398
  })).data;
413
399
  const activeSessionIds = value.map(({id}) => id).filter(Boolean);
414
400
  if (activeSessionIds.length) {
415
- this.log.debug(`The following obsolete sessions are still running: ${JSON.stringify(activeSessionIds)}`);
401
+ this.log.debug(`The following obsolete sessions are still running: ${activeSessionIds}`);
416
402
  this.log.debug(`Cleaning up ${util.pluralize('obsolete session', activeSessionIds.length, true)}`);
417
403
  await B.all(activeSessionIds
418
- .map((id) => axios.delete(`http://${this.host}:${this.systemPort}/session/${id}`))
404
+ .map((/** @type {string} */ id) => axios.delete(`${serverBase}/session/${id}`, {
405
+ timeout: SERVER_REQUEST_TIMEOUT_MS,
406
+ }))
419
407
  );
420
- // Let all sessions to be properly terminated before continuing
421
- await B.delay(1000);
408
+ // Let the server to be properly terminated before continuing
409
+ await this._waitForTermination();
422
410
  } else {
423
411
  this.log.debug('No obsolete sessions have been detected');
424
412
  }
@@ -438,11 +426,35 @@ class UiAutomator2Server {
438
426
  await this.adb.killProcessesByName('uiautomator');
439
427
  } catch {}
440
428
  }
441
- await waitStop();
429
+ }
430
+
431
+ /**
432
+ * Blocks until UIA2 server stops running
433
+ * or SERVER_SHUTDOWN_TIMEOUT_MS expires
434
+ *
435
+ * @returns {Promise<void>}
436
+ */
437
+ async _waitForTermination() {
438
+ try {
439
+ await waitForCondition(async () => {
440
+ try {
441
+ return !(await this.adb.processExists(SERVER_PACKAGE_ID));
442
+ } catch {
443
+ return true;
444
+ }
445
+ }, {
446
+ waitMs: SERVER_SHUTDOWN_TIMEOUT_MS,
447
+ intervalMs: 300,
448
+ });
449
+ } catch {
450
+ this.log.warn(
451
+ `The UIA2 server did has not been terminated within ${SERVER_SHUTDOWN_TIMEOUT_MS}ms timeout. ` +
452
+ `Continuing anyway`
453
+ );
454
+ }
442
455
  }
443
456
  }
444
457
 
445
- export { UiAutomator2Server, INSTRUMENTATION_TARGET, SERVER_PACKAGE_ID, SERVER_TEST_PACKAGE_ID };
446
458
  export default UiAutomator2Server;
447
459
 
448
460
  /**
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "appium-uiautomator2-driver",
3
- "version": "4.1.2",
3
+ "version": "4.1.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appium-uiautomator2-driver",
9
- "version": "4.1.2",
9
+ "version": "4.1.4",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "appium-adb": "^12.12.0",
13
- "appium-android-driver": "^10.2.2",
13
+ "appium-android-driver": "^10.2.3",
14
14
  "appium-uiautomator2-server": "^7.2.0",
15
15
  "asyncbox": "^3.0.0",
16
16
  "axios": "^1.6.5",
@@ -68,17 +68,17 @@
68
68
  }
69
69
  },
70
70
  "node_modules/@appium/base-driver": {
71
- "version": "9.16.3",
72
- "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.16.3.tgz",
73
- "integrity": "sha512-+KviEBWMlHoBh/Ezs4bF1uRFw3gBHivljy8yp2dKHvFt4ZZlJo6wxmfmU5fknob0TuRkViwcD2auL64AQLsGAw==",
71
+ "version": "9.16.4",
72
+ "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.16.4.tgz",
73
+ "integrity": "sha512-tWWf2vtJvDaKRtulqqMAq2YfWdtTDdVGnrtmp2DeaJX3rMjeRQPQ4Le+zMUdLIGSKNHZ9/f1BYnTtA1MToeEvQ==",
74
74
  "license": "Apache-2.0",
75
75
  "dependencies": {
76
- "@appium/support": "^6.0.7",
76
+ "@appium/support": "^6.0.8",
77
77
  "@appium/types": "^0.25.2",
78
78
  "@colors/colors": "1.6.0",
79
79
  "async-lock": "1.4.1",
80
80
  "asyncbox": "3.0.0",
81
- "axios": "1.8.2",
81
+ "axios": "1.8.3",
82
82
  "bluebird": "3.7.2",
83
83
  "body-parser": "1.20.3",
84
84
  "express": "4.21.2",
@@ -103,9 +103,9 @@
103
103
  }
104
104
  },
105
105
  "node_modules/@appium/base-driver/node_modules/axios": {
106
- "version": "1.8.2",
107
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz",
108
- "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==",
106
+ "version": "1.8.3",
107
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz",
108
+ "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==",
109
109
  "license": "MIT",
110
110
  "dependencies": {
111
111
  "follow-redirects": "^1.15.6",
@@ -114,13 +114,13 @@
114
114
  }
115
115
  },
116
116
  "node_modules/@appium/base-plugin": {
117
- "version": "2.3.4",
118
- "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.3.4.tgz",
119
- "integrity": "sha512-m3iJ2+68OIEXF87VJ/RYPSg85jVGo73MqAfv5onYyvFuljWgnowZGRFL13lvfnTBxmI5sU9eF1QLO3n7KcQ/eg==",
117
+ "version": "2.3.5",
118
+ "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.3.5.tgz",
119
+ "integrity": "sha512-/9WvjBvXWE5U5Pg7tvcfj/9Dv1tzLaThgUAgDGDh5Ve2ZXBAznz0fR6NSbjyeaFR7UbroF3f9sjlzPNVM180PA==",
120
120
  "license": "Apache-2.0",
121
121
  "dependencies": {
122
- "@appium/base-driver": "^9.16.3",
123
- "@appium/support": "^6.0.7"
122
+ "@appium/base-driver": "^9.16.4",
123
+ "@appium/support": "^6.0.8"
124
124
  },
125
125
  "engines": {
126
126
  "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
@@ -128,12 +128,12 @@
128
128
  }
129
129
  },
130
130
  "node_modules/@appium/docutils": {
131
- "version": "1.0.33",
132
- "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-1.0.33.tgz",
133
- "integrity": "sha512-wY/bkewxrqUIvY69/LvYz1c7/XRFqqn/SND+EGvwWyyxzIfXTTN57SXZmRqWK8HO8v0hk5RMOvaNH+3Me94kTQ==",
131
+ "version": "1.0.34",
132
+ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-1.0.34.tgz",
133
+ "integrity": "sha512-a3zzrx2e/xzoNAbKncuyDfUhExEvX+9wV2Lnb+9cfKlhMAqFudRcTF8aNf7dGVsZjfXPNH049qG6htL8Mn2Gow==",
134
134
  "license": "Apache-2.0",
135
135
  "dependencies": {
136
- "@appium/support": "^6.0.7",
136
+ "@appium/support": "^6.0.8",
137
137
  "@appium/tsconfig": "^0.3.5",
138
138
  "@sliphua/lilconfig-ts-loader": "3.2.2",
139
139
  "chalk": "4.1.2",
@@ -192,9 +192,9 @@
192
192
  }
193
193
  },
194
194
  "node_modules/@appium/support": {
195
- "version": "6.0.7",
196
- "resolved": "https://registry.npmjs.org/@appium/support/-/support-6.0.7.tgz",
197
- "integrity": "sha512-3LYvWhquHzlxq2ojvuAmta2tPk68B6oKZ9lMv2lyI6q7mR7FE8hl96Wy+qk9JjGfqJHYRNrrf9rTWr0E//UtQg==",
195
+ "version": "6.0.8",
196
+ "resolved": "https://registry.npmjs.org/@appium/support/-/support-6.0.8.tgz",
197
+ "integrity": "sha512-vhQtJwD89BbPDb7n+wvYFWKBF1sCd9XS/yTR8eA5mRGM+frCS9mlxy9VNAcjEbxfkLwSa4iqRhp3MzK8L4w4KA==",
198
198
  "license": "Apache-2.0",
199
199
  "dependencies": {
200
200
  "@appium/logger": "^1.6.1",
@@ -202,7 +202,7 @@
202
202
  "@appium/types": "^0.25.2",
203
203
  "@colors/colors": "1.6.0",
204
204
  "archiver": "7.0.1",
205
- "axios": "1.8.2",
205
+ "axios": "1.8.3",
206
206
  "base64-stream": "1.0.0",
207
207
  "bluebird": "3.7.2",
208
208
  "bplist-creator": "0.1.1",
@@ -243,9 +243,9 @@
243
243
  }
244
244
  },
245
245
  "node_modules/@appium/support/node_modules/axios": {
246
- "version": "1.8.2",
247
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz",
248
- "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==",
246
+ "version": "1.8.3",
247
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz",
248
+ "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==",
249
249
  "license": "MIT",
250
250
  "dependencies": {
251
251
  "follow-redirects": "^1.15.6",
@@ -562,18 +562,18 @@
562
562
  }
563
563
  },
564
564
  "node_modules/appium": {
565
- "version": "2.17.0",
566
- "resolved": "https://registry.npmjs.org/appium/-/appium-2.17.0.tgz",
567
- "integrity": "sha512-DY5/Bvz4KNOmW6uPgnXjWg9gOzXxT7ZTtguLcotXj2KKB3Ty0mNqpeLCLpyKDDeFheFWeFfrX73T2Y9PAa8WOA==",
565
+ "version": "2.17.1",
566
+ "resolved": "https://registry.npmjs.org/appium/-/appium-2.17.1.tgz",
567
+ "integrity": "sha512-aE4WuM+/gFblteSYxAxDkdeSFCCMM791KSM9msUvNnfRIn/ZNAvj6HkobCAzGMnFBkYYOISD5diXNPFo/a9rsQ==",
568
568
  "hasInstallScript": true,
569
569
  "license": "Apache-2.0",
570
570
  "dependencies": {
571
- "@appium/base-driver": "^9.16.3",
572
- "@appium/base-plugin": "^2.3.4",
573
- "@appium/docutils": "^1.0.33",
571
+ "@appium/base-driver": "^9.16.4",
572
+ "@appium/base-plugin": "^2.3.5",
573
+ "@appium/docutils": "^1.0.34",
574
574
  "@appium/logger": "^1.6.1",
575
575
  "@appium/schema": "^0.8.1",
576
- "@appium/support": "^6.0.7",
576
+ "@appium/support": "^6.0.8",
577
577
  "@appium/types": "^0.25.2",
578
578
  "@sidvind/better-ajv-errors": "3.0.1",
579
579
  "ajv": "8.17.1",
@@ -581,7 +581,7 @@
581
581
  "argparse": "2.0.1",
582
582
  "async-lock": "1.4.1",
583
583
  "asyncbox": "3.0.0",
584
- "axios": "1.8.2",
584
+ "axios": "1.8.3",
585
585
  "bluebird": "3.7.2",
586
586
  "lilconfig": "3.1.3",
587
587
  "lodash": "4.17.21",
@@ -629,9 +629,9 @@
629
629
  }
630
630
  },
631
631
  "node_modules/appium-android-driver": {
632
- "version": "10.2.2",
633
- "resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-10.2.2.tgz",
634
- "integrity": "sha512-NgjmxedfbUWlwO7AFK00vKedEOuXpfaxXO6KYDVhtL1gIkiLGhTWt3YByJGT6yEpdaKJ3/21ieQR2B/LkcKsZw==",
632
+ "version": "10.2.3",
633
+ "resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-10.2.3.tgz",
634
+ "integrity": "sha512-urP4jqS+rl8oU5zAyCYCyUJ+1Hi58rLB4gvfXIS2MCqe7AzLC3eoAoPgNWc0/A+lCBja5INk8SCpphBSoC+FXg==",
635
635
  "license": "Apache-2.0",
636
636
  "dependencies": {
637
637
  "@appium/support": "^6.0.0",
@@ -662,9 +662,9 @@
662
662
  }
663
663
  },
664
664
  "node_modules/appium-chromedriver": {
665
- "version": "7.0.9",
666
- "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-7.0.9.tgz",
667
- "integrity": "sha512-7T0HTszqwz4jQbtZpZ669BQYgtLcEucyTIEmHnv72pvmshrwNr/KELouRkY7VcazzW88w+bpcYh3/3bzs9Si2w==",
665
+ "version": "7.0.10",
666
+ "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-7.0.10.tgz",
667
+ "integrity": "sha512-ksW8PLm5cxzAUEnaesjSJ58e+Ey3baXtEdGZNyvzzFOuaO3NfGDN/g1RojQNL+N9QkMFy3gylwkrCcy+yIOuDw==",
668
668
  "license": "Apache-2.0",
669
669
  "dependencies": {
670
670
  "@appium/base-driver": "^9.1.0",
@@ -697,9 +697,9 @@
697
697
  }
698
698
  },
699
699
  "node_modules/appium/node_modules/axios": {
700
- "version": "1.8.2",
701
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz",
702
- "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==",
700
+ "version": "1.8.3",
701
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz",
702
+ "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==",
703
703
  "license": "MIT",
704
704
  "dependencies": {
705
705
  "follow-redirects": "^1.15.6",
@@ -794,9 +794,9 @@
794
794
  "license": "MIT"
795
795
  },
796
796
  "node_modules/axios": {
797
- "version": "1.8.3",
798
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz",
799
- "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==",
797
+ "version": "1.8.4",
798
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
799
+ "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
800
800
  "license": "MIT",
801
801
  "dependencies": {
802
802
  "follow-redirects": "^1.15.6",
@@ -1420,9 +1420,9 @@
1420
1420
  }
1421
1421
  },
1422
1422
  "node_modules/css-selector-parser": {
1423
- "version": "3.0.5",
1424
- "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.0.5.tgz",
1425
- "integrity": "sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==",
1423
+ "version": "3.1.1",
1424
+ "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.1.1.tgz",
1425
+ "integrity": "sha512-Y+DuvJ7JAjpL1f4DeILe5sXCC3kRXMl0DxM4lAWbS8/jEZ29o3V0L5TL6zIifj4Csmj6c+jiF2ENjida2OVOGA==",
1426
1426
  "funding": [
1427
1427
  {
1428
1428
  "type": "github",
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "automated testing",
8
8
  "android"
9
9
  ],
10
- "version": "4.1.2",
10
+ "version": "4.1.4",
11
11
  "bugs": {
12
12
  "url": "https://github.com/appium/appium-uiautomator2-driver/issues"
13
13
  },
@@ -57,7 +57,7 @@
57
57
  },
58
58
  "dependencies": {
59
59
  "appium-adb": "^12.12.0",
60
- "appium-android-driver": "^10.2.2",
60
+ "appium-android-driver": "^10.2.3",
61
61
  "appium-uiautomator2-server": "^7.2.0",
62
62
  "asyncbox": "^3.0.0",
63
63
  "axios": "^1.6.5",