@keepsnappy/appium-driver 0.0.0-stage → 0.1.0-alpha.12

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.
Files changed (44) hide show
  1. package/README.md +37 -2
  2. package/dist/src/browserstack.d.ts +24 -0
  3. package/dist/src/browserstack.js +54 -0
  4. package/dist/src/browserstack.js.map +1 -0
  5. package/dist/src/cli.d.ts +2 -0
  6. package/dist/src/cli.js +8 -0
  7. package/dist/src/cli.js.map +1 -0
  8. package/dist/src/index.d.ts +10 -0
  9. package/dist/src/index.js +11 -0
  10. package/dist/src/index.js.map +1 -0
  11. package/dist/src/journey.d.ts +43 -0
  12. package/dist/src/journey.js +2 -0
  13. package/dist/src/journey.js.map +1 -0
  14. package/dist/src/links.d.ts +35 -0
  15. package/dist/src/links.js +87 -0
  16. package/dist/src/links.js.map +1 -0
  17. package/dist/src/load.d.ts +4 -0
  18. package/dist/src/load.js +23 -0
  19. package/dist/src/load.js.map +1 -0
  20. package/dist/src/platform.d.ts +63 -0
  21. package/dist/src/platform.js +145 -0
  22. package/dist/src/platform.js.map +1 -0
  23. package/dist/src/run.d.ts +92 -0
  24. package/dist/src/run.js +157 -0
  25. package/dist/src/run.js.map +1 -0
  26. package/dist/src/selectors.d.ts +25 -0
  27. package/dist/src/selectors.js +57 -0
  28. package/dist/src/selectors.js.map +1 -0
  29. package/dist/src/session.d.ts +199 -0
  30. package/dist/src/session.js +602 -0
  31. package/dist/src/session.js.map +1 -0
  32. package/dist/src/snapshot.d.ts +64 -0
  33. package/dist/src/snapshot.js +197 -0
  34. package/dist/src/snapshot.js.map +1 -0
  35. package/dist/src/tokens.d.ts +14 -0
  36. package/dist/src/tokens.js +28 -0
  37. package/dist/src/tokens.js.map +1 -0
  38. package/dist/src/version.d.ts +14 -0
  39. package/dist/src/version.js +69 -0
  40. package/dist/src/version.js.map +1 -0
  41. package/dist/src/webdriver.d.ts +88 -0
  42. package/dist/src/webdriver.js +237 -0
  43. package/dist/src/webdriver.js.map +1 -0
  44. package/package.json +36 -4
