@astur-mobile/core 0.1.0-beta.0

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.
@@ -0,0 +1,411 @@
1
+ import { AsturError } from './errors.js';
2
+ import { preparePointerTargetForKeyboard } from './keyboard.js';
3
+ import { delay, waitFor } from './wait.js';
4
+ export const by = {
5
+ label(value, options) {
6
+ return { strategy: 'accessibility', value, exact: options?.exact ?? true };
7
+ },
8
+ a11y(value, options) {
9
+ return { strategy: 'accessibility', value, exact: options?.exact ?? true };
10
+ },
11
+ id(value, options) {
12
+ return { strategy: 'id', value, exact: options?.exact ?? true };
13
+ },
14
+ testId(value, options) {
15
+ return { strategy: 'id', value, exact: options?.exact ?? true };
16
+ },
17
+ role(value, options = {}) {
18
+ return { strategy: 'role', value, exact: options.exact ?? true, name: options.name };
19
+ },
20
+ text(value, options) {
21
+ return { strategy: 'text', value, exact: options?.exact ?? true };
22
+ },
23
+ type(value, options) {
24
+ return { strategy: 'type', value, exact: options?.exact ?? true };
25
+ },
26
+ xpath(value) {
27
+ return { strategy: 'xpath', value, exact: true };
28
+ },
29
+ coordinates(x, y) {
30
+ return { x, y };
31
+ }
32
+ };
33
+ export class MobileLocator {
34
+ selector;
35
+ session;
36
+ constructor(session, selector) {
37
+ this.session = session;
38
+ this.selector = selector;
39
+ }
40
+ async tap(options = {}) {
41
+ if (this.session.tapElement) {
42
+ await this.session.tapElement(this.selector, withKeyboardDefault(this.session, options));
43
+ return;
44
+ }
45
+ let element = await this.waitForVisible(options);
46
+ const dismissed = await preparePointerTargetForKeyboard(this.session, centerOf(element.bounds), options.keyboard);
47
+ if (dismissed) {
48
+ element = await this.waitForVisible(options);
49
+ }
50
+ await this.session.tap(centerOf(element.bounds));
51
+ }
52
+ async doubleTap(options = {}) {
53
+ if (this.session.doubleTapElement) {
54
+ await this.session.doubleTapElement(this.selector, withKeyboardDefault(this.session, options));
55
+ return;
56
+ }
57
+ let element = await this.waitForVisible(options);
58
+ const dismissed = await preparePointerTargetForKeyboard(this.session, centerOf(element.bounds), options.keyboard);
59
+ if (dismissed) {
60
+ element = await this.waitForVisible(options);
61
+ }
62
+ const point = centerOf(element.bounds);
63
+ if (this.session.doubleTap) {
64
+ await this.session.doubleTap(point, { keyboard: options.keyboard, intervalMs: options.intervalMs });
65
+ return;
66
+ }
67
+ await this.session.tap(point);
68
+ await delay(options.intervalMs ?? 80);
69
+ await this.session.tap(point);
70
+ }
71
+ async longPress(options = {}) {
72
+ if (this.session.longPressElement) {
73
+ await this.session.longPressElement(this.selector, withKeyboardDefault(this.session, options));
74
+ return;
75
+ }
76
+ let element = await this.waitForVisible(options);
77
+ const dismissed = await preparePointerTargetForKeyboard(this.session, centerOf(element.bounds), options.keyboard);
78
+ if (dismissed) {
79
+ element = await this.waitForVisible(options);
80
+ }
81
+ await this.session.longPress(centerOf(element.bounds), { durationMs: options.durationMs });
82
+ }
83
+ async pressAndHold(options = {}) {
84
+ await this.longPress(options);
85
+ }
86
+ async dragTo(target, options = {}) {
87
+ if (this.session.dragElement) {
88
+ if (target instanceof MobileLocator && target.session !== this.session) {
89
+ throw new AsturError('CROSS_SESSION_LOCATOR', 'Cannot drag between locators from different Astur device sessions.');
90
+ }
91
+ await this.session.dragElement(this.selector, target instanceof MobileLocator ? { selector: target.selector } : target, withKeyboardDefault(this.session, options));
92
+ return;
93
+ }
94
+ let source = await this.waitForVisible(options);
95
+ const dismissed = await preparePointerTargetForKeyboard(this.session, centerOf(source.bounds));
96
+ if (dismissed) {
97
+ source = await this.waitForVisible(options);
98
+ }
99
+ const end = isCoordinates(target)
100
+ ? target
101
+ : centerOf((await target.waitForVisible({
102
+ timeout: options.timeout,
103
+ interval: options.interval
104
+ })).bounds);
105
+ await this.session.drag({
106
+ start: centerOf(source.bounds),
107
+ end,
108
+ durationMs: options.durationMs
109
+ });
110
+ }
111
+ /**
112
+ * Scrolls the surrounding scroll view until this element is visible, then
113
+ * resolves with its snapshot. Replaces the hand-written "swipe in a loop
114
+ * until visible" helpers that page objects otherwise have to craft, and
115
+ * hides the iOS-viewport / Android-tree platform difference for the scroll
116
+ * region. If the element is already visible no gesture is performed.
117
+ */
118
+ async scrollIntoView(options = {}) {
119
+ const direction = options.direction ?? 'down';
120
+ const maxScrolls = Math.max(0, options.maxScrolls ?? 10);
121
+ const durationMs = options.durationMs ?? 400;
122
+ const current = await this.currentMatch();
123
+ if (current?.visible) {
124
+ return current;
125
+ }
126
+ for (let attempt = 0; attempt < maxScrolls; attempt += 1) {
127
+ const region = options.container
128
+ ? (await options.container.waitForVisible({
129
+ timeout: options.timeout,
130
+ interval: options.interval
131
+ })).bounds
132
+ : await this.scrollRegion();
133
+ await this.session.swipe(scrollGesture(region, direction, durationMs));
134
+ const match = await this.currentMatch();
135
+ if (match?.visible) {
136
+ return match;
137
+ }
138
+ }
139
+ return this.waitForVisible({
140
+ ...options,
141
+ message: options.message
142
+ ?? `Timed out scrolling ${direction} to reveal ${formatSelector(this.selector)} after ${maxScrolls} scroll attempts`
143
+ });
144
+ }
145
+ async currentMatch() {
146
+ return this.session.findElement
147
+ ? this.session.findElement(this.selector)
148
+ : findElement(await this.session.getTree(), this.selector);
149
+ }
150
+ async scrollRegion() {
151
+ if (this.session.getViewport) {
152
+ return this.session.getViewport();
153
+ }
154
+ return (await this.session.getTree()).bounds;
155
+ }
156
+ async fill(value, options = {}) {
157
+ if (this.session.fillElement) {
158
+ await this.session.fillElement(this.selector, value, withKeyboardDefault(this.session, options));
159
+ return;
160
+ }
161
+ const element = await this.waitForVisible(options);
162
+ await preparePointerTargetForKeyboard(this.session, centerOf(element.bounds));
163
+ await this.session.fill(this.selector, value);
164
+ }
165
+ async isVisible(options = {}) {
166
+ try {
167
+ await this.waitForVisible(options);
168
+ return true;
169
+ }
170
+ catch {
171
+ return false;
172
+ }
173
+ }
174
+ async isHidden(options = {}) {
175
+ try {
176
+ await this.waitForHidden(options);
177
+ return true;
178
+ }
179
+ catch {
180
+ return false;
181
+ }
182
+ }
183
+ async waitForVisible(options = {}) {
184
+ if (this.session.waitForElement) {
185
+ return this.session.waitForElement(this.selector, {
186
+ ...options,
187
+ state: 'visible'
188
+ });
189
+ }
190
+ return this.waitForSnapshot((snapshot) => snapshot.visible, {
191
+ ...options,
192
+ message: options.message ?? `Timed out waiting for ${formatSelector(this.selector)} to be visible`
193
+ });
194
+ }
195
+ async waitForHidden(options = {}) {
196
+ if (this.session.waitForElementHidden) {
197
+ await this.session.waitForElementHidden(this.selector, options);
198
+ return;
199
+ }
200
+ await waitFor(async () => {
201
+ const root = await this.session.getTree();
202
+ const match = findElement(root, this.selector);
203
+ return !match || !match.visible;
204
+ }, {
205
+ ...options,
206
+ timeout: options.timeout ?? this.session.capabilities.timeout,
207
+ message: options.message ?? `Timed out waiting for ${formatSelector(this.selector)} to be hidden`
208
+ });
209
+ }
210
+ async waitForSnapshot(predicate = () => true, options = {}) {
211
+ return waitFor(async () => {
212
+ const match = this.session.findElement
213
+ ? await this.session.findElement(this.selector)
214
+ : findElement(await this.session.getTree(), this.selector);
215
+ return match && predicate(match) ? match : undefined;
216
+ }, {
217
+ ...options,
218
+ timeout: options.timeout ?? this.session.capabilities.timeout,
219
+ message: options.message ?? `Timed out waiting for ${formatSelector(this.selector)}`
220
+ });
221
+ }
222
+ async snapshot(options = {}) {
223
+ return this.waitForSnapshot(() => true, {
224
+ ...options,
225
+ message: options.message ?? `Timed out waiting for ${formatSelector(this.selector)}`
226
+ });
227
+ }
228
+ async all(options = {}) {
229
+ return waitFor(async () => {
230
+ const matches = await this.queryAll();
231
+ return matches.length > 0 ? matches : undefined;
232
+ }, {
233
+ ...options,
234
+ timeout: options.timeout ?? this.session.capabilities.timeout,
235
+ message: options.message ?? `Timed out waiting for ${formatSelector(this.selector)} to match at least one element`
236
+ });
237
+ }
238
+ async queryAll() {
239
+ return this.session.findElements
240
+ ? this.session.findElements(this.selector)
241
+ : findElements(await this.session.getTree(), this.selector);
242
+ }
243
+ toString() {
244
+ return formatSelector(this.selector);
245
+ }
246
+ }
247
+ export function findElement(root, selector) {
248
+ if (matches(root, selector)) {
249
+ return root;
250
+ }
251
+ for (const child of root.children) {
252
+ const match = findElement(child, selector);
253
+ if (match) {
254
+ return match;
255
+ }
256
+ }
257
+ return undefined;
258
+ }
259
+ export function findElements(root, selector) {
260
+ const descendants = root.children.flatMap((child) => findElements(child, selector));
261
+ return matches(root, selector) ? [root, ...descendants] : descendants;
262
+ }
263
+ export function matches(element, selector) {
264
+ switch (selector.strategy) {
265
+ case 'accessibility':
266
+ return matchValue(element.label, selector) || matchValue(element.id, selector);
267
+ case 'id':
268
+ return matchValue(element.id, selector);
269
+ case 'role':
270
+ return hasRole(element, selector.value) && matchAccessibleName(element, selector);
271
+ case 'text':
272
+ return matchValue(element.text, selector) || matchValue(element.label, selector);
273
+ case 'type':
274
+ if (selector.value.trim().toLowerCase() === 'any') {
275
+ return true;
276
+ }
277
+ return matchValue(element.type, selector);
278
+ case 'coordinates':
279
+ return false;
280
+ case 'xpath':
281
+ throw new AsturError('UNSUPPORTED_LOCATOR', 'XPath is reserved for a future compatibility layer. Prefer by.label, by.id, by.text, or by.type.');
282
+ }
283
+ }
284
+ export function flattenTree(root) {
285
+ return [root, ...root.children.flatMap((child) => flattenTree(child))];
286
+ }
287
+ export function centerOf(bounds) {
288
+ return {
289
+ x: Math.round(bounds.x + bounds.width / 2),
290
+ y: Math.round(bounds.y + bounds.height / 2)
291
+ };
292
+ }
293
+ export function pointInBounds(bounds, xRatio, yRatio) {
294
+ return {
295
+ x: Math.round(bounds.x + bounds.width * xRatio),
296
+ y: Math.round(bounds.y + bounds.height * yRatio)
297
+ };
298
+ }
299
+ function scrollGesture(region, direction, durationMs) {
300
+ const near = 0.78;
301
+ const far = 0.25;
302
+ switch (direction) {
303
+ case 'up':
304
+ return { start: pointInBounds(region, 0.5, far), end: pointInBounds(region, 0.5, near), durationMs };
305
+ case 'left':
306
+ return { start: pointInBounds(region, far, 0.5), end: pointInBounds(region, near, 0.5), durationMs };
307
+ case 'right':
308
+ return { start: pointInBounds(region, near, 0.5), end: pointInBounds(region, far, 0.5), durationMs };
309
+ case 'down':
310
+ default:
311
+ return { start: pointInBounds(region, 0.5, near), end: pointInBounds(region, 0.5, far), durationMs };
312
+ }
313
+ }
314
+ function withKeyboardDefault(session, options) {
315
+ if ('keyboard' in options && options.keyboard !== undefined) {
316
+ return options;
317
+ }
318
+ return {
319
+ ...options,
320
+ keyboard: session.capabilities.keyboard.dismiss
321
+ };
322
+ }
323
+ export function formatSelector(selector) {
324
+ const base = `${selector.strategy}=${JSON.stringify(selector.value)}`;
325
+ return selector.name === undefined ? base : `${base}[name=${formatExpected(selector.name)}]`;
326
+ }
327
+ function matchValue(actual, selector) {
328
+ return matchExpected(actual, selector.value, selector.exact);
329
+ }
330
+ function matchAccessibleName(element, selector) {
331
+ if (selector.name === undefined) {
332
+ return true;
333
+ }
334
+ const name = selector.name;
335
+ return [
336
+ element.label,
337
+ element.text,
338
+ element.value,
339
+ element.id
340
+ ].some((candidate) => matchExpected(candidate, name, selector.exact));
341
+ }
342
+ function matchExpected(actual, expected, exact = true) {
343
+ if (!actual) {
344
+ return false;
345
+ }
346
+ if (expected instanceof RegExp) {
347
+ expected.lastIndex = 0;
348
+ const pass = expected.test(actual);
349
+ expected.lastIndex = 0;
350
+ return pass;
351
+ }
352
+ return exact === false ? actual.includes(expected) : actual === expected;
353
+ }
354
+ function hasRole(element, role) {
355
+ return rolesForElement(element).includes(normalizeRole(role));
356
+ }
357
+ function rolesForElement(element) {
358
+ const type = element.type.toLowerCase();
359
+ const roles = new Set();
360
+ if (type.includes('button')) {
361
+ roles.add('button');
362
+ }
363
+ if (type.includes('checkbox')) {
364
+ roles.add('checkbox');
365
+ }
366
+ if (type.includes('image')) {
367
+ roles.add('image');
368
+ roles.add('img');
369
+ }
370
+ if (type.includes('link')) {
371
+ roles.add('link');
372
+ }
373
+ if (type.includes('menuitem')) {
374
+ roles.add('menuitem');
375
+ }
376
+ if (type.includes('radiobutton') || type.endsWith('.radio') || type.includes('radio')) {
377
+ roles.add('radio');
378
+ }
379
+ if (type.includes('seekbar') || type.includes('slider')) {
380
+ roles.add('slider');
381
+ }
382
+ if (type.includes('switch')) {
383
+ roles.add('switch');
384
+ }
385
+ if (type.includes('tab')) {
386
+ roles.add('tab');
387
+ }
388
+ if (type.includes('edittext')
389
+ || type.includes('textfield')
390
+ || type.includes('securetextfield')
391
+ || type.includes('searchfield')
392
+ || type.includes('textinput')) {
393
+ roles.add('textbox');
394
+ }
395
+ if (type.includes('textview')
396
+ || type.includes('statictext')
397
+ || type.includes('label')) {
398
+ roles.add('text');
399
+ }
400
+ return [...roles];
401
+ }
402
+ function normalizeRole(role) {
403
+ return role === 'img' ? 'img' : role.trim().toLowerCase();
404
+ }
405
+ function formatExpected(expected) {
406
+ return expected instanceof RegExp ? expected.toString() : JSON.stringify(expected);
407
+ }
408
+ function isCoordinates(target) {
409
+ return typeof target.x === 'number' && typeof target.y === 'number';
410
+ }
411
+ //# sourceMappingURL=locator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locator.js","sourceRoot":"","sources":["../src/locator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import type { Coordinates, DeviceFileEntry, DeviceInfo, DeviceOrientation, DoctorCheck, DragGesture, DoubleTapOptions, ElementDragOptions, ElementDragTarget, ElementDoubleTapOptions, ElementFillOptions, ElementLongPressOptions, ElementSelector, ElementTapOptions, ElementWaitOptions, LaunchOptions, LongPressOptions, KeyboardState, MobileContextInfo, MobileElementSnapshot, MobileRole, NormalizedCapabilities, PlatformName, InspectorSession, LocatorSuggestion, RecordingStopOptions, RoleSelectorOptions, ScreenshotOptions, SwipeGesture, TapOptions, UiTreeSubscribeOptions, UiTreeUpdate, AsturConfig, AppResetOptions, AppUnderTest, Bounds, WebViewEndpoint, WebViewSelector } from '@astur-mobile/protocol';
2
+ import { type RuntimeInspectorSessionOptions } from './inspector.js';
3
+ import { MobileLocator } from './locator.js';
4
+ export interface PlatformDriver {
5
+ readonly platform: PlatformName;
6
+ doctor(): Promise<DoctorCheck[]>;
7
+ listDevices(): Promise<DeviceInfo[]>;
8
+ createSession(capabilities: NormalizedCapabilities): Promise<PlatformSession>;
9
+ }
10
+ export interface PlatformSession {
11
+ readonly capabilities: NormalizedCapabilities;
12
+ readonly deviceInfo: DeviceInfo;
13
+ close(): Promise<void>;
14
+ isAppInstalled?(identifier: string): Promise<boolean>;
15
+ installApp(path: string): Promise<void>;
16
+ uninstallApp(identifier: string): Promise<void>;
17
+ launchApp(options?: LaunchOptions): Promise<void>;
18
+ terminateApp(): Promise<void>;
19
+ clearAppData(identifier: string): Promise<void>;
20
+ clearAppCache(identifier: string): Promise<void>;
21
+ grantPermission?(identifier: string, permission: string): Promise<void>;
22
+ revokePermission?(identifier: string, permission: string): Promise<void>;
23
+ resetApp(options?: AppResetOptions): Promise<void>;
24
+ setOrientation?(orientation: DeviceOrientation): Promise<void>;
25
+ lockDevice(): Promise<void>;
26
+ unlockDevice(): Promise<void>;
27
+ isDeviceLocked(): Promise<boolean>;
28
+ getTree(): Promise<MobileElementSnapshot>;
29
+ getViewport?(): Promise<Bounds>;
30
+ subscribeTree?(options?: UiTreeSubscribeOptions): AsyncIterable<UiTreeUpdate>;
31
+ hitTest?(point: Coordinates): Promise<MobileElementSnapshot | undefined>;
32
+ highlightElement?(selector: ElementSelector): Promise<void>;
33
+ clearHighlight?(): Promise<void>;
34
+ findElement?(selector: ElementSelector): Promise<MobileElementSnapshot | undefined>;
35
+ findElements?(selector: ElementSelector): Promise<MobileElementSnapshot[]>;
36
+ findManyElements?(selectors: ElementSelector[]): Promise<MobileElementSnapshot[]>;
37
+ waitForElement?(selector: ElementSelector, options?: ElementWaitOptions): Promise<MobileElementSnapshot>;
38
+ waitForElementHidden?(selector: ElementSelector, options?: ElementWaitOptions): Promise<void>;
39
+ tapElement?(selector: ElementSelector, options?: ElementTapOptions): Promise<void>;
40
+ doubleTapElement?(selector: ElementSelector, options?: ElementDoubleTapOptions): Promise<void>;
41
+ longPressElement?(selector: ElementSelector, options?: ElementLongPressOptions): Promise<void>;
42
+ fillElement?(selector: ElementSelector, value: string, options?: ElementFillOptions): Promise<void>;
43
+ dragElement?(selector: ElementSelector, target: ElementDragTarget, options?: ElementDragOptions): Promise<void>;
44
+ tap(target: Coordinates): Promise<void>;
45
+ doubleTap?(target: Coordinates, options?: DoubleTapOptions): Promise<void>;
46
+ longPress(target: Coordinates, options?: LongPressOptions): Promise<void>;
47
+ fill(selector: ElementSelector, value: string): Promise<void>;
48
+ pressKey(key: string): Promise<void>;
49
+ swipe(gesture: SwipeGesture): Promise<void>;
50
+ drag(gesture: DragGesture): Promise<void>;
51
+ startRecording?(): Promise<void>;
52
+ stopRecording?(options?: RecordingStopOptions): Promise<Buffer | undefined>;
53
+ screenshot(): Promise<Buffer>;
54
+ openWeb(url: string): Promise<void>;
55
+ pushFile?(localPath: string, remotePath: string): Promise<void>;
56
+ pullFile?(remotePath: string): Promise<Buffer>;
57
+ saveFile?(remotePath: string, localPath: string): Promise<void>;
58
+ removeFile?(remotePath: string): Promise<void>;
59
+ listFiles?(remotePath: string): Promise<DeviceFileEntry[]>;
60
+ getKeyboardState?(): Promise<KeyboardState>;
61
+ dismissKeyboard?(): Promise<void>;
62
+ listContexts?(): Promise<MobileContextInfo[]>;
63
+ connectWebView?(selector?: WebViewSelector): Promise<WebViewEndpoint>;
64
+ }
65
+ export declare class AsturDevice {
66
+ readonly capabilities: NormalizedCapabilities;
67
+ readonly deviceInfo: DeviceInfo;
68
+ private readonly session;
69
+ constructor(session: PlatformSession);
70
+ readonly app: {
71
+ install: (path?: string) => Promise<void>;
72
+ uninstall: (target?: string | AppUnderTest) => Promise<void>;
73
+ launch: (options?: LaunchOptions) => Promise<void>;
74
+ terminate: () => Promise<void>;
75
+ clearData: (target?: string | AppUnderTest) => Promise<void>;
76
+ clearCache: (target?: string | AppUnderTest) => Promise<void>;
77
+ reset: (options?: AppResetOptions) => Promise<void>;
78
+ };
79
+ readonly gestures: {
80
+ tap: (point: Coordinates, options?: TapOptions) => Promise<void>;
81
+ doubleTap: (point: Coordinates, options?: DoubleTapOptions) => Promise<void>;
82
+ longPress: (point: Coordinates, options?: LongPressOptions) => Promise<void>;
83
+ pressAndHold: (point: Coordinates, options?: LongPressOptions) => Promise<void>;
84
+ swipe: (gesture: SwipeGesture) => Promise<void>;
85
+ drag: (gesture: DragGesture) => Promise<void>;
86
+ };
87
+ readonly navigation: {
88
+ back: () => Promise<void>;
89
+ home: () => Promise<void>;
90
+ recentApps: () => Promise<void>;
91
+ };
92
+ readonly orientation: {
93
+ set: (orientation: DeviceOrientation) => Promise<void>;
94
+ portrait: () => Promise<void>;
95
+ landscape: () => Promise<void>;
96
+ };
97
+ readonly system: {
98
+ lock: () => Promise<void>;
99
+ unlock: () => Promise<void>;
100
+ isLocked: () => Promise<boolean>;
101
+ };
102
+ readonly permissions: {
103
+ grant: (permission: string, target?: string | AppUnderTest) => Promise<void>;
104
+ revoke: (permission: string, target?: string | AppUnderTest) => Promise<void>;
105
+ };
106
+ readonly keyboard: {
107
+ isVisible: () => Promise<boolean>;
108
+ dismiss: () => Promise<void>;
109
+ hide: () => Promise<void>;
110
+ show: (target?: MobileLocator | ElementSelector) => Promise<void>;
111
+ };
112
+ readonly files: {
113
+ push: (localPath: string, remotePath: string) => Promise<void>;
114
+ pull: (remotePath: string) => Promise<Buffer>;
115
+ save: (remotePath: string, localPath: string) => Promise<void>;
116
+ remove: (remotePath: string) => Promise<void>;
117
+ list: (remotePath: string) => Promise<DeviceFileEntry[]>;
118
+ };
119
+ find(selector: ElementSelector): MobileLocator;
120
+ findAll(selector: ElementSelector): Promise<MobileElementSnapshot[]>;
121
+ findMany(selectors: ElementSelector[]): Promise<MobileElementSnapshot[]>;
122
+ locator(selector: ElementSelector): MobileLocator;
123
+ getByLabel(value: string, options?: {
124
+ exact?: boolean;
125
+ }): MobileLocator;
126
+ getByA11y(value: string, options?: {
127
+ exact?: boolean;
128
+ }): MobileLocator;
129
+ getByText(value: string, options?: {
130
+ exact?: boolean;
131
+ }): MobileLocator;
132
+ getByTestId(value: string, options?: {
133
+ exact?: boolean;
134
+ }): MobileLocator;
135
+ getById(value: string, options?: {
136
+ exact?: boolean;
137
+ }): MobileLocator;
138
+ getByRole(role: MobileRole | string, options?: RoleSelectorOptions): MobileLocator;
139
+ getByType(value: string, options?: {
140
+ exact?: boolean;
141
+ }): MobileLocator;
142
+ inspector(options?: RuntimeInspectorSessionOptions): InspectorSession;
143
+ suggestLocators(selector: ElementSelector): Promise<LocatorSuggestion[]>;
144
+ tap(point: Coordinates, options?: TapOptions): Promise<void>;
145
+ doubleTap(point: Coordinates, options?: DoubleTapOptions): Promise<void>;
146
+ longPress(point: Coordinates, options?: LongPressOptions): Promise<void>;
147
+ pressAndHold(point: Coordinates, options?: LongPressOptions): Promise<void>;
148
+ setOrientation(orientation: DeviceOrientation): Promise<void>;
149
+ pressKey(key: string): Promise<void>;
150
+ back(): Promise<void>;
151
+ home(): Promise<void>;
152
+ recentApps(): Promise<void>;
153
+ recents(): Promise<void>;
154
+ lock(): Promise<void>;
155
+ unlock(): Promise<void>;
156
+ isLocked(): Promise<boolean>;
157
+ swipe(gesture: SwipeGesture): Promise<void>;
158
+ drag(gesture: DragGesture): Promise<void>;
159
+ screenshot(options?: ScreenshotOptions): Promise<Buffer>;
160
+ startRecording(): Promise<void>;
161
+ stopRecording(options?: RecordingStopOptions): Promise<Buffer | undefined>;
162
+ tree(): Promise<MobileElementSnapshot>;
163
+ viewport(): Promise<Bounds>;
164
+ openWeb(url: string): Promise<void>;
165
+ contexts(): Promise<MobileContextInfo[]>;
166
+ webViewEndpoint(selector?: WebViewSelector): Promise<WebViewEndpoint>;
167
+ close(): Promise<void>;
168
+ }
169
+ export declare class AsturRuntime {
170
+ private readonly drivers;
171
+ register(driver: PlatformDriver): this;
172
+ doctor(): Promise<DoctorCheck[]>;
173
+ listDevices(platform?: PlatformName): Promise<DeviceInfo[]>;
174
+ createDevice(config: AsturConfig): Promise<AsturDevice>;
175
+ private requireDriver;
176
+ }
177
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}