@mobilewright/core 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/device.d.ts +34 -0
- package/dist/device.d.ts.map +1 -0
- package/dist/device.js +73 -0
- package/dist/device.js.map +1 -0
- package/dist/expect.d.ts +30 -0
- package/dist/expect.d.ts.map +1 -0
- package/dist/expect.js +74 -0
- package/dist/expect.js.map +1 -0
- package/dist/expect.test.d.ts +2 -0
- package/dist/expect.test.d.ts.map +1 -0
- package/dist/expect.test.js +212 -0
- package/dist/expect.test.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/locator.d.ts +69 -0
- package/dist/locator.d.ts.map +1 -0
- package/dist/locator.js +204 -0
- package/dist/locator.js.map +1 -0
- package/dist/locator.test.d.ts +2 -0
- package/dist/locator.test.d.ts.map +1 -0
- package/dist/locator.test.js +240 -0
- package/dist/locator.test.js.map +1 -0
- package/dist/query-engine.d.ts +32 -0
- package/dist/query-engine.d.ts.map +1 -0
- package/dist/query-engine.js +115 -0
- package/dist/query-engine.js.map +1 -0
- package/dist/query-engine.test.d.ts +2 -0
- package/dist/query-engine.test.d.ts.map +1 -0
- package/dist/query-engine.test.js +244 -0
- package/dist/query-engine.test.js.map +1 -0
- package/dist/screen.d.ts +23 -0
- package/dist/screen.d.ts.map +1 -0
- package/dist/screen.js +37 -0
- package/dist/screen.js.map +1 -0
- package/dist/sleep.d.ts +2 -0
- package/dist/sleep.d.ts.map +1 -0
- package/dist/sleep.js +4 -0
- package/dist/sleep.js.map +1 -0
- package/package.json +25 -0
package/dist/device.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AppInfo, ConnectionConfig, LaunchOptions, MobilewrightDriver, Orientation, RecordingOptions, RecordingResult, Session } from '@mobilewright/protocol';
|
|
2
|
+
import { Screen } from './screen.js';
|
|
3
|
+
import type { LocatorOptions } from './locator.js';
|
|
4
|
+
export interface DeviceOptions {
|
|
5
|
+
locatorDefaults?: LocatorOptions;
|
|
6
|
+
}
|
|
7
|
+
export declare class Device {
|
|
8
|
+
readonly driver: MobilewrightDriver;
|
|
9
|
+
private cleanupCallbacks;
|
|
10
|
+
private _screen;
|
|
11
|
+
private readonly opts;
|
|
12
|
+
constructor(driver: MobilewrightDriver, opts?: DeviceOptions);
|
|
13
|
+
/** Register a callback to run on close(). Used by launchers for cleanup. */
|
|
14
|
+
onClose(callback: () => Promise<void>): void;
|
|
15
|
+
connect(config: ConnectionConfig): Promise<Session>;
|
|
16
|
+
disconnect(): Promise<void>;
|
|
17
|
+
/** Full cleanup: disconnect + run any registered cleanup callbacks. */
|
|
18
|
+
close(): Promise<void>;
|
|
19
|
+
get screen(): Screen;
|
|
20
|
+
getOrientation(): Promise<Orientation>;
|
|
21
|
+
setOrientation(orientation: Orientation): Promise<void>;
|
|
22
|
+
openUrl(url: string): Promise<void>;
|
|
23
|
+
/** Alias for openUrl — matches Playwright's page.goto(). */
|
|
24
|
+
goto(url: string): Promise<void>;
|
|
25
|
+
launchApp(bundleId: string, opts?: LaunchOptions): Promise<void>;
|
|
26
|
+
terminateApp(bundleId: string): Promise<void>;
|
|
27
|
+
listApps(): Promise<AppInfo[]>;
|
|
28
|
+
getForegroundApp(): Promise<AppInfo>;
|
|
29
|
+
installApp(path: string): Promise<void>;
|
|
30
|
+
uninstallApp(bundleId: string): Promise<void>;
|
|
31
|
+
startRecording(opts: RecordingOptions): Promise<void>;
|
|
32
|
+
stopRecording(): Promise<RecordingResult>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=device.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,OAAO,EACR,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,EAAE,cAAc,CAAC;CAClC;AAED,qBAAa,MAAM;IACjB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;gBAEzB,MAAM,EAAE,kBAAkB,EAAE,IAAI,GAAE,aAAkB;IAKhE,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAMtC,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAInD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,uEAAuE;IACjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,IAAI,MAAM,IAAI,MAAM,CAGnB;IAIK,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;IAItC,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,4DAA4D;IACtD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAI9B,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIpC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7C,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;CAGhD"}
|
package/dist/device.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Screen } from './screen.js';
|
|
2
|
+
export class Device {
|
|
3
|
+
constructor(driver, opts = {}) {
|
|
4
|
+
this.cleanupCallbacks = [];
|
|
5
|
+
this._screen = null;
|
|
6
|
+
this.driver = driver;
|
|
7
|
+
this.opts = opts;
|
|
8
|
+
}
|
|
9
|
+
/** Register a callback to run on close(). Used by launchers for cleanup. */
|
|
10
|
+
onClose(callback) {
|
|
11
|
+
this.cleanupCallbacks.push(callback);
|
|
12
|
+
}
|
|
13
|
+
// ─── Connection lifecycle ────────────────────────────────────
|
|
14
|
+
async connect(config) {
|
|
15
|
+
return this.driver.connect(config);
|
|
16
|
+
}
|
|
17
|
+
async disconnect() {
|
|
18
|
+
await this.driver.disconnect();
|
|
19
|
+
}
|
|
20
|
+
/** Full cleanup: disconnect + run any registered cleanup callbacks. */
|
|
21
|
+
async close() {
|
|
22
|
+
await this.disconnect();
|
|
23
|
+
for (const cb of this.cleanupCallbacks) {
|
|
24
|
+
await cb();
|
|
25
|
+
}
|
|
26
|
+
this.cleanupCallbacks = [];
|
|
27
|
+
}
|
|
28
|
+
get screen() {
|
|
29
|
+
this._screen ??= new Screen(this.driver, this.opts.locatorDefaults);
|
|
30
|
+
return this._screen;
|
|
31
|
+
}
|
|
32
|
+
// ─── Device control ──────────────────────────────────────────
|
|
33
|
+
async getOrientation() {
|
|
34
|
+
return this.driver.getOrientation();
|
|
35
|
+
}
|
|
36
|
+
async setOrientation(orientation) {
|
|
37
|
+
return this.driver.setOrientation(orientation);
|
|
38
|
+
}
|
|
39
|
+
async openUrl(url) {
|
|
40
|
+
return this.driver.openUrl(url);
|
|
41
|
+
}
|
|
42
|
+
/** Alias for openUrl — matches Playwright's page.goto(). */
|
|
43
|
+
async goto(url) {
|
|
44
|
+
return this.openUrl(url);
|
|
45
|
+
}
|
|
46
|
+
// ─── App control ─────────────────────────────────────────────
|
|
47
|
+
async launchApp(bundleId, opts) {
|
|
48
|
+
return this.driver.launchApp(bundleId, opts);
|
|
49
|
+
}
|
|
50
|
+
async terminateApp(bundleId) {
|
|
51
|
+
return this.driver.terminateApp(bundleId);
|
|
52
|
+
}
|
|
53
|
+
async listApps() {
|
|
54
|
+
return this.driver.listApps();
|
|
55
|
+
}
|
|
56
|
+
async getForegroundApp() {
|
|
57
|
+
return this.driver.getForegroundApp();
|
|
58
|
+
}
|
|
59
|
+
async installApp(path) {
|
|
60
|
+
return this.driver.installApp(path);
|
|
61
|
+
}
|
|
62
|
+
async uninstallApp(bundleId) {
|
|
63
|
+
return this.driver.uninstallApp(bundleId);
|
|
64
|
+
}
|
|
65
|
+
// ─── Recording ─────────────────────────────────────────────────
|
|
66
|
+
async startRecording(opts) {
|
|
67
|
+
return this.driver.startRecording(opts);
|
|
68
|
+
}
|
|
69
|
+
async stopRecording() {
|
|
70
|
+
return this.driver.stopRecording();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"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"}
|
package/dist/expect.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Locator } from './locator.js';
|
|
2
|
+
export interface ExpectOptions {
|
|
3
|
+
timeout?: number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Playwright-style expect with auto-retry for mobile locators.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* expect(locator).toBeVisible()
|
|
10
|
+
* expect(locator).not.toBeVisible()
|
|
11
|
+
* expect(locator).toHaveText('Hello')
|
|
12
|
+
*/
|
|
13
|
+
export declare function expect(locator: Locator): LocatorAssertions;
|
|
14
|
+
declare class LocatorAssertions {
|
|
15
|
+
private readonly locator;
|
|
16
|
+
private readonly negated;
|
|
17
|
+
constructor(locator: Locator, negated: boolean);
|
|
18
|
+
get not(): LocatorAssertions;
|
|
19
|
+
toBeVisible(opts?: ExpectOptions): Promise<void>;
|
|
20
|
+
toBeEnabled(opts?: ExpectOptions): Promise<void>;
|
|
21
|
+
toHaveText(expected: string | RegExp, opts?: ExpectOptions): Promise<void>;
|
|
22
|
+
toContainText(expected: string, opts?: ExpectOptions): Promise<void>;
|
|
23
|
+
private assertText;
|
|
24
|
+
private retryUntil;
|
|
25
|
+
}
|
|
26
|
+
export declare class ExpectError extends Error {
|
|
27
|
+
constructor(message: string);
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=expect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["../src/expect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAM5C,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAE1D;AAED,cAAM,iBAAiB;IAEnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO;IAGnC,IAAI,GAAG,IAAI,iBAAiB,CAE3B;IAEK,WAAW,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhD,WAAW,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1E,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAO5D,UAAU;YAsBV,UAAU;CAkBzB;AAED,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B"}
|
package/dist/expect.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { sleep } from './sleep.js';
|
|
2
|
+
const DEFAULT_TIMEOUT = 5_000;
|
|
3
|
+
const POLL_INTERVAL = 100;
|
|
4
|
+
/**
|
|
5
|
+
* Playwright-style expect with auto-retry for mobile locators.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* expect(locator).toBeVisible()
|
|
9
|
+
* expect(locator).not.toBeVisible()
|
|
10
|
+
* expect(locator).toHaveText('Hello')
|
|
11
|
+
*/
|
|
12
|
+
export function expect(locator) {
|
|
13
|
+
return new LocatorAssertions(locator, false);
|
|
14
|
+
}
|
|
15
|
+
class LocatorAssertions {
|
|
16
|
+
constructor(locator, negated) {
|
|
17
|
+
this.locator = locator;
|
|
18
|
+
this.negated = negated;
|
|
19
|
+
}
|
|
20
|
+
get not() {
|
|
21
|
+
return new LocatorAssertions(this.locator, !this.negated);
|
|
22
|
+
}
|
|
23
|
+
async toBeVisible(opts) {
|
|
24
|
+
await this.retryUntil(() => this.locator.isVisible({ timeout: 0 }), (visible) => (this.negated ? !visible : visible), opts?.timeout ?? DEFAULT_TIMEOUT, this.negated
|
|
25
|
+
? 'Expected element to NOT be visible, but it was'
|
|
26
|
+
: 'Expected element to be visible, but it was not');
|
|
27
|
+
}
|
|
28
|
+
async toBeEnabled(opts) {
|
|
29
|
+
await this.retryUntil(() => this.locator.isEnabled({ timeout: 0 }), (enabled) => (this.negated ? !enabled : enabled), opts?.timeout ?? DEFAULT_TIMEOUT, this.negated
|
|
30
|
+
? 'Expected element to NOT be enabled, but it was'
|
|
31
|
+
: 'Expected element to be enabled, but it was not');
|
|
32
|
+
}
|
|
33
|
+
async toHaveText(expected, opts) {
|
|
34
|
+
await this.assertText((text) => expected instanceof RegExp ? expected.test(text) : text === expected, expected, opts);
|
|
35
|
+
}
|
|
36
|
+
async toContainText(expected, opts) {
|
|
37
|
+
await this.assertText((text) => text.includes(expected), expected, opts);
|
|
38
|
+
}
|
|
39
|
+
async assertText(predicate, expected, opts) {
|
|
40
|
+
let lastText = '';
|
|
41
|
+
await this.retryUntil(async () => {
|
|
42
|
+
try {
|
|
43
|
+
lastText = await this.locator.getText({ timeout: 0 });
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
lastText = '';
|
|
47
|
+
}
|
|
48
|
+
return lastText;
|
|
49
|
+
}, (text) => {
|
|
50
|
+
const matches = predicate(text);
|
|
51
|
+
return this.negated ? !matches : matches;
|
|
52
|
+
}, opts?.timeout ?? DEFAULT_TIMEOUT, () => this.negated
|
|
53
|
+
? `Expected element NOT to have text "${expected}", but got "${lastText}"`
|
|
54
|
+
: `Expected element to have text "${expected}", but got "${lastText}"`);
|
|
55
|
+
}
|
|
56
|
+
async retryUntil(poll, predicate, timeout, failMessage) {
|
|
57
|
+
const deadline = Date.now() + timeout;
|
|
58
|
+
while (true) {
|
|
59
|
+
if (predicate(await poll()))
|
|
60
|
+
return;
|
|
61
|
+
if (Date.now() >= deadline) {
|
|
62
|
+
throw new ExpectError(typeof failMessage === 'function' ? failMessage() : failMessage);
|
|
63
|
+
}
|
|
64
|
+
await sleep(POLL_INTERVAL);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export class ExpectError extends Error {
|
|
69
|
+
constructor(message) {
|
|
70
|
+
super(message);
|
|
71
|
+
this.name = 'ExpectError';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=expect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expect.js","sourceRoot":"","sources":["../src/expect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,aAAa,GAAG,GAAG,CAAC;AAM1B;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAC,OAAgB;IACrC,OAAO,IAAI,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,iBAAiB;IACrB,YACmB,OAAgB,EAChB,OAAgB;QADhB,YAAO,GAAP,OAAO,CAAS;QAChB,YAAO,GAAP,OAAO,CAAS;IAChC,CAAC;IAEJ,IAAI,GAAG;QACL,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAoB;QACpC,MAAM,IAAI,CAAC,UAAU,CACnB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC5C,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAChD,IAAI,EAAE,OAAO,IAAI,eAAe,EAChC,IAAI,CAAC,OAAO;YACV,CAAC,CAAC,gDAAgD;YAClD,CAAC,CAAC,gDAAgD,CACrD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAoB;QACpC,MAAM,IAAI,CAAC,UAAU,CACnB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC5C,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAChD,IAAI,EAAE,OAAO,IAAI,eAAe,EAChC,IAAI,CAAC,OAAO;YACV,CAAC,CAAC,gDAAgD;YAClD,CAAC,CAAC,gDAAgD,CACrD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAyB,EAAE,IAAoB;QAC9D,MAAM,IAAI,CAAC,UAAU,CACnB,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,YAAY,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,EAC9E,QAAQ,EAAE,IAAI,CACf,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB,EAAE,IAAoB;QACxD,MAAM,IAAI,CAAC,UAAU,CACnB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACjC,QAAQ,EAAE,IAAI,CACf,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,SAAoC,EACpC,QAAyB,EACzB,IAAoB;QAEpB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,UAAU,CACnB,KAAK,IAAI,EAAE;YACT,IAAI,CAAC;gBAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,QAAQ,GAAG,EAAE,CAAC;YAAC,CAAC;YACvF,OAAO,QAAQ,CAAC;QAClB,CAAC,EACD,CAAC,IAAI,EAAE,EAAE;YACP,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3C,CAAC,EACD,IAAI,EAAE,OAAO,IAAI,eAAe,EAChC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO;YAChB,CAAC,CAAC,sCAAsC,QAAQ,eAAe,QAAQ,GAAG;YAC1E,CAAC,CAAC,kCAAkC,QAAQ,eAAe,QAAQ,GAAG,CACzE,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,IAAsB,EACtB,SAAgC,EAChC,OAAe,EACf,WAAoC;QAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QAEtC,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC;gBAAE,OAAO;YAEpC,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,WAAW,CAAC,OAAO,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YACzF,CAAC;YAED,MAAM,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expect.test.d.ts","sourceRoot":"","sources":["../src/expect.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { test, expect } from '@playwright/test';
|
|
2
|
+
import { Locator } from './locator.js';
|
|
3
|
+
import { expect as mwExpect, ExpectError } from './expect.js';
|
|
4
|
+
function node(overrides) {
|
|
5
|
+
return {
|
|
6
|
+
isVisible: true,
|
|
7
|
+
isEnabled: true,
|
|
8
|
+
bounds: { x: 0, y: 0, width: 100, height: 44 },
|
|
9
|
+
children: [],
|
|
10
|
+
...overrides,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function createMockDriver(hierarchy) {
|
|
14
|
+
let currentHierarchy = hierarchy;
|
|
15
|
+
const tracker = {
|
|
16
|
+
tapCalls: [],
|
|
17
|
+
doubleTapCalls: [],
|
|
18
|
+
longPressCalls: [],
|
|
19
|
+
typeTextCalls: [],
|
|
20
|
+
swipeCalls: [],
|
|
21
|
+
gestureCalls: [],
|
|
22
|
+
pressButtonCalls: [],
|
|
23
|
+
setOrientationCalls: [],
|
|
24
|
+
launchAppCalls: [],
|
|
25
|
+
terminateAppCalls: [],
|
|
26
|
+
installAppCalls: [],
|
|
27
|
+
uninstallAppCalls: [],
|
|
28
|
+
openUrlCalls: [],
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
_tracker: tracker,
|
|
32
|
+
_setHierarchy: (h) => { currentHierarchy = h; },
|
|
33
|
+
connect: async () => ({ deviceId: 'device1', platform: 'ios' }),
|
|
34
|
+
disconnect: async () => { },
|
|
35
|
+
getViewHierarchy: async () => currentHierarchy,
|
|
36
|
+
tap: async (...args) => { tracker.tapCalls.push(args); },
|
|
37
|
+
doubleTap: async (...args) => { tracker.doubleTapCalls.push(args); },
|
|
38
|
+
longPress: async (...args) => { tracker.longPressCalls.push(args); },
|
|
39
|
+
typeText: async (...args) => { tracker.typeTextCalls.push(args); },
|
|
40
|
+
swipe: async (...args) => { tracker.swipeCalls.push(args); },
|
|
41
|
+
gesture: async (...args) => { tracker.gestureCalls.push(args); },
|
|
42
|
+
pressButton: async (...args) => { tracker.pressButtonCalls.push(args); },
|
|
43
|
+
screenshot: async () => Buffer.from(''),
|
|
44
|
+
getScreenSize: async () => ({ width: 390, height: 844 }),
|
|
45
|
+
getOrientation: async () => 'portrait',
|
|
46
|
+
setOrientation: async (...args) => { tracker.setOrientationCalls.push(args); },
|
|
47
|
+
launchApp: async (...args) => { tracker.launchAppCalls.push(args); },
|
|
48
|
+
terminateApp: async (...args) => { tracker.terminateAppCalls.push(args); },
|
|
49
|
+
listApps: async () => [],
|
|
50
|
+
getForegroundApp: async () => ({ bundleId: 'com.test' }),
|
|
51
|
+
installApp: async (...args) => { tracker.installAppCalls.push(args); },
|
|
52
|
+
uninstallApp: async (...args) => { tracker.uninstallAppCalls.push(args); },
|
|
53
|
+
listDevices: async () => [],
|
|
54
|
+
openUrl: async (...args) => { tracker.openUrlCalls.push(args); },
|
|
55
|
+
startRecording: async () => { },
|
|
56
|
+
stopRecording: async () => ({ output: '' }),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const hierarchy = [
|
|
60
|
+
node({
|
|
61
|
+
type: 'Window',
|
|
62
|
+
children: [
|
|
63
|
+
node({
|
|
64
|
+
type: 'StaticText',
|
|
65
|
+
label: 'Welcome',
|
|
66
|
+
text: 'Welcome back!',
|
|
67
|
+
identifier: 'welcomeText',
|
|
68
|
+
bounds: { x: 10, y: 10, width: 200, height: 30 },
|
|
69
|
+
}),
|
|
70
|
+
node({
|
|
71
|
+
type: 'Button',
|
|
72
|
+
label: 'Submit',
|
|
73
|
+
identifier: 'submitBtn',
|
|
74
|
+
bounds: { x: 20, y: 100, width: 200, height: 50 },
|
|
75
|
+
}),
|
|
76
|
+
node({
|
|
77
|
+
type: 'Button',
|
|
78
|
+
label: 'Hidden',
|
|
79
|
+
identifier: 'hiddenBtn',
|
|
80
|
+
isVisible: false,
|
|
81
|
+
bounds: { x: 20, y: 200, width: 200, height: 50 },
|
|
82
|
+
}),
|
|
83
|
+
],
|
|
84
|
+
}),
|
|
85
|
+
];
|
|
86
|
+
test.describe('expect', () => {
|
|
87
|
+
test.describe('toBeVisible', () => {
|
|
88
|
+
test('passes when element is visible', async () => {
|
|
89
|
+
const driver = createMockDriver(hierarchy);
|
|
90
|
+
const locator = new Locator(driver, {
|
|
91
|
+
kind: 'testId',
|
|
92
|
+
value: 'submitBtn',
|
|
93
|
+
});
|
|
94
|
+
await mwExpect(locator).toBeVisible();
|
|
95
|
+
});
|
|
96
|
+
test('fails when element is not visible', async () => {
|
|
97
|
+
const driver = createMockDriver(hierarchy);
|
|
98
|
+
const locator = new Locator(driver, {
|
|
99
|
+
kind: 'testId',
|
|
100
|
+
value: 'hiddenBtn',
|
|
101
|
+
});
|
|
102
|
+
await expect(mwExpect(locator).toBeVisible({ timeout: 200 })).rejects.toThrow(ExpectError);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
test.describe('not.toBeVisible', () => {
|
|
106
|
+
test('passes when element is not visible', async () => {
|
|
107
|
+
const driver = createMockDriver(hierarchy);
|
|
108
|
+
const locator = new Locator(driver, {
|
|
109
|
+
kind: 'testId',
|
|
110
|
+
value: 'hiddenBtn',
|
|
111
|
+
});
|
|
112
|
+
await mwExpect(locator).not.toBeVisible();
|
|
113
|
+
});
|
|
114
|
+
test('passes when element does not exist', async () => {
|
|
115
|
+
const driver = createMockDriver(hierarchy);
|
|
116
|
+
const locator = new Locator(driver, {
|
|
117
|
+
kind: 'testId',
|
|
118
|
+
value: 'nonExistent',
|
|
119
|
+
});
|
|
120
|
+
await mwExpect(locator).not.toBeVisible();
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
test.describe('toHaveText', () => {
|
|
124
|
+
test('passes with exact text match', async () => {
|
|
125
|
+
const driver = createMockDriver(hierarchy);
|
|
126
|
+
const locator = new Locator(driver, {
|
|
127
|
+
kind: 'testId',
|
|
128
|
+
value: 'welcomeText',
|
|
129
|
+
});
|
|
130
|
+
await mwExpect(locator).toHaveText('Welcome back!');
|
|
131
|
+
});
|
|
132
|
+
test('passes with regex match', async () => {
|
|
133
|
+
const driver = createMockDriver(hierarchy);
|
|
134
|
+
const locator = new Locator(driver, {
|
|
135
|
+
kind: 'testId',
|
|
136
|
+
value: 'welcomeText',
|
|
137
|
+
});
|
|
138
|
+
await mwExpect(locator).toHaveText(/welcome/i);
|
|
139
|
+
});
|
|
140
|
+
test('fails with wrong text', async () => {
|
|
141
|
+
const driver = createMockDriver(hierarchy);
|
|
142
|
+
const locator = new Locator(driver, {
|
|
143
|
+
kind: 'testId',
|
|
144
|
+
value: 'welcomeText',
|
|
145
|
+
});
|
|
146
|
+
await expect(mwExpect(locator).toHaveText('Wrong text', { timeout: 200 })).rejects.toThrow(ExpectError);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
test.describe('toContainText', () => {
|
|
150
|
+
test('passes when text contains substring', async () => {
|
|
151
|
+
const driver = createMockDriver(hierarchy);
|
|
152
|
+
const locator = new Locator(driver, {
|
|
153
|
+
kind: 'testId',
|
|
154
|
+
value: 'welcomeText',
|
|
155
|
+
});
|
|
156
|
+
await mwExpect(locator).toContainText('back');
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
test.describe('toBeEnabled', () => {
|
|
160
|
+
test('passes when element is enabled', async () => {
|
|
161
|
+
const driver = createMockDriver(hierarchy);
|
|
162
|
+
const locator = new Locator(driver, {
|
|
163
|
+
kind: 'testId',
|
|
164
|
+
value: 'submitBtn',
|
|
165
|
+
});
|
|
166
|
+
await mwExpect(locator).toBeEnabled();
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
test.describe('auto-retry', () => {
|
|
170
|
+
test('retries until assertion passes', async () => {
|
|
171
|
+
const initialTree = [
|
|
172
|
+
node({
|
|
173
|
+
type: 'Window',
|
|
174
|
+
children: [
|
|
175
|
+
node({
|
|
176
|
+
type: 'StaticText',
|
|
177
|
+
label: 'Status',
|
|
178
|
+
identifier: 'status',
|
|
179
|
+
text: 'Loading...',
|
|
180
|
+
}),
|
|
181
|
+
],
|
|
182
|
+
}),
|
|
183
|
+
];
|
|
184
|
+
const updatedTree = [
|
|
185
|
+
node({
|
|
186
|
+
type: 'Window',
|
|
187
|
+
children: [
|
|
188
|
+
node({
|
|
189
|
+
type: 'StaticText',
|
|
190
|
+
label: 'Status',
|
|
191
|
+
identifier: 'status',
|
|
192
|
+
text: 'Done!',
|
|
193
|
+
}),
|
|
194
|
+
],
|
|
195
|
+
}),
|
|
196
|
+
];
|
|
197
|
+
let callCount = 0;
|
|
198
|
+
const driver = createMockDriver(initialTree);
|
|
199
|
+
// Override getViewHierarchy to switch after 3 calls
|
|
200
|
+
driver.getViewHierarchy = async () => {
|
|
201
|
+
callCount++;
|
|
202
|
+
return callCount >= 3 ? updatedTree : initialTree;
|
|
203
|
+
};
|
|
204
|
+
const locator = new Locator(driver, {
|
|
205
|
+
kind: 'testId',
|
|
206
|
+
value: 'status',
|
|
207
|
+
});
|
|
208
|
+
await mwExpect(locator).toHaveText('Done!', { timeout: 2000 });
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
//# sourceMappingURL=expect.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expect.test.js","sourceRoot":"","sources":["../src/expect.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { Locator, LocatorError, type LocatorOptions } from './locator.js';
|
|
2
|
+
export { Screen } from './screen.js';
|
|
3
|
+
export { Device, type DeviceOptions } from './device.js';
|
|
4
|
+
export { expect, ExpectError, type ExpectOptions } from './expect.js';
|
|
5
|
+
export { queryAll, type LocatorStrategy } from './query-engine.js';
|
|
6
|
+
export { sleep } from './sleep.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { Locator, LocatorError } from './locator.js';
|
|
2
|
+
export { Screen } from './screen.js';
|
|
3
|
+
export { Device } from './device.js';
|
|
4
|
+
export { expect, ExpectError } from './expect.js';
|
|
5
|
+
export { queryAll } from './query-engine.js';
|
|
6
|
+
export { sleep } from './sleep.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAuB,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAsB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAwB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { MobilewrightDriver } from '@mobilewright/protocol';
|
|
2
|
+
import { type LocatorStrategy } from './query-engine.js';
|
|
3
|
+
export interface LocatorOptions {
|
|
4
|
+
timeout?: number;
|
|
5
|
+
pollInterval?: number;
|
|
6
|
+
stabilityDelay?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class Locator {
|
|
9
|
+
private readonly driver;
|
|
10
|
+
private readonly strategy;
|
|
11
|
+
private readonly options;
|
|
12
|
+
/** Create a root locator that searches the entire view hierarchy. */
|
|
13
|
+
static root(driver: MobilewrightDriver, options?: LocatorOptions): Locator;
|
|
14
|
+
constructor(driver: MobilewrightDriver, strategy: LocatorStrategy, options?: LocatorOptions);
|
|
15
|
+
getByLabel(label: string, opts?: {
|
|
16
|
+
exact?: boolean;
|
|
17
|
+
}): Locator;
|
|
18
|
+
getByTestId(testId: string): Locator;
|
|
19
|
+
getByText(text: string | RegExp, opts?: {
|
|
20
|
+
exact?: boolean;
|
|
21
|
+
}): Locator;
|
|
22
|
+
getByType(type: string): Locator;
|
|
23
|
+
getByRole(role: string, opts?: {
|
|
24
|
+
name?: string | RegExp;
|
|
25
|
+
}): Locator;
|
|
26
|
+
private child;
|
|
27
|
+
tap(opts?: {
|
|
28
|
+
timeout?: number;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
doubleTap(opts?: {
|
|
31
|
+
timeout?: number;
|
|
32
|
+
}): Promise<void>;
|
|
33
|
+
longPress(opts?: {
|
|
34
|
+
timeout?: number;
|
|
35
|
+
duration?: number;
|
|
36
|
+
}): Promise<void>;
|
|
37
|
+
fill(text: string, opts?: {
|
|
38
|
+
timeout?: number;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
screenshot(opts?: {
|
|
41
|
+
timeout?: number;
|
|
42
|
+
}): Promise<Buffer>;
|
|
43
|
+
isVisible(opts?: {
|
|
44
|
+
timeout?: number;
|
|
45
|
+
}): Promise<boolean>;
|
|
46
|
+
isEnabled(opts?: {
|
|
47
|
+
timeout?: number;
|
|
48
|
+
}): Promise<boolean>;
|
|
49
|
+
getText(opts?: {
|
|
50
|
+
timeout?: number;
|
|
51
|
+
}): Promise<string>;
|
|
52
|
+
waitFor(opts?: {
|
|
53
|
+
state?: 'visible' | 'hidden' | 'enabled' | 'disabled';
|
|
54
|
+
timeout?: number;
|
|
55
|
+
}): Promise<void>;
|
|
56
|
+
/** Wait for a visible node and return it. Used by getText, screenshot. */
|
|
57
|
+
private resolveVisible;
|
|
58
|
+
/** Poll until the given state is satisfied. Returns the matched node (or null for hidden/disabled). */
|
|
59
|
+
private pollUntilState;
|
|
60
|
+
/** Resolve to a single actionable node (visible, enabled, stable bounds) */
|
|
61
|
+
private resolveActionable;
|
|
62
|
+
/** Resolve without waiting — returns null if not found */
|
|
63
|
+
private resolve;
|
|
64
|
+
}
|
|
65
|
+
export declare class LocatorError extends Error {
|
|
66
|
+
readonly strategy: LocatorStrategy;
|
|
67
|
+
constructor(message: string, strategy: LocatorStrategy);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=locator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locator.d.ts","sourceRoot":"","sources":["../src/locator.ts"],"names":[],"mappings":"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"}
|