appium-xcuitest-driver 10.13.1 → 10.13.2

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.
@@ -11,31 +11,23 @@ const lodash_1 = __importDefault(require("lodash"));
11
11
  const css_converter_1 = require("../css-converter");
12
12
  const driver_1 = require("appium/driver");
13
13
  const support_1 = require("appium/support");
14
- /**
15
- * @this {XCUITestDriver}
16
- */
17
14
  async function findElOrEls(strategy, selector, mult, context) {
18
15
  if (this.isWebview()) {
19
- return await this.findWebElementOrElements(strategy, selector, mult, context);
20
- }
21
- else {
22
- return await this.findNativeElementOrElements(strategy, selector, mult, context);
16
+ return mult
17
+ ? await this.findWebElementOrElements(strategy, selector, true, context)
18
+ : await this.findWebElementOrElements(strategy, selector, false, context);
23
19
  }
20
+ return mult
21
+ ? await this.findNativeElementOrElements(strategy, selector, true, context)
22
+ : await this.findNativeElementOrElements(strategy, selector, false, context);
24
23
  }
25
- /**
26
- * @this {XCUITestDriver}
27
- * @privateRemarks I'm not sure what these objects are; they aren't `Element`.
28
- * @returns {Promise<any|any[]|undefined>}
29
- */
30
24
  async function findNativeElementOrElements(strategy, selector, mult, context) {
31
25
  const initSelector = selector;
32
26
  let rewroteSelector = false;
33
27
  if (strategy === '-ios predicate string') {
34
- // WebDriverAgent uses 'predicate string'
35
28
  strategy = 'predicate string';
36
29
  }
37
30
  else if (strategy === '-ios class chain') {
38
- // WebDriverAgent uses 'class chain'
39
31
  strategy = WDA_CLASS_CHAIN_STRATEGY;
40
32
  }
41
33
  else if (strategy === 'css selector') {
@@ -43,12 +35,9 @@ async function findNativeElementOrElements(strategy, selector, mult, context) {
43
35
  selector = css_converter_1.CssConverter.toIosClassChainSelector(selector);
44
36
  }
45
37
  if (strategy === 'class name') {
46
- // XCUITest classes have `XCUIElementType` prepended
47
- // first check if there is the old `UIA` prefix
48
38
  if (selector.startsWith('UIA')) {
49
39
  selector = selector.substring(3);
50
40
  }
51
- // now check if we need to add `XCUIElementType`
52
41
  if (!selector.startsWith('XCUIElementType')) {
53
42
  selector = stripViewFromSelector(`XCUIElementType${selector}`);
54
43
  rewroteSelector = true;
@@ -61,8 +50,7 @@ async function findNativeElementOrElements(strategy, selector, mult, context) {
61
50
  [strategy, selector] = rewriteMagicScrollable(mult, this.log);
62
51
  }
63
52
  else if (strategy === 'xpath') {
64
- // Replace UIA if it comes after a forward slash or is at the beginning of the string
65
- selector = selector.replace(/(^|\/)(UIA)([^[/]+)/g, (str, g1, g2, g3) => {
53
+ selector = selector.replace(/(^|\/)(UIA)([^[/]+)/g, (str, g1, _g2, g3) => {
66
54
  rewroteSelector = true;
67
55
  return g1 + stripViewFromSelector(`XCUIElementType${g3}`);
68
56
  });
@@ -72,39 +60,32 @@ async function findNativeElementOrElements(strategy, selector, mult, context) {
72
60
  `'${selector}' to match XCUI type. You should consider ` +
73
61
  `updating your tests to use the new selectors directly`);
74
62
  }
75
- return await this.doNativeFind(strategy, selector, mult, context);
63
+ return mult
64
+ ? await this.doNativeFind(strategy, selector, true, context)
65
+ : await this.doNativeFind(strategy, selector, false, context);
76
66
  }
77
- /**
78
- * @this {XCUITestDriver}
79
- */
80
67
  async function doNativeFind(strategy, selector, mult, context) {
81
- context = support_1.util.unwrapElement(context);
82
- let endpoint = `/element${context ? `/${context}/element` : ''}${mult ? 's' : ''}`;
83
- let body = {
68
+ const ctx = support_1.util.unwrapElement(context ?? null);
69
+ const endpoint = `/element${ctx ? `/${ctx}/element` : ''}${mult ? 's' : ''}`;
70
+ const body = {
84
71
  using: strategy,
85
72
  value: selector,
86
73
  };
87
- /** @type {import('./proxy-helper').AllowedHttpMethod} */
88
74
  const method = 'POST';
89
- // This is either an array is mult === true
90
- // or an object if mult === false
91
- /** @type {Element[]|undefined} */
92
- let els;
75
+ let els = [];
93
76
  try {
94
77
  await this.implicitWaitForCondition(async () => {
95
78
  try {
96
- els = /** @type {Element[]|undefined} */ (await this.proxyCommand(endpoint, method, body));
79
+ els = (await this.proxyCommand(endpoint, method, body));
97
80
  }
98
81
  catch {
99
82
  els = [];
100
83
  }
101
- // we succeed if we get some elements
102
84
  return !lodash_1.default.isEmpty(els);
103
85
  });
104
86
  }
105
87
  catch (err) {
106
88
  if (err.message?.match(/Condition unmet/)) {
107
- // condition was not met setting res to empty array
108
89
  els = [];
109
90
  }
110
91
  else {
@@ -112,15 +93,21 @@ async function doNativeFind(strategy, selector, mult, context) {
112
93
  }
113
94
  }
114
95
  if (mult) {
115
- return els;
96
+ return Array.isArray(els) ? els : [els];
116
97
  }
117
- if (lodash_1.default.isEmpty(els)) {
98
+ if (Array.isArray(els)) {
99
+ if (lodash_1.default.isEmpty(els)) {
100
+ throw new driver_1.errors.NoSuchElementError();
101
+ }
102
+ return els[0];
103
+ }
104
+ if (!els) {
118
105
  throw new driver_1.errors.NoSuchElementError();
119
106
  }
120
107
  return els;
121
108
  }
122
109
  /**
123
- * @this {XCUITestDriver}
110
+ * Finds the first visible child element inside a context.
124
111
  */
125
112
  async function getFirstVisibleChild(mult, context) {
126
113
  this.log.info(`Getting first visible child`);
@@ -131,16 +118,10 @@ async function getFirstVisibleChild(mult, context) {
131
118
  throw new Error('Cannot get first visible child without a context element');
132
119
  }
133
120
  let index = 1;
134
- // loop through children via class-chain finds, until we run out of children
135
- // or we find a visible one. This loop looks infinite but its not, because at
136
- // some point the call to doNativeFind will throw with an Element Not Found
137
- // error, when the index gets higher than the number of child elements. This
138
- // is what we want because that error will halt the loop and make it all the
139
- // way to the client.
140
121
  while (true) {
141
122
  const strategy = WDA_CLASS_CHAIN_STRATEGY;
142
123
  const selector = `*[${index}]`;
143
- const nthChild = await this.doNativeFind(strategy, selector, false, context);
124
+ const nthChild = (await this.doNativeFind(strategy, selector, false, context));
144
125
  const visible = await this.getAttribute('visible', nthChild);
145
126
  if (visible === 'true') {
146
127
  this.log.info(`Found first visible child at position ${index}`);
@@ -149,17 +130,10 @@ async function getFirstVisibleChild(mult, context) {
149
130
  index++;
150
131
  }
151
132
  }
152
- // we override the xpath search for this first-visible-child selector, which
153
- // looks like /*[@firstVisible="true"]
154
133
  const MAGIC_FIRST_VIS_CHILD_SEL = /\/\*\[@firstVisible\s*=\s*('|")true\1\]/;
155
- // we likewise override xpath search to provide a shortcut for finding all
156
- // scrollable elements
157
134
  const MAGIC_SCROLLABLE_SEL = /\/\/\*\[@scrollable\s*=\s*('|")true\1\]/;
158
135
  const WDA_CLASS_CHAIN_STRATEGY = 'class chain';
159
- // Check if the word 'View' is appended to selector and if it is, strip it out
160
136
  function stripViewFromSelector(selector) {
161
- // Don't strip it out if it's one of these 4 element types
162
- // (see https://github.com/facebook/WebDriverAgent/blob/master/WebDriverAgentLib/Utilities/FBElementTypeTransformer.m for reference)
163
137
  const keepView = [
164
138
  'XCUIElementTypeScrollView',
165
139
  'XCUIElementTypeCollectionView',
@@ -167,18 +141,10 @@ function stripViewFromSelector(selector) {
167
141
  'XCUIElementTypeWebView',
168
142
  ].includes(selector);
169
143
  if (!keepView && selector.indexOf('View') === selector.length - 4) {
170
- return selector.substr(0, selector.length - 4);
171
- }
172
- else {
173
- return selector;
144
+ return selector.substring(0, selector.length - 4);
174
145
  }
146
+ return selector;
175
147
  }
176
- /**
177
- *
178
- * @param {boolean} mult
179
- * @param {import('@appium/types').AppiumLogger|null} log
180
- * @returns {[string, string]}
181
- */
182
148
  function rewriteMagicScrollable(mult, log = null) {
183
149
  const pred = ['ScrollView', 'Table', 'CollectionView', 'WebView']
184
150
  .map((t) => `type == "XCUIElementType${t}"`)
@@ -192,8 +158,4 @@ function rewriteMagicScrollable(mult, log = null) {
192
158
  `format with selector '${selector}'`);
193
159
  return [strategy, selector];
194
160
  }
195
- /**
196
- * @typedef {import('../driver').XCUITestDriver} XCUITestDriver
197
- * @typedef {import('@appium/types').Element} Element
198
- */
199
161
  //# sourceMappingURL=find.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"find.js","sourceRoot":"","sources":["../../../lib/commands/find.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../../../lib/commands/find.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../../lib/commands/navigation.js"],"names":[],"mappings":"AASA;;GAEG;AACH,8EAMC;AAED;;GAEG;AACH,iFAIC;AAED;;GAEG;AACH,oFAsBC;AAED;;;;;;;;;;;;GAYG;AACH,8EAPW,MAAM,aACN,MAAM,GAEJ,OAAO,CAAC,IAAI,CAAC,CASzB;AAED;;GAEG;AACH,uFAiCC;6BAGY,OAAO,WAAW,EAAE,cAAc;;;;;SAKjC,MAAM;;;;;;cACN,MAAM,OAAC"}
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../../lib/commands/navigation.js"],"names":[],"mappings":"AAQA;;GAEG;AACH,8EAMC;AAED;;GAEG;AACH,iFAIC;AAED;;GAEG;AACH,oFAsBC;AAED;;;;;;;;;;;;GAYG;AACH,8EAPW,MAAM,aACN,MAAM,GAEJ,OAAO,CAAC,IAAI,CAAC,CASzB;AAED;;GAEG;AACH,uFAwCC;6BAGY,OAAO,WAAW,EAAE,cAAc;;;;;SAKjC,MAAM;;;;;;cACN,MAAM,OAAC"}
@@ -1,7 +1,4 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.back = back;
7
4
  exports.forward = forward;
@@ -9,7 +6,6 @@ exports.closeWindow = closeWindow;
9
6
  exports.mobileDeepLink = mobileDeepLink;
10
7
  exports.nativeBack = nativeBack;
11
8
  const driver_1 = require("appium/driver");
12
- const lodash_1 = __importDefault(require("lodash"));
13
9
  const asyncbox_1 = require("asyncbox");
14
10
  const utils_1 = require("../utils");
15
11
  // these two constitute the wait after closing a window
@@ -89,20 +85,22 @@ async function nativeBack() {
89
85
  return await this.mobilePressButton('Menu');
90
86
  }
91
87
  try {
92
- let navBar = await this.findNativeElementOrElements('class name', 'XCUIElementTypeNavigationBar', false);
93
- let buttons = await this.findNativeElementOrElements('class name', 'XCUIElementTypeButton', true, navBar);
94
- if (buttons?.length === 0) {
95
- throw new Error('No buttons found in navigation bar');
96
- }
97
- let backButton = lodash_1.default.filter(buttons, (value) => value.label === 'Back')[0];
98
- if (backButton) {
88
+ const navBar = await this.findNativeElementOrElements('class name', 'XCUIElementTypeNavigationBar', false);
89
+ let dstButton;
90
+ const backButtons = await this.findNativeElementOrElements('-ios predicate string', 'type == "XCUIElementTypeButton" AND label == "Back"', true, navBar);
91
+ if (backButtons.length === 0) {
92
+ const buttons = await this.findNativeElementOrElements('-ios predicate string', 'type == "XCUIElementTypeButton"', true, navBar);
93
+ if (buttons.length === 0) {
94
+ throw new Error('No buttons found in navigation bar');
95
+ }
99
96
  this.log.debug(`Found navigation bar 'back' button. Clicking.`);
97
+ dstButton = buttons[0];
100
98
  }
101
99
  else {
102
- this.log.debug(`Unable to find 'Back' button. Trying first button in navigation bar`);
103
- backButton = buttons?.[0];
100
+ this.log.debug(`Did not find any navigation bar 'back' button. Clicking the first one.`);
101
+ dstButton = backButtons[0];
104
102
  }
105
- await this.nativeClick(/** @type {string} */ (backButton));
103
+ await this.nativeClick(dstButton);
106
104
  }
107
105
  catch (err) {
108
106
  this.log.error(`Unable to find navigation bar and back button: ${err.message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../../lib/commands/navigation.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../../lib/commands/navigation.js"],"names":[],"mappings":"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"}
@@ -9,6 +9,9 @@ import {exec} from 'teen_process';
9
9
  import {findAPortNotInUse, checkPortStatus} from 'portscanner';
10
10
  import {Pyidevice} from '../device/clients/py-ios-device-client';
11
11
  import {errors} from 'appium/driver';
12
+ import type {Simulator} from 'appium-ios-simulator';
13
+ import type {XCUITestDriver} from '../driver';
14
+ import type {CertificateList} from './types';
12
15
 
13
16
  const CONFIG_EXTENSION = 'mobileconfig';
14
17
  const HOST_PORT_RANGE = [38200, 38299];
@@ -62,11 +65,8 @@ const OPEN_SSL_PATTERN = /,\sCN\s=\s([^,]+)/;
62
65
 
63
66
  /**
64
67
  * Parses the common name of the certificate from the given string.
65
- *
66
- * @param {string} stringCertificate
67
- * @returns {string} The common name of the certificate
68
68
  */
69
- export function parseCommonName(stringCertificate) {
69
+ export function parseCommonName(stringCertificate: string): string {
70
70
  const result = [LIBRE_SSL_PATTERN, OPEN_SSL_PATTERN].reduce((acc, r) => {
71
71
  if (acc) {
72
72
  return acc;
@@ -87,22 +87,28 @@ export function parseCommonName(stringCertificate) {
87
87
  * certificates on Simulator over CLI.
88
88
  *
89
89
  * On real devices (or simulators before Xcode SDK 11.4), Apple provides no "official" way to do this via the command line. In such a case (and also as a fallback if CLI setup fails), this method tries to wrap the certificate into `.mobileconfig` format, then deploys the wrapped file to the internal HTTP server so that it can be opened via mobile Safari. This command then goes through the profile installation procedure by clicking the necessary buttons using WebDriverAgent.
90
- * @param {string} content - Base64-encoded content of the public certificate in [PEM](https://knowledge.digicert.com/quovadis/ssl-certificates/ssl-general-topics/what-is-pem-format.html) format
91
- * @param {string} [commonName] - Common name of the certificate. If this is not set, the command will try to parse it from the provided `content`.
92
- * @param {boolean} isRoot - Defines where the certificate should be installed; either the Trusted Root Store (`true`) or the Keychain (`false`). On environments other than Xcode 11.4+ Simulator, this option is ignored.
93
- * @returns {Promise<string|void>} The content of the generated `.mobileconfig` file as
90
+ * @param content - Base64-encoded content of the public certificate in [PEM](https://knowledge.digicert.com/quovadis/ssl-certificates/ssl-general-topics/what-is-pem-format.html) format
91
+ * @param commonName - Common name of the certificate. If this is not set, the command will try to parse it from the provided `content`.
92
+ * @param isRoot - Defines where the certificate should be installed; either the Trusted Root Store (`true`) or the Keychain (`false`). On environments other than Xcode 11.4+ Simulator, this option is ignored.
93
+ * @returns The content of the generated `.mobileconfig` file as
94
94
  * a base64-encoded string. This config might be useful for debugging purposes. If the certificate has been successfully set via CLI, then nothing is returned.
95
- * @this {XCUITestDriver}
96
95
  */
97
- export async function mobileInstallCertificate(content, commonName, isRoot = true) {
96
+ export async function mobileInstallCertificate(
97
+ this: XCUITestDriver,
98
+ content: string,
99
+ commonName?: string,
100
+ isRoot = true,
101
+ ): Promise<string | void> {
98
102
  if (_.isEmpty(content)) {
99
103
  throw new Error('Certificate content should not be empty');
100
104
  }
101
105
 
102
106
  if (this.isSimulator()) {
103
107
  try {
104
- const methodName = isRoot ? 'addRootCertificate' : 'addCertificate';
105
- await /** @type {import('appium-ios-simulator').Simulator} */ (this.device).simctl[methodName](Buffer.from(content, 'base64').toString(), {
108
+ const methodName: 'addRootCertificate' | 'addCertificate' = isRoot
109
+ ? 'addRootCertificate'
110
+ : 'addCertificate';
111
+ await (this.device as Simulator).simctl[methodName](Buffer.from(content, 'base64').toString(), {
106
112
  raw: true,
107
113
  });
108
114
  return;
@@ -188,11 +194,12 @@ export async function mobileInstallCertificate(content, commonName, isRoot = tru
188
194
  }
189
195
  }
190
196
  } else {
191
- await /** @type {import('appium-ios-simulator').Simulator} */ (this.device).openUrl(certUrl);
197
+ await (this.device as Simulator).openUrl(certUrl);
192
198
  }
193
199
 
194
200
  let isCertAlreadyInstalled = false;
195
- if (util.compareVersions(/** @type {string} */ (this.opts.platformVersion), '>=', '12.2')) {
201
+ const platformVersion = this.opts.platformVersion ?? '';
202
+ if (util.compareVersions(platformVersion, '>=', '12.2')) {
196
203
  if (await installPost122Certificate(this, cn)) {
197
204
  await clickElement(this, Settings.Profile);
198
205
  await trustCertificateInPreferences(this, cn);
@@ -238,17 +245,19 @@ export async function mobileInstallCertificate(content, commonName, isRoot = tru
238
245
  *
239
246
  * @see https://github.com/YueChen-C/py-ios-device
240
247
  * @since 4.19.2
241
- * @param {string} name - Name of the profile
242
- * @returns {Promise<string>} Returns status acknowledgment status if
243
- * tht certificate is successfully removed or 'None' (basically just
244
- * forwards the original pyidevice output)
248
+ * @param name - Name of the profile
249
+ * @returns Status acknowledgment if
250
+ * the certificate is successfully removed or 'None' (forwards pyidevice output)
245
251
  * @throws {Error} If attempting to remove certificates for a simulated device or if `py-ios-device` is not installed
246
252
  * @group Real Device Only
247
253
  */
248
- export async function mobileRemoveCertificate(name) {
254
+ export async function mobileRemoveCertificate(this: XCUITestDriver, name: string): Promise<string> {
249
255
  if (!this.isRealDevice()) {
250
256
  throw new errors.NotImplementedError('This extension is only supported on real devices');
251
257
  }
258
+ if (!this.opts.udid) {
259
+ throw new Error('udid capability is required');
260
+ }
252
261
  const client = new Pyidevice({
253
262
  udid: this.opts.udid,
254
263
  log: this.log,
@@ -263,11 +272,10 @@ export async function mobileRemoveCertificate(name) {
263
272
  * This only works _if and only if_ `py-ios-device` is installed on the same machine Appium is running on.
264
273
  * @since 4.10.0
265
274
  * @see https://github.com/YueChen-C/py-ios-device
266
- * @returns {Promise<import('./types').CertificateList>} An object describing the certificates installed on the real device.
275
+ * @returns An object describing the certificates installed on the real device.
267
276
  * @throws {Error} If attempting to list certificates for a simulated device or if `py-ios-device` is not installed
268
- * @this {XCUITestDriver}
269
277
  */
270
- export async function mobileListCertificates() {
278
+ export async function mobileListCertificates(this: XCUITestDriver): Promise<CertificateList> {
271
279
  if (!this.isRealDevice()) {
272
280
  throw new errors.NotImplementedError('This extension is only supported on real devices');
273
281
  }
@@ -287,9 +295,9 @@ export async function mobileListCertificates() {
287
295
  * Extracts the common name of the certificate from the given buffer.
288
296
  *
289
297
  * @param {Buffer} certBuffer
290
- * @returns {Promise<string>} The common name of the certificate
298
+ * @returns The common name of the certificate
291
299
  */
292
- async function extractCommonName(certBuffer) {
300
+ async function extractCommonName(certBuffer: Buffer): Promise<string> {
293
301
  const tempCert = await tempDir.open({
294
302
  prefix: 'cert',
295
303
  suffix: '.cer',
@@ -315,12 +323,12 @@ async function extractCommonName(certBuffer) {
315
323
  * for more details on such profiles.
316
324
  *
317
325
  * @param {Buffer} certBuffer - The actual content of PEM certificate encoded into NodeJS buffer
318
- * @param {string} commonName - Certificate's common name
326
+ * @param commonName - Certificate's common name
319
327
  * @returns {Object} The encoded structure of the given certificate, which is ready to be passed
320
328
  * as an argument to plist builder
321
329
  * @throws {Error} If the given certificate cannot be parsed
322
330
  */
323
- function toMobileConfig(certBuffer, commonName) {
331
+ function toMobileConfig(certBuffer: Buffer, commonName: string): Record<string, any> {
324
332
  const getUUID = () => util.uuidV4().toUpperCase();
325
333
  const contentUuid = getUUID();
326
334
  return {
@@ -345,8 +353,12 @@ function toMobileConfig(certBuffer, commonName) {
345
353
  };
346
354
  }
347
355
 
348
- async function clickElement(driver, locator, options = {}) {
349
- let element = null;
356
+ async function clickElement(
357
+ driver: XCUITestDriver,
358
+ locator: {type: string; value: string},
359
+ options: {timeout?: number; skipIfInvisible?: boolean} = {},
360
+ ): Promise<boolean> {
361
+ let element: any = null;
350
362
  const {timeout = 5000, skipIfInvisible = false} = options;
351
363
  const lookupDelay = 500;
352
364
  try {
@@ -365,7 +377,7 @@ async function clickElement(driver, locator, options = {}) {
365
377
  return true;
366
378
  }
367
379
 
368
- async function installPre122Certificate(driver) {
380
+ async function installPre122Certificate(driver: XCUITestDriver): Promise<boolean> {
369
381
  // Accept Safari alert
370
382
  await clickElement(driver, Button.Allow, {
371
383
  // certificate load might take some time on slow machines
@@ -393,7 +405,7 @@ async function installPre122Certificate(driver) {
393
405
  return true;
394
406
  }
395
407
 
396
- async function trustCertificateInPreferences(driver, name) {
408
+ async function trustCertificateInPreferences(driver: XCUITestDriver, name: string): Promise<void> {
397
409
  await clickElement(driver, Settings.General);
398
410
  await clickElement(driver, Settings.About);
399
411
  const switchLocator = {
@@ -401,14 +413,12 @@ async function trustCertificateInPreferences(driver, name) {
401
413
  value: `**/XCUIElementTypeCell[\`label == '${name}'\`]/**/XCUIElementTypeSwitch`,
402
414
  };
403
415
  await retry(5, async () => {
404
- await driver.mobileSwipe({
405
- element: await driver.findNativeElementOrElements(
406
- 'class name',
407
- 'XCUIElementTypeTable',
408
- false,
409
- ),
410
- direction: 'up',
411
- });
416
+ const tableEl = await driver.findNativeElementOrElements(
417
+ 'class name',
418
+ 'XCUIElementTypeTable',
419
+ false,
420
+ );
421
+ await driver.mobileSwipe('up', undefined, tableEl);
412
422
  await clickElement(driver, Settings.Certificate_Trust_Settings, {
413
423
  timeout: 500,
414
424
  });
@@ -433,7 +443,7 @@ async function trustCertificateInPreferences(driver, name) {
433
443
  }
434
444
  }
435
445
 
436
- async function installPost122Certificate(driver, name) {
446
+ async function installPost122Certificate(driver: XCUITestDriver, name: string): Promise<boolean> {
437
447
  // Accept Safari alert
438
448
  await clickElement(driver, Button.Allow, {
439
449
  // certificate load might take some time on slow machines
@@ -466,14 +476,12 @@ async function installPost122Certificate(driver, name) {
466
476
  break;
467
477
  }
468
478
 
469
- await driver.mobileSwipe({
470
- element: await driver.findNativeElementOrElements(
471
- 'class name',
472
- 'XCUIElementTypeTable',
473
- false,
474
- ),
475
- direction: 'up',
476
- });
479
+ const tableEl = await driver.findNativeElementOrElements(
480
+ 'class name',
481
+ 'XCUIElementTypeTable',
482
+ false,
483
+ );
484
+ await driver.mobileSwipe('up', undefined, tableEl);
477
485
  }
478
486
  if (!isCertFound) {
479
487
  throw new Error(`'${name}' cannot be found in the certificates list`);
@@ -498,6 +506,3 @@ async function installPost122Certificate(driver, name) {
498
506
  return true;
499
507
  }
500
508
 
501
- /**
502
- * @typedef {import('../driver').XCUITestDriver} XCUITestDriver
503
- */