@@ -0,0 +1,602 @@
1
+ import { END_GC_DEFAULT, activationLink, flushLink } from './links.js';
2
+ import { describeSelector, toSelector } from './selectors.js';
3
+ import { WdError } from './webdriver.js';
4
+ /** The API takes at most this many markers in one request; more go out in several. */
5
+ export const MARKERS_PER_REQUEST = 500;
6
+ const MARKER_TRIES = 3;
7
+ /**
8
+ * Small /v1/clock round trips per run after its markers. The marker batch is one slow trip (a large body), and the API takes
9
+ * the shortest trip's half-delay as the host clock's error: one trip left it at 130-200 ms, more than a short step lasts.
10
+ */
11
+ export const HOST_CLOCK_TRIPS = 6;
12
+ const RETRY_BASE_MS = 1_000;
13
+ /** A fling: 80 ms over half a list's height (from 80 % to 30 %), as the audience list's swipe. */
14
+ const FLING_MS = 80;
15
+ const FLING_FROM = 0.8;
16
+ const FLING_TO = 0.3;
17
+ /** Only ends a list that never reaches its end (content that did not load); the number of flings is what the list needs. */
18
+ const FLING_TIMEOUT_MS = 30_000;
19
+ /** How many times an element gone stale is looked up again, per frame read, before the read fails. */
20
+ const STALE_REFINDS = 3;
21
+ /** Between two frame reads of a settle check: a poll, not a spin, on a local Appium. */
22
+ const FRAME_POLL_MS = 50;
23
+ const sameRect = (a, b) => a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;
24
+ const RETRY_AFTER_CAP_MS = 30_000;
25
+ /** POSTs and reads the server's clock from the answer, so every request is also a round trip (plan 51 G1.4). */
26
+ async function post(fetchImpl, url, token, body, now) {
27
+ const t0 = now();
28
+ try {
29
+ const res = await fetchImpl(url, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify(body) });
30
+ const t3 = now();
31
+ const after = Number(res.headers?.get?.('retry-after'));
32
+ const parsed = await res.json().catch(() => null);
33
+ const clock = parsed?.clock;
34
+ const trip = typeof clock?.recv_ms === 'number' && typeof clock.send_ms === 'number' ? { t0, t1: clock.recv_ms, t2: clock.send_ms, t3 } : null;
35
+ return { status: res.status, retryAfterMs: Number.isFinite(after) && after > 0 ? after * 1000 : null, body: parsed, trip };
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ /** One request, tried again on a network error, 429 or 5xx (3 tries, backoff doubling from 1 s, Retry-After honoured). */
42
+ async function postWithRetry(fetchImpl, url, token, body, sleep, now) {
43
+ let answer = null;
44
+ for (let attempt = 0; attempt < MARKER_TRIES; attempt++) {
45
+ if (attempt > 0)
46
+ await sleep(Math.min(answer?.retryAfterMs ?? RETRY_BASE_MS * 2 ** (attempt - 1), RETRY_AFTER_CAP_MS));
47
+ answer = await post(fetchImpl, url, token, body, now);
48
+ if (answer && answer.status !== 429 && answer.status < 500)
49
+ return answer;
50
+ }
51
+ return answer;
52
+ }
53
+ const itemsArrived = (body) => {
54
+ const results = body?.results;
55
+ return Array.isArray(results) ? results.filter((r) => r?.ok === true).length : null;
56
+ };
57
+ /**
58
+ * The iteration's markers, posted after it ended so sending never changes the test's pace: one request per run token
59
+ * (per 500 markers), so a long journey does not run into the API's per-run rate limit. An API that predates batches
60
+ * answers 400 without per-item results; its markers then go one by one as before. Each request is a round trip on the
61
+ * clock of `t_host`: its trip rides on the run's next request and the last one goes to /v1/clock, followed by
62
+ * HOST_CLOCK_TRIPS small clock round trips, so the API can put the markers on the device's clock. Returns how many arrived.
63
+ */
64
+ export async function sendMarkers(fetchImpl, api, markers, opts = {}) {
65
+ const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
66
+ const now = opts.now ?? Date.now;
67
+ const byToken = new Map();
68
+ for (const m of markers.splice(0)) {
69
+ if (!m.token || !api)
70
+ continue;
71
+ const list = byToken.get(m.token) ?? [];
72
+ list.push(m);
73
+ byToken.set(m.token, list);
74
+ }
75
+ const base = api.replace(/\/+$/, '');
76
+ const url = `${base}/v1/markers`;
77
+ let sent = 0;
78
+ for (const [token, list] of byToken) {
79
+ // A trip belongs to the run whose token carried it.
80
+ const trips = [];
81
+ const withClock = (body) => {
82
+ const carried = trips.splice(0);
83
+ return carried.length ? { ...body, clock: carried } : body;
84
+ };
85
+ const send = async (body) => {
86
+ const answer = await postWithRetry(fetchImpl, url, token, withClock(body), sleep, now);
87
+ if (answer?.trip)
88
+ trips.push(answer.trip);
89
+ return answer;
90
+ };
91
+ for (let i = 0; i < list.length; i += MARKERS_PER_REQUEST) {
92
+ const chunk = list.slice(i, i + MARKERS_PER_REQUEST).map((m) => ({ step: m.step, phase: m.phase, t_host: m.t_host, ...(m.gc_n !== undefined ? { gc_n: m.gc_n } : {}) }));
93
+ const answer = await send({ markers: chunk });
94
+ const arrived = answer && answer.status < 300 ? itemsArrived(answer.body) : null;
95
+ if (arrived !== null) {
96
+ sent += arrived;
97
+ continue;
98
+ }
99
+ // An API that predates batches answers 400; one that takes batches but not this size, 413: both get the markers one by one.
100
+ if ((answer?.status !== 400 && answer?.status !== 413) || itemsArrived(answer.body) !== null)
101
+ continue;
102
+ for (const one of chunk) {
103
+ const single = await send(one);
104
+ if (single && single.status < 300)
105
+ sent++;
106
+ }
107
+ }
108
+ // Each clock request reports the trips so far and is itself the next trip; an API that answers without its clock gets none.
109
+ for (let i = 0; i < HOST_CLOCK_TRIPS && trips.length; i++) {
110
+ const answer = await post(fetchImpl, `${base}/v1/clock`, token, { source: 'host', samples: trips.splice(0) }, now);
111
+ if (answer?.trip)
112
+ trips.push(answer.trip);
113
+ }
114
+ if (trips.length)
115
+ await post(fetchImpl, `${base}/v1/clock`, token, { source: 'host', samples: trips.splice(0) }, now);
116
+ }
117
+ return sent;
118
+ }
119
+ // The SDK raises `perflab.flushed` at most ARTIFACT_FLUSH_WORST_CASE_MS after the link (packages/react-native/js/sdk/artifacts.ts); the driver cannot import the SDK.
120
+ const SDK_FLUSH_WORST_CASE_MS = 315_000;
121
+ const FLUSH_MARGIN_MS = 30_000;
122
+ export const FLUSH_WAIT_MS = SDK_FLUSH_WORST_CASE_MS + FLUSH_MARGIN_MS;
123
+ const FLUSH_POLL_MS = 500;
124
+ // XPath dumps every window, so it runs on every 10th poll (5 s) at most.
125
+ const FLUSH_FALLBACK_EVERY = 10;
126
+ // Reading the page source costs 1 to 3.5 s on the S23, inside the measured step, so it is asked for at most this often.
127
+ const RESCUE_EVERY_MS = 3000;
128
+ const noop = async () => undefined;
129
+ /** One measured session: the phone, the run tokens, and the step vocabulary a journey calls. */
130
+ export class Session {
131
+ driver;
132
+ scheme;
133
+ fetch;
134
+ api;
135
+ markers = [];
136
+ token = '';
137
+ linkState = {};
138
+ /** What the journey said must show before the next action: the previous action's result. */
139
+ pendingReady = null;
140
+ /** Time each readiness wait took, in ms. */
141
+ readyWaits = [];
142
+ actionGc;
143
+ endGc;
144
+ /** Unique for the whole session; the SDK keeps its answers by run token and n. */
145
+ gcN = 0;
146
+ /** Steps open right now: a step inside another step's action sends no GC, which would land inside the outer step. */
147
+ stepDepth = 0;
148
+ /** Elements looked up again after going stale, over the session (see `frameOf`). */
149
+ refinds = 0;
150
+ get staleRefinds() {
151
+ return this.refinds;
152
+ }
153
+ constructor(o) {
154
+ this.driver = o.driver;
155
+ this.scheme = o.scheme;
156
+ this.fetch = o.fetch ?? fetch;
157
+ this.api = o.api ?? '';
158
+ this.actionGc = o.actionGc ? 'step' : 'off';
159
+ this.endGc = o.endGc ?? END_GC_DEFAULT;
160
+ }
161
+ /**
162
+ * One GC command; returns its number, or null when none was sent or none ran. Any answer but `gc:<n> ok` (none, a native
163
+ * timeout, an error, `unavailable` from an app without a GC) turns the command off for the rest of the session: a measuring
164
+ * aid never fails the customer's test, and the steps then carry no number. `atEnd`: the run end's command, which `endGc` sends
165
+ * also while the per-step command is off.
166
+ */
167
+ async gc(atEnd = false) {
168
+ if (this.actionGc !== 'step' && !(atEnd && this.endGc && this.actionGc === 'off'))
169
+ return null;
170
+ // Safari opens links from the background, so a command there would be a lifecycle change, not a GC.
171
+ if (this.linkState.linkMode === 'safari') {
172
+ this.actionGc = 'safari';
173
+ return null;
174
+ }
175
+ const n = ++this.gcN;
176
+ const start = this.now();
177
+ const answer = await this.driver.platform.gcCommand(this.driver, n, this.scheme, this.linkState).catch(() => null);
178
+ this.driver.log.push({ ...this.driver.context, cmd: 'gc', t: this.now(), ms: this.now() - start, status: answer === `gc:${n} ok` ? 0 : 1, ...(answer !== null ? { answer } : {}) });
179
+ if (answer === `gc:${n} ok`)
180
+ return n;
181
+ this.actionGc = answer === `gc:${n} unavailable` ? 'unavailable' : 'unsupported';
182
+ return null;
183
+ }
184
+ now() {
185
+ return this.driver.now();
186
+ }
187
+ /** After the action just made: the next action waits until `sel` is visible (the screen or element the action leads to). */
188
+ expectNext(sel, timeoutMs = 10_000) {
189
+ this.pendingReady = { sel, timeoutMs };
190
+ }
191
+ /** Before the next action: waits for what `expectNext` named, if anything. Throws when it does not show in time. */
192
+ async ready() {
193
+ const p = this.pendingReady;
194
+ if (!p)
195
+ return 0;
196
+ this.pendingReady = null;
197
+ const start = this.now();
198
+ await this.waitVisible(p.sel, p.timeoutMs);
199
+ const took = this.now() - start;
200
+ this.readyWaits.push(took);
201
+ this.driver.log.push({ ...this.driver.context, cmd: 'ready', t: this.now(), ms: took, status: 0 });
202
+ return took;
203
+ }
204
+ /** A declared step marker, kept until the iteration ends. */
205
+ marker(step, phase, gcN = null) {
206
+ this.markers.push({ token: this.token, step, phase, t_host: this.now(), ...(gcN !== null ? { gc_n: gcN } : {}) });
207
+ }
208
+ /**
209
+ * One declared step: the readiness wait, `start`, the action, its checks and `once` (asserted before `end` only), `end`, then
210
+ * the checks again. `step(name, fn)` is the short form.
211
+ */
212
+ async step(name, action, checks = noop, once = noop) {
213
+ await this.ready();
214
+ this.driver.context = { ...this.driver.context, step: name };
215
+ this.stepDepth++;
216
+ try {
217
+ const gcN = this.stepDepth === 1 ? await this.gc() : null;
218
+ this.marker(name, 'start', gcN);
219
+ await action();
220
+ await checks();
221
+ await once();
222
+ this.marker(name, 'end');
223
+ await checks();
224
+ }
225
+ finally {
226
+ this.stepDepth--;
227
+ const { step: _done, ...rest } = this.driver.context;
228
+ this.driver.context = rest;
229
+ }
230
+ }
231
+ isVisible(sel) {
232
+ return this.driver.findShown(toSelector(sel)).then(Boolean);
233
+ }
234
+ async waitVisible(sel, timeoutMs = 10_000) {
235
+ const s = toSelector(sel);
236
+ const deadline = this.now() + timeoutMs;
237
+ for (;;) {
238
+ const el = await this.driver.findShown(s);
239
+ if (el)
240
+ return el;
241
+ if (this.now() > deadline)
242
+ throw new Error(`${describeSelector(s)} not visible within ${timeoutMs} ms`);
243
+ await this.driver.sleep(200);
244
+ }
245
+ }
246
+ async waitGone(sel, timeoutMs = 10_000) {
247
+ const s = toSelector(sel);
248
+ const deadline = this.now() + timeoutMs;
249
+ for (;;) {
250
+ if (!(await this.driver.findShown(s)))
251
+ return;
252
+ if (this.now() > deadline)
253
+ throw new Error(`${describeSelector(s)} still visible after ${timeoutMs} ms`);
254
+ await this.driver.sleep(200);
255
+ }
256
+ }
257
+ /** Waits until the keyboard is up (or down). */
258
+ async waitKeyboard(want, timeoutMs = 10_000) {
259
+ const deadline = this.now() + timeoutMs;
260
+ while ((await this.driver.platform.keyboardShown(this.driver)) !== (want === 'up')) {
261
+ if (this.now() > deadline)
262
+ throw new Error(`keyboard not ${want} within ${timeoutMs} ms`);
263
+ await this.driver.sleep(200);
264
+ }
265
+ }
266
+ /**
267
+ * Waits until all the conditions hold in one poll. A poll asks them one lookup after another, so "the same poll" means the
268
+ * answers are a few hundred ms apart, not one instant. Where the platform can look for several ids in one request (Android)
269
+ * the ids are asked together; elsewhere each condition is waited for in turn, with its own timeout, as `waitVisible`,
270
+ * `waitGone` and `waitKeyboard` do.
271
+ */
272
+ async waitAll(conditions, timeoutMs = 10_000) {
273
+ const platform = this.driver.platform;
274
+ if (!platform.anyOfIds) {
275
+ for (const c of conditions) {
276
+ if ('shown' in c)
277
+ await this.waitVisible(c.shown, timeoutMs);
278
+ else if ('gone' in c)
279
+ await this.waitGone(c.gone, timeoutMs);
280
+ else
281
+ await this.waitKeyboard(c.keyboard, timeoutMs);
282
+ }
283
+ return;
284
+ }
285
+ const elements = conditions.flatMap((c, at) => ('keyboard' in c ? [] : [{ at, want: 'shown' in c, sel: toSelector('shown' in c ? c.shown : c.gone) }]));
286
+ const deadline = this.now() + timeoutMs;
287
+ let lastRescue = -Infinity;
288
+ // Asking the ids together pays off only when something is expected to be missing: a walk of the whole tree is the dear lookup.
289
+ const group = conditions.some((c) => 'gone' in c);
290
+ for (;;) {
291
+ const found = await this.driver.shownMany(elements.map((e) => e.sel), group);
292
+ const met = (e, i) => found[i] === e.want;
293
+ let unmet = elements.flatMap((e, i) => (met(e, i) ? [] : [conditions[e.at]]));
294
+ const missing = elements.flatMap((e, i) => (e.want && !found[i] ? [i] : []));
295
+ if (missing.length > 0 && platform.readScreen && this.now() - lastRescue >= RESCUE_EVERY_MS && (await platform.keyboardShown(this.driver))) {
296
+ // The keyboard is up: its translated chat is cut to inverted bounds the lookups leave out, so ask the page source once.
297
+ try {
298
+ const screen = await platform.readScreen(this.driver);
299
+ for (const i of missing)
300
+ if (screen.shown(elements[i].sel)?.length)
301
+ found[i] = true;
302
+ }
303
+ catch {
304
+ // A failed read is no rescue this poll; the lookups decide, and a dead session fails on the next command.
305
+ }
306
+ finally {
307
+ // Counted from the end of the read: a read takes 1 to 3.5 s on the S23, so counting from its start let reads run back to back.
308
+ lastRescue = this.now();
309
+ }
310
+ unmet = elements.flatMap((e, i) => (met(e, i) ? [] : [conditions[e.at]]));
311
+ }
312
+ for (const c of conditions)
313
+ if ('keyboard' in c && (await platform.keyboardShown(this.driver)) !== (c.keyboard === 'up'))
314
+ unmet.push(c);
315
+ if (unmet.length === 0)
316
+ return;
317
+ if (this.now() > deadline) {
318
+ throw new Error(`${unmet.map((c) => ('shown' in c ? `not visible: ${describeSelector(toSelector(c.shown))}` : 'gone' in c ? `still visible: ${describeSelector(toSelector(c.gone))}` : `keyboard not ${c.keyboard}`)).join('; ')} within ${timeoutMs} ms`);
319
+ }
320
+ await this.driver.sleep(200);
321
+ }
322
+ }
323
+ async tap(sel, timeoutMs = 10_000) {
324
+ await this.ready();
325
+ const el = await this.waitVisible(sel, timeoutMs);
326
+ await this.driver.tapElement(el);
327
+ }
328
+ /** Taps again while `target` has not shown and `sel` is still there (a tap right after a launch can land before the app takes touches). Returns how many extra taps it took. */
329
+ async tapUntil(sel, target, timeoutMs = 15_000, retapAfterMs = 2000) {
330
+ const s = toSelector(sel);
331
+ const deadline = this.now() + timeoutMs;
332
+ let retaps = 0;
333
+ await this.tap(s, timeoutMs);
334
+ let retapAt = this.now() + retapAfterMs;
335
+ for (;;) {
336
+ if (await this.isVisible(target))
337
+ return retaps;
338
+ if (this.now() > deadline) {
339
+ throw new Error(`${describeSelector(toSelector(target))} not visible within ${timeoutMs} ms of tapping ${describeSelector(s)} (${retaps + 1} taps)`);
340
+ }
341
+ if (this.now() > retapAt) {
342
+ const el = await this.driver.findShown(s);
343
+ if (el) {
344
+ await this.ready();
345
+ await this.driver.tapElement(el);
346
+ retaps++;
347
+ }
348
+ retapAt = this.now() + retapAfterMs;
349
+ }
350
+ await this.driver.sleep(100);
351
+ }
352
+ }
353
+ /**
354
+ * Swipe start/end in percent of the window. `target` is what the swipe acts on (the list or screen it starts in): the swipe
355
+ * waits for it to be visible, so it does not fire during the transition of the action before it. It does not wait for a fling to stop: the next tap after a swipe still needs `expectNext` on an element that is stable only once the scroll ended.
356
+ */
357
+ async swipe(from, to, durationMs = 400, target) {
358
+ await this.ready();
359
+ if (target !== undefined)
360
+ await this.waitVisible(target);
361
+ const w = await this.driver.screen();
362
+ const pt = ([x, y]) => ({ x: Math.round((w.width * x) / 100), y: Math.round((w.height * y) / 100) });
363
+ await this.driver.drag(pt(from), pt(to), durationMs);
364
+ }
365
+ /** Swipe from an element's centre to 90 % of the window height (down) or 10 % (up). */
366
+ async swipeFrom(sel, direction, durationMs = 400) {
367
+ await this.ready();
368
+ const el = await this.waitVisible(sel);
369
+ const r = await this.driver.cmd('GET', `/element/${el}/rect`);
370
+ const w = await this.driver.screen();
371
+ const from = { x: Math.round(r.x + r.width / 2), y: Math.round(r.y + r.height / 2) };
372
+ const to = { x: from.x, y: Math.round(w.height * (direction === 'down' ? 0.9 : 0.1)) };
373
+ await this.driver.drag(from, to, durationMs);
374
+ }
375
+ /** Swipes until `sel` shows or `times` runs out. */
376
+ async swipeUntilVisible(sel, from, to, durationMs, times) {
377
+ for (let i = 0; i < times && !(await this.isVisible(sel)); i++)
378
+ await this.swipe(from, to, durationMs);
379
+ }
380
+ /** Swipes from `from` (an element, as `swipeFrom`) until `target` shows or `times` swipes are used; throws when it never shows. */
381
+ async swipeFromUntilVisible(from, direction, target, times, durationMs = 400) {
382
+ for (let i = 0; i < times; i++) {
383
+ if (await this.isVisible(target))
384
+ return;
385
+ await this.swipeFrom(from, direction, durationMs);
386
+ }
387
+ if (!(await this.isVisible(target)))
388
+ throw new Error(`${describeSelector(toSelector(target))} not visible after ${times} swipes from ${describeSelector(toSelector(from))}`);
389
+ }
390
+ /** Checks for the element fully on screen, then swipes from the centre, for as long as the timeout. speed 40 is a 601 ms swipe. */
391
+ async scrollUntil(sel, { direction = 'down', timeoutMs = 15_000, speed = 40 } = {}) {
392
+ const s = toSelector(sel);
393
+ const deadline = this.now() + timeoutMs;
394
+ const durationMs = Math.round((1000 * (100 - speed)) / 100) + 1;
395
+ for (;;) {
396
+ if (await this.driver.findShown(s, true))
397
+ return;
398
+ if (this.now() > deadline)
399
+ throw new Error(`${describeSelector(s)} not scrolled into view within ${timeoutMs} ms`);
400
+ await this.swipe([50, 50], direction === 'down' ? [50, 10] : [50, 90], durationMs);
401
+ }
402
+ }
403
+ /**
404
+ * The frame of `sel`'s element. When the element went stale (the app re-mounted it between the lookup and the read), it is
405
+ * looked up again by the same selector, at most STALE_REFINDS times for this read; any other error passes straight through.
406
+ * A re-find is a lookup, not a touch: it adds no gesture, but it adds its lookup time to the window of the touch before it.
407
+ */
408
+ async frameOf(sel, el) {
409
+ for (let refinds = 0;; refinds++) {
410
+ try {
411
+ return { el, rect: await this.driver.cmd('GET', `/element/${el}/rect`) };
412
+ }
413
+ catch (e) {
414
+ if (!(e instanceof WdError && e.wdError === 'stale element reference'))
415
+ throw e;
416
+ const what = describeSelector(toSelector(sel));
417
+ if (refinds >= STALE_REFINDS)
418
+ throw new Error(`${what} went stale ${refinds + 1} times in a row (${refinds} re-finds): ${e.message}`);
419
+ this.refinds++;
420
+ try {
421
+ el = await this.waitVisible(sel);
422
+ }
423
+ catch (lost) {
424
+ throw new Error(`${what} went stale and was not found again: ${lost instanceof Error ? lost.message : String(lost)}`);
425
+ }
426
+ }
427
+ }
428
+ }
429
+ /** `sel`'s frame once it reads the same twice in a row (a sheet still sliding in moves it). */
430
+ async settledFrame(sel, timeoutMs) {
431
+ const start = this.now();
432
+ let at = await this.frameOf(sel, await this.waitVisible(sel));
433
+ for (;;) {
434
+ await this.driver.sleep(FRAME_POLL_MS);
435
+ const now = await this.frameOf(sel, at.el);
436
+ if (sameRect(at.rect, now.rect))
437
+ return now;
438
+ if (this.now() - start > timeoutMs)
439
+ throw new Error(`${describeSelector(toSelector(sel))} did not stop moving within ${timeoutMs} ms`);
440
+ at = now;
441
+ }
442
+ }
443
+ /** One fling inside `r`: 80 % to 30 % of its height towards the end, 30 % to 80 % back to the top, on its centre line. */
444
+ async flingIn(r, toward, durationMs) {
445
+ const [from, to] = toward === 'end' ? [FLING_FROM, FLING_TO] : [FLING_TO, FLING_FROM];
446
+ const x = Math.round(r.x + r.width / 2);
447
+ await this.driver.drag({ x, y: Math.round(r.y + r.height * from) }, { x, y: Math.round(r.y + r.height * to) }, durationMs);
448
+ }
449
+ /**
450
+ * Exactly `times` flings of `list` towards its end or back to its top, whatever the list holds: the same touches, so the
451
+ * same windows, in every run (REQ-FARM-33). The list's frame is read (settled) once, before the first fling, and every
452
+ * fling uses it: nothing is looked up or read between flings, so no lookup or re-find lands inside their windows. The
453
+ * caller then checks a condition the flings always reach.
454
+ */
455
+ async flingTimes(list, times, toward, { durationMs = FLING_MS, timeoutMs = FLING_TIMEOUT_MS } = {}) {
456
+ if (!Number.isInteger(times) || times < 1)
457
+ throw new Error(`flingTimes needs a whole number of flings >= 1, got ${times}`);
458
+ await this.ready();
459
+ const start = this.now();
460
+ const refindsBefore = this.refinds;
461
+ let flings = 0;
462
+ let status = 1;
463
+ try {
464
+ const { rect } = await this.settledFrame(list, timeoutMs);
465
+ for (; flings < times; flings++)
466
+ await this.flingIn(rect, toward, durationMs);
467
+ status = 0;
468
+ }
469
+ finally {
470
+ this.driver.log.push({ ...this.driver.context, cmd: `fling-${toward}-times`, t: this.now(), ms: this.now() - start, status, flings, refinds: this.refinds - refindsBefore });
471
+ }
472
+ }
473
+ /**
474
+ * Flings `list` until `target` is fully on screen. The number of flings depends on the data, so the step's windows can
475
+ * differ between runs: NOT for a judged step (REQ-FARM-33; use `flingTimes`). `blind` flings go first with no lookup.
476
+ * Returns the flings; logs flings, checks, blind and re-finds, also when it fails.
477
+ */
478
+ async flingUntil(list, target, toward, { blind = 0, durationMs = FLING_MS, timeoutMs = FLING_TIMEOUT_MS } = {}) {
479
+ await this.ready();
480
+ const start = this.now();
481
+ const refindsBefore = this.refinds;
482
+ let flings = 0;
483
+ let checks = 0;
484
+ let status = 1;
485
+ try {
486
+ let at = await this.settledFrame(list, timeoutMs);
487
+ const fling = async () => {
488
+ if (flings > 0)
489
+ at = await this.frameOf(list, at.el);
490
+ await this.flingIn(at.rect, toward, durationMs);
491
+ flings++;
492
+ };
493
+ while (flings < blind)
494
+ await fling();
495
+ const sel = toSelector(target);
496
+ while ((checks++, !(await this.driver.findShown(sel, true)))) {
497
+ if (this.now() - start > timeoutMs)
498
+ throw new Error(`the ${toward} of the list did not show within ${timeoutMs} ms (${flings} flings)`);
499
+ await fling();
500
+ }
501
+ status = 0;
502
+ return flings;
503
+ }
504
+ finally {
505
+ this.driver.log.push({ ...this.driver.context, cmd: `fling-to-${toward}`, t: this.now(), ms: this.now() - start, status, flings, checks, blind, refinds: this.refinds - refindsBefore });
506
+ }
507
+ }
508
+ /** The centres of `sels`' frames, once every frame reads the same twice in a row; a stale element is looked up again. For `tapAt`. */
509
+ async stableCentres(sels, timeoutMs = FLING_TIMEOUT_MS) {
510
+ await this.ready();
511
+ const start = this.now();
512
+ const els = [];
513
+ for (const sel of sels)
514
+ els.push(await this.waitVisible(sel));
515
+ const frames = async () => {
516
+ const out = [];
517
+ for (let i = 0; i < sels.length; i++) {
518
+ const f = await this.frameOf(sels[i], els[i]);
519
+ els[i] = f.el;
520
+ out.push(f.rect);
521
+ }
522
+ return out;
523
+ };
524
+ for (let before = await frames();;) {
525
+ await this.driver.sleep(FRAME_POLL_MS);
526
+ const now = await frames();
527
+ if (now.every((r, i) => sameRect(r, before[i])))
528
+ return now.map((r) => ({ x: Math.round(r.x + r.width / 2), y: Math.round(r.y + r.height / 2) }));
529
+ if (this.now() - start > timeoutMs)
530
+ throw new Error(`the elements did not stop moving within ${timeoutMs} ms`);
531
+ before = now;
532
+ }
533
+ }
534
+ /** A touch at a window point with no lookup (e.g. from `stableCentres`): the same touch as `tap`, after the same `ready()`. */
535
+ async tapAt(point) {
536
+ await this.ready();
537
+ await this.driver.tapPoint(point);
538
+ }
539
+ async type(sel, value) {
540
+ await this.ready();
541
+ const el = await this.waitVisible(sel);
542
+ await this.driver.cmd('POST', `/element/${el}/value`, { text: value });
543
+ }
544
+ /** Taps the button of a system alert if one shows within `waitMs`; returns the label tapped, or null. */
545
+ acceptAlert(labels, waitMs) {
546
+ return this.driver.platform.acceptAlert(this.driver, labels, waitMs);
547
+ }
548
+ openLink(url) {
549
+ return this.driver.platform.openLink(this.driver, url, this.linkState);
550
+ }
551
+ /** A relaunch ends the screen a pending `expectNext` was waiting for; the wait must not leak into what comes after. */
552
+ relaunch() {
553
+ this.pendingReady = null;
554
+ return this.driver.relaunch();
555
+ }
556
+ activate() {
557
+ return this.driver.activate();
558
+ }
559
+ /** Launch, wait for `home`, then the activation link with this iteration's token; `args` (`k=v&...`) override the run defaults. */
560
+ async beginRun({ token, args = '', home }) {
561
+ this.token = token;
562
+ this.pendingReady = null;
563
+ await this.relaunch();
564
+ await this.waitVisible(home, 30_000);
565
+ return this.openLink(activationLink(this.scheme, token, args));
566
+ }
567
+ /** Markers, then the flush link, then the SDK's own `perflab.flushed` (ok | error | off). */
568
+ async endRun() {
569
+ // No readiness wait here: the runner served the journey's last one, and a failed iteration's pending wait must not stop the flush.
570
+ // The last command gives the last step its reading after the action and the run its end reading after a GC. The session's
571
+ // final flush, after every run sent its markers, has no step to read and sends none: its GC would land in no run, or in the
572
+ // last one as a stray.
573
+ if (this.markers.some((m) => m.phase === 'start'))
574
+ await this.gc(true);
575
+ await sendMarkers(this.fetch, this.api, this.markers, { sleep: (ms) => this.driver.sleep(ms), now: () => this.now() });
576
+ await this.openLink(flushLink(this.scheme));
577
+ const flush = this.driver.platform.flush;
578
+ const deadline = this.now() + FLUSH_WAIT_MS;
579
+ for (let poll = 1; this.now() < deadline; poll++) {
580
+ let el = await this.driver.find(flush.lookup.using, flush.lookup.value);
581
+ if (!el && flush.fallback && poll % FLUSH_FALLBACK_EVERY === 0)
582
+ el = await this.findFallback(flush.fallback);
583
+ if (el) {
584
+ const label = await this.driver.cmd('GET', `/element/${el}/attribute/${flush.statusAttribute}`).catch(() => null);
585
+ return label ?? 'shown';
586
+ }
587
+ await this.driver.sleep(FLUSH_POLL_MS);
588
+ }
589
+ return null;
590
+ }
591
+ /** The heavy lookup, with its setting on only while it runs. */
592
+ async findFallback(f) {
593
+ await this.driver.cmd('POST', '/appium/settings', { settings: { [f.setting]: true } });
594
+ try {
595
+ return await this.driver.find(f.lookup.using, f.lookup.value);
596
+ }
597
+ finally {
598
+ await this.driver.cmd('POST', '/appium/settings', { settings: { [f.setting]: false } }).catch(() => null);
599
+ }
600
+ }
601
+ }
602
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}