@kraken-e2e/driver-android 1.0.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.
- package/LICENSE +674 -0
- package/dist/appium-server.d.ts +23 -0
- package/dist/appium-server.d.ts.map +1 -0
- package/dist/appium-server.js +144 -0
- package/dist/appium-server.js.map +1 -0
- package/dist/doctor.d.ts +18 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +130 -0
- package/dist/doctor.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/locators.d.ts +17 -0
- package/dist/locators.d.ts.map +1 -0
- package/dist/locators.js +46 -0
- package/dist/locators.js.map +1 -0
- package/dist/manifest.d.ts +9 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +23 -0
- package/dist/manifest.js.map +1 -0
- package/dist/wdio-session.d.ts +63 -0
- package/dist/wdio-session.d.ts.map +1 -0
- package/dist/wdio-session.js +132 -0
- package/dist/wdio-session.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type ArtifactRef, type CoreOperation, type DriverServices, type ResolvedActor, type SemanticKey, type SessionWaitOptions, type TargetLocator, type UserSession, type WaitState } from '@kraken-e2e/contracts';
|
|
2
|
+
/**
|
|
3
|
+
* The slice of a WebdriverIO Browser this adapter consumes — narrow by design
|
|
4
|
+
* so unit tests can mock it and so WDIO types never leak past the driver
|
|
5
|
+
* (ADR-0001 §5.3). The real object comes from webdriverio remote().
|
|
6
|
+
*/
|
|
7
|
+
export interface WdioBrowserLike {
|
|
8
|
+
$(selector: string): Promise<WdioElementLike>;
|
|
9
|
+
execute(script: string, args?: unknown): Promise<unknown>;
|
|
10
|
+
takeScreenshot(): Promise<string>;
|
|
11
|
+
getPageSource(): Promise<string>;
|
|
12
|
+
deleteSession(): Promise<void>;
|
|
13
|
+
url?(destination: string): Promise<unknown>;
|
|
14
|
+
}
|
|
15
|
+
export interface WdioElementLike {
|
|
16
|
+
readonly error?: {
|
|
17
|
+
message?: string;
|
|
18
|
+
};
|
|
19
|
+
elementId?: string | undefined;
|
|
20
|
+
click(): Promise<void>;
|
|
21
|
+
setValue(text: string): Promise<void>;
|
|
22
|
+
getText(): Promise<string>;
|
|
23
|
+
isDisplayed(): Promise<boolean>;
|
|
24
|
+
isExisting(): Promise<boolean>;
|
|
25
|
+
waitForDisplayed(options?: {
|
|
26
|
+
timeout?: number;
|
|
27
|
+
interval?: number;
|
|
28
|
+
reverse?: boolean;
|
|
29
|
+
}): Promise<unknown>;
|
|
30
|
+
waitForExist(options?: {
|
|
31
|
+
timeout?: number;
|
|
32
|
+
interval?: number;
|
|
33
|
+
}): Promise<unknown>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* UserSession adapter over one INDEPENDENT WebdriverIO session (ADR-0001
|
|
37
|
+
* §5.6 — one remote() per actor, never multiremote). All 11 core operations
|
|
38
|
+
* are supported on Android; parity is proven by the CTK, not claimed.
|
|
39
|
+
*/
|
|
40
|
+
export declare class AndroidUserSession implements UserSession {
|
|
41
|
+
#private;
|
|
42
|
+
private readonly browser;
|
|
43
|
+
private readonly services;
|
|
44
|
+
private readonly appPackage;
|
|
45
|
+
readonly actorId: string;
|
|
46
|
+
readonly driverId = "android";
|
|
47
|
+
readonly platform: string;
|
|
48
|
+
readonly capabilities: Readonly<Record<CoreOperation, 'supported' | 'unsupported'>>;
|
|
49
|
+
constructor(browser: WdioBrowserLike, actor: ResolvedActor, services: DriverServices, appPackage: string | undefined);
|
|
50
|
+
tap(target: TargetLocator): Promise<void>;
|
|
51
|
+
typeText(target: TargetLocator, text: string): Promise<void>;
|
|
52
|
+
readText(target: TargetLocator): Promise<string>;
|
|
53
|
+
waitFor(target: TargetLocator, state: WaitState, opts?: SessionWaitOptions): Promise<void>;
|
|
54
|
+
isDisplayed(target: TargetLocator): Promise<boolean>;
|
|
55
|
+
scrollIntoView(target: TargetLocator): Promise<void>;
|
|
56
|
+
pressKey(key: SemanticKey): Promise<void>;
|
|
57
|
+
navigate(destination: string): Promise<void>;
|
|
58
|
+
screenshot(): Promise<ArtifactRef>;
|
|
59
|
+
source(): Promise<string>;
|
|
60
|
+
dispose(): Promise<void>;
|
|
61
|
+
native<K extends never>(kind: K): never;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=wdio-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wdio-session.d.ts","sourceRoot":"","sources":["../src/wdio-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { CORE_OPERATIONS, KrakenError, } from '@kraken-e2e/contracts';
|
|
5
|
+
import { keyCodeFor, toAndroidSelector } from './locators.js';
|
|
6
|
+
const DEFAULT_WAIT_MS = 10_000;
|
|
7
|
+
/**
|
|
8
|
+
* UserSession adapter over one INDEPENDENT WebdriverIO session (ADR-0001
|
|
9
|
+
* §5.6 — one remote() per actor, never multiremote). All 11 core operations
|
|
10
|
+
* are supported on Android; parity is proven by the CTK, not claimed.
|
|
11
|
+
*/
|
|
12
|
+
export class AndroidUserSession {
|
|
13
|
+
browser;
|
|
14
|
+
services;
|
|
15
|
+
appPackage;
|
|
16
|
+
actorId;
|
|
17
|
+
driverId = 'android';
|
|
18
|
+
platform;
|
|
19
|
+
capabilities;
|
|
20
|
+
#disposed = false;
|
|
21
|
+
#screenshots = 0;
|
|
22
|
+
/** Distinguishes artifacts across the run's many sessions (one per scenario). */
|
|
23
|
+
#sessionTag = randomUUID().slice(0, 8);
|
|
24
|
+
constructor(browser, actor, services, appPackage) {
|
|
25
|
+
this.browser = browser;
|
|
26
|
+
this.services = services;
|
|
27
|
+
this.appPackage = appPackage;
|
|
28
|
+
this.actorId = actor.id;
|
|
29
|
+
this.platform = actor.platform;
|
|
30
|
+
this.capabilities = Object.fromEntries(CORE_OPERATIONS.map((op) => [op, 'supported']));
|
|
31
|
+
}
|
|
32
|
+
async #element(target) {
|
|
33
|
+
const selector = toAndroidSelector(target);
|
|
34
|
+
const element = await this.browser.$(selector);
|
|
35
|
+
if (element.error || (element.elementId === undefined && !(await element.isExisting()))) {
|
|
36
|
+
throw new KrakenError('KRK-SESSION-ELEMENT-NOT-FOUND', `Actor "${this.actorId}" (android) found no element for ${target.by}="${target.value}".`, {
|
|
37
|
+
data: { selector, target: { ...target } },
|
|
38
|
+
fix: target.by === 'testId'
|
|
39
|
+
? 'Check the resource-id in the app (Appium Inspector helps), or use { by: "native" } with a raw selector.'
|
|
40
|
+
: undefined,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return element;
|
|
44
|
+
}
|
|
45
|
+
async tap(target) {
|
|
46
|
+
await (await this.#element(target)).click();
|
|
47
|
+
}
|
|
48
|
+
async typeText(target, text) {
|
|
49
|
+
await (await this.#element(target)).setValue(text);
|
|
50
|
+
}
|
|
51
|
+
async readText(target) {
|
|
52
|
+
return (await this.#element(target)).getText();
|
|
53
|
+
}
|
|
54
|
+
async waitFor(target, state, opts) {
|
|
55
|
+
const selector = toAndroidSelector(target);
|
|
56
|
+
const element = await this.browser.$(selector);
|
|
57
|
+
const timeout = opts?.timeoutMs ?? DEFAULT_WAIT_MS;
|
|
58
|
+
const interval = opts?.pollMs ?? 100;
|
|
59
|
+
try {
|
|
60
|
+
if (state === 'attached') {
|
|
61
|
+
await element.waitForExist({ timeout, interval });
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
await element.waitForDisplayed({ timeout, interval, reverse: state === 'hidden' });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (cause) {
|
|
68
|
+
throw new KrakenError('KRK-SESSION-WAIT-TIMEOUT', `Actor "${this.actorId}" (android) waited ${timeout}ms for ${target.by}="${target.value}" to be ${state}.`, { cause, data: { selector } });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async isDisplayed(target) {
|
|
72
|
+
const element = await this.browser.$(toAndroidSelector(target));
|
|
73
|
+
if (element.error || (element.elementId === undefined && !(await element.isExisting()))) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
return element.isDisplayed();
|
|
77
|
+
}
|
|
78
|
+
async scrollIntoView(target) {
|
|
79
|
+
// UiScrollable drives the platform's own scrolling; falls back to a plain
|
|
80
|
+
// find when the screen has no scrollable container.
|
|
81
|
+
const inner = toAndroidSelector(target).replace(/^android=/, '');
|
|
82
|
+
if (inner.startsWith('new UiSelector')) {
|
|
83
|
+
const scrollSelector = `android=new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(${inner})`;
|
|
84
|
+
const element = await this.browser.$(scrollSelector);
|
|
85
|
+
if (!element.error)
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
await this.#element(target);
|
|
89
|
+
}
|
|
90
|
+
async pressKey(key) {
|
|
91
|
+
await this.browser.execute('mobile: pressKey', { keycode: keyCodeFor(key) });
|
|
92
|
+
}
|
|
93
|
+
async navigate(destination) {
|
|
94
|
+
// Deep link into the app under test; plain URLs go to the default handler.
|
|
95
|
+
await this.browser.execute('mobile: deepLink', {
|
|
96
|
+
url: destination,
|
|
97
|
+
...(this.appPackage !== undefined ? { package: this.appPackage } : {}),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async screenshot() {
|
|
101
|
+
this.#screenshots += 1;
|
|
102
|
+
const base64 = await this.browser.takeScreenshot();
|
|
103
|
+
const dir = join(this.services.artifactsDir, this.actorId);
|
|
104
|
+
mkdirSync(dir, { recursive: true });
|
|
105
|
+
const path = join(dir, `android-${this.#sessionTag}-${this.#screenshots}.png`);
|
|
106
|
+
writeFileSync(path, Buffer.from(base64, 'base64'));
|
|
107
|
+
return { kind: 'screenshot', path };
|
|
108
|
+
}
|
|
109
|
+
async source() {
|
|
110
|
+
return this.browser.getPageSource();
|
|
111
|
+
}
|
|
112
|
+
async dispose() {
|
|
113
|
+
if (this.#disposed)
|
|
114
|
+
return;
|
|
115
|
+
this.#disposed = true;
|
|
116
|
+
try {
|
|
117
|
+
await this.browser.deleteSession();
|
|
118
|
+
}
|
|
119
|
+
catch (cause) {
|
|
120
|
+
// Idempotent by contract: a dead session is a disposed session.
|
|
121
|
+
this.services.logger.debug('deleteSession failed during dispose (ignored)', {
|
|
122
|
+
cause: cause instanceof Error ? cause.message : String(cause),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
native(kind) {
|
|
127
|
+
// Phase 2 note: the typed escape hatch (KrakenNativeSessions augmentation
|
|
128
|
+
// exposing the WebdriverIO browser) lands with the step-library work.
|
|
129
|
+
throw new KrakenError('KRK-SESSION-OP-UNSUPPORTED', `native("${String(kind)}") is not exposed by driver-android yet (planned: ADR-0007).`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=wdio-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wdio-session.js","sourceRoot":"","sources":["../src/wdio-session.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kraken-e2e/driver-android",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Android driver: Appium 3 + appium-uiautomator2-driver",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"default": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"./manifest": {
|
|
12
|
+
"types": "./dist/manifest.d.ts",
|
|
13
|
+
"default": "./dist/manifest.js"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=22.13.0"
|
|
24
|
+
},
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"@kraken-e2e/contracts": "^0.1.0"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^22.15.0",
|
|
30
|
+
"typescript": "~6.0.3",
|
|
31
|
+
"vitest": "^4.1.9",
|
|
32
|
+
"@kraken-e2e/contracts": "0.1.0",
|
|
33
|
+
"@kraken-e2e/core": "0.1.0"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"appium": "3.5.2",
|
|
37
|
+
"appium-uiautomator2-driver": "8.0.1",
|
|
38
|
+
"webdriverio": "9.29.1"
|
|
39
|
+
},
|
|
40
|
+
"license": "GPL-3.0-only",
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc -p tsconfig.build.json",
|
|
43
|
+
"typecheck": "tsc --noEmit",
|
|
44
|
+
"test": "vitest run"
|
|
45
|
+
}
|
|
46
|
+
}
|