@testingbot/mobilewright-driver 0.1.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 +202 -0
- package/README.md +211 -0
- package/dist/actions.d.ts +25 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +76 -0
- package/dist/actions.js.map +1 -0
- package/dist/app-storage.d.ts +20 -0
- package/dist/app-storage.d.ts.map +1 -0
- package/dist/app-storage.js +68 -0
- package/dist/app-storage.js.map +1 -0
- package/dist/capabilities.d.ts +27 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +120 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/ci.d.ts +8 -0
- package/dist/ci.d.ts.map +1 -0
- package/dist/ci.js +46 -0
- package/dist/ci.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +43 -0
- package/dist/cli.js.map +1 -0
- package/dist/device-catalog.d.ts +37 -0
- package/dist/device-catalog.d.ts.map +1 -0
- package/dist/device-catalog.js +159 -0
- package/dist/device-catalog.js.map +1 -0
- package/dist/driver.d.ts +80 -0
- package/dist/driver.d.ts.map +1 -0
- package/dist/driver.js +646 -0
- package/dist/driver.js.map +1 -0
- package/dist/errors.d.ts +41 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +104 -0
- package/dist/errors.js.map +1 -0
- package/dist/hierarchy.d.ts +10 -0
- package/dist/hierarchy.d.ts.map +1 -0
- package/dist/hierarchy.js +103 -0
- package/dist/hierarchy.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +19 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +108 -0
- package/dist/init.js.map +1 -0
- package/dist/keepalive.d.ts +16 -0
- package/dist/keepalive.d.ts.map +1 -0
- package/dist/keepalive.js +56 -0
- package/dist/keepalive.js.map +1 -0
- package/dist/keys.d.ts +32 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +117 -0
- package/dist/keys.js.map +1 -0
- package/dist/observer.d.ts +55 -0
- package/dist/observer.d.ts.map +1 -0
- package/dist/observer.js +148 -0
- package/dist/observer.js.map +1 -0
- package/dist/options.d.ts +154 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +49 -0
- package/dist/options.js.map +1 -0
- package/dist/rest-api.d.ts +67 -0
- package/dist/rest-api.d.ts.map +1 -0
- package/dist/rest-api.js +117 -0
- package/dist/rest-api.js.map +1 -0
- package/dist/run-log.d.ts +56 -0
- package/dist/run-log.d.ts.map +1 -0
- package/dist/run-log.js +72 -0
- package/dist/run-log.js.map +1 -0
- package/dist/tunnel.d.ts +13 -0
- package/dist/tunnel.d.ts.map +1 -0
- package/dist/tunnel.js +47 -0
- package/dist/tunnel.js.map +1 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- package/dist/webdriver-client.d.ts +43 -0
- package/dist/webdriver-client.d.ts.map +1 -0
- package/dist/webdriver-client.js +109 -0
- package/dist/webdriver-client.js.map +1 -0
- package/dist/webview.d.ts +16 -0
- package/dist/webview.d.ts.map +1 -0
- package/dist/webview.js +109 -0
- package/dist/webview.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACvC;AAED,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAKD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,YAAY,CAAC,EAC7D,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GACrC,MAAM,GAAG,SAAS,CAQpB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,eAAe,EACxB,MAAM,CAAC,EAAE,YAAY,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,eAAe,CA6FjB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/** Characters that make a regex source mean something beyond its literal text. */
|
|
2
|
+
const REGEX_METACHARS = /[.*+?^${}()|[\]\\]/;
|
|
3
|
+
/**
|
|
4
|
+
* Pick the configured app for an allocation, most-specific key first
|
|
5
|
+
* ('ios-real' beats 'ios'). Returns the raw configured value: a local path
|
|
6
|
+
* or a tb:// / https URL (the caller uploads local paths).
|
|
7
|
+
*/
|
|
8
|
+
export function appForCriteria(criteria, apps) {
|
|
9
|
+
const platform = criteria.platform;
|
|
10
|
+
if (!platform)
|
|
11
|
+
return undefined;
|
|
12
|
+
if (criteria.deviceType) {
|
|
13
|
+
const specific = apps[`${platform}-${criteria.deviceType}`];
|
|
14
|
+
if (specific)
|
|
15
|
+
return specific;
|
|
16
|
+
}
|
|
17
|
+
return apps[platform];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build the W3C new-session payload for a set of allocation criteria.
|
|
21
|
+
* Pure — catalog lookups and app uploads happen in the caller; a pinned
|
|
22
|
+
* device (real-device allocations) overrides name/version wildcards, and
|
|
23
|
+
* `appUrl` is the already-uploaded app under test (tb:// or https).
|
|
24
|
+
*/
|
|
25
|
+
export function buildCapabilities(criteria, options, pinned, appUrl) {
|
|
26
|
+
const platform = criteria.platform;
|
|
27
|
+
if (!platform) {
|
|
28
|
+
throw new Error('TestingBotDriver.allocate requires a platform ("ios" or "android"). ' +
|
|
29
|
+
'Set `platform` in your mobilewright config (top-level or per-project `use`).');
|
|
30
|
+
}
|
|
31
|
+
// A pin from the physical-device catalog (deviceId lookups) implies a real
|
|
32
|
+
// device even without deviceType; virtual-catalog pins never do.
|
|
33
|
+
const isReal = criteria.deviceType === 'real' || (criteria.deviceType === undefined && pinned?.real === true);
|
|
34
|
+
const caps = {
|
|
35
|
+
platformName: platform === 'ios' ? 'iOS' : 'Android',
|
|
36
|
+
'appium:automationName': platform === 'ios' ? 'XCUITest' : 'UiAutomator2',
|
|
37
|
+
};
|
|
38
|
+
if (appUrl)
|
|
39
|
+
caps['appium:app'] = appUrl;
|
|
40
|
+
// TestingBot has no app-less sessions: every session must start with an
|
|
41
|
+
// app or a browser. Fail here with guidance instead of a cryptic hub error.
|
|
42
|
+
const escape = options.capabilities;
|
|
43
|
+
const startsWithSomething = appUrl
|
|
44
|
+
|| escape['appium:app'] || escape['app']
|
|
45
|
+
|| escape['browserName'] || escape['appium:browserName'];
|
|
46
|
+
if (!startsWithSomething) {
|
|
47
|
+
throw new Error('TestingBot sessions must start with an app (or a browser). Declare the app under test in ' +
|
|
48
|
+
"the driver options — new TestingBotDriver({ apps: { " +
|
|
49
|
+
(platform === 'ios'
|
|
50
|
+
? "'ios-simulator': './build/App.zip', 'ios-real': './build/App.ipa'"
|
|
51
|
+
: "android: './build/app.apk'") +
|
|
52
|
+
" } }) — or set 'appium:app' / 'browserName' via the capabilities escape hatch.");
|
|
53
|
+
}
|
|
54
|
+
if (pinned) {
|
|
55
|
+
caps['appium:deviceName'] = pinned.deviceName;
|
|
56
|
+
caps['appium:platformVersion'] = pinned.platformVersion;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Fallback guard: the driver resolves regex patterns via the virtual
|
|
60
|
+
// catalog before calling this, so a regex here means a direct call
|
|
61
|
+
// without resolution — only literal names can pass through to the hub.
|
|
62
|
+
if (criteria.deviceNamePattern && REGEX_METACHARS.test(criteria.deviceNamePattern)) {
|
|
63
|
+
throw new Error(`TestingBotDriver cannot resolve the deviceName pattern /${criteria.deviceNamePattern}/ for ` +
|
|
64
|
+
'simulators/emulators. Use a literal device name (e.g. deviceName: "iPhone 15"), or set ' +
|
|
65
|
+
'the exact name via the capabilities escape hatch: { capabilities: { "appium:deviceName": "..." } }.');
|
|
66
|
+
}
|
|
67
|
+
caps['appium:deviceName'] = criteria.deviceNamePattern ?? '*';
|
|
68
|
+
if (criteria.osVersion) {
|
|
69
|
+
// Fallback guard: range expressions need catalog resolution (the
|
|
70
|
+
// driver does this before calling); only plain versions/prefixes can
|
|
71
|
+
// be forwarded as platformVersion.
|
|
72
|
+
if (/[<>=\s~^]/.test(criteria.osVersion)) {
|
|
73
|
+
throw new Error(`TestingBotDriver cannot resolve the osVersion range "${criteria.osVersion}" for ` +
|
|
74
|
+
'simulators/emulators without catalog resolution. Use an exact version (e.g. "17.0") or a prefix (e.g. "17").');
|
|
75
|
+
}
|
|
76
|
+
caps['appium:platformVersion'] = criteria.osVersion;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const tbOptions = {
|
|
80
|
+
key: options.key,
|
|
81
|
+
secret: options.secret,
|
|
82
|
+
realDevice: isReal,
|
|
83
|
+
screenrecorder: options.video,
|
|
84
|
+
idletimeout: options.idleTimeout,
|
|
85
|
+
};
|
|
86
|
+
if (options.maxDuration !== undefined)
|
|
87
|
+
tbOptions['maxduration'] = options.maxDuration;
|
|
88
|
+
if (options.appiumVersion !== undefined)
|
|
89
|
+
tbOptions['appiumVersion'] = options.appiumVersion;
|
|
90
|
+
if (options.timeZone !== undefined)
|
|
91
|
+
tbOptions['timeZone'] = options.timeZone;
|
|
92
|
+
if (options.geoCountryCode !== undefined)
|
|
93
|
+
tbOptions['testingbot.geoCountryCode'] = options.geoCountryCode;
|
|
94
|
+
if (options.throttleNetwork !== undefined)
|
|
95
|
+
tbOptions['throttle_network'] = options.throttleNetwork;
|
|
96
|
+
if (options.screenshots !== undefined)
|
|
97
|
+
tbOptions['screenshot'] = options.screenshots;
|
|
98
|
+
if (options.recordLogs !== undefined)
|
|
99
|
+
tbOptions['recordLogs'] = String(options.recordLogs);
|
|
100
|
+
if (options.public !== undefined)
|
|
101
|
+
tbOptions['public'] = options.public;
|
|
102
|
+
if (options.extra !== undefined)
|
|
103
|
+
tbOptions['extra'] = options.extra;
|
|
104
|
+
if (options.tabletOnly !== undefined)
|
|
105
|
+
tbOptions['tabletOnly'] = options.tabletOnly;
|
|
106
|
+
if (options.phoneOnly !== undefined)
|
|
107
|
+
tbOptions['phoneOnly'] = options.phoneOnly;
|
|
108
|
+
if (options.tunnelIdentifier !== undefined)
|
|
109
|
+
tbOptions['tunnelIdentifier'] = options.tunnelIdentifier;
|
|
110
|
+
// Always name the session so it never shows as unnamed on the dashboard;
|
|
111
|
+
// the observer renames per-test sessions to their test's title at run end.
|
|
112
|
+
tbOptions['name'] = options.name ?? 'mobilewright';
|
|
113
|
+
if (options.build !== undefined)
|
|
114
|
+
tbOptions['build'] = options.build;
|
|
115
|
+
Object.assign(tbOptions, options.tbOptions);
|
|
116
|
+
Object.assign(caps, options.capabilities);
|
|
117
|
+
caps['tb:options'] = { ...tbOptions, ...options.capabilities['tb:options'] };
|
|
118
|
+
return { alwaysMatch: caps, firstMatch: [{}] };
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
|
package/dist/ci.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default the TestingBot `build` name from the CI environment so dashboard
|
|
3
|
+
* sessions group by pipeline run without any configuration. An explicit
|
|
4
|
+
* `build` option or TESTINGBOT_BUILD always wins. Deterministic across the
|
|
5
|
+
* coordinator and worker processes, since they share the environment.
|
|
6
|
+
*/
|
|
7
|
+
export declare function detectCiBuild(env?: Record<string, string | undefined>): string | undefined;
|
|
8
|
+
//# sourceMappingURL=ci.d.ts.map
|
package/dist/ci.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci.d.ts","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,GAAG,SAAS,CA+BvG"}
|
package/dist/ci.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default the TestingBot `build` name from the CI environment so dashboard
|
|
3
|
+
* sessions group by pipeline run without any configuration. An explicit
|
|
4
|
+
* `build` option or TESTINGBOT_BUILD always wins. Deterministic across the
|
|
5
|
+
* coordinator and worker processes, since they share the environment.
|
|
6
|
+
*/
|
|
7
|
+
export function detectCiBuild(env = process.env) {
|
|
8
|
+
if (env['TESTINGBOT_BUILD'])
|
|
9
|
+
return env['TESTINGBOT_BUILD'];
|
|
10
|
+
if (env['GITHUB_ACTIONS']) {
|
|
11
|
+
return join(env['GITHUB_REPOSITORY'], num(env['GITHUB_RUN_NUMBER']));
|
|
12
|
+
}
|
|
13
|
+
if (env['GITLAB_CI']) {
|
|
14
|
+
return join(env['CI_PROJECT_PATH'], num(env['CI_PIPELINE_IID'] ?? env['CI_PIPELINE_ID']));
|
|
15
|
+
}
|
|
16
|
+
if (env['CIRCLECI']) {
|
|
17
|
+
return join(env['CIRCLE_PROJECT_REPONAME'], num(env['CIRCLE_BUILD_NUM']));
|
|
18
|
+
}
|
|
19
|
+
if (env['BUILDKITE']) {
|
|
20
|
+
return join(env['BUILDKITE_PIPELINE_SLUG'], num(env['BUILDKITE_BUILD_NUMBER']));
|
|
21
|
+
}
|
|
22
|
+
if (env['BITRISE_IO']) {
|
|
23
|
+
return join(env['BITRISE_APP_TITLE'], num(env['BITRISE_BUILD_NUMBER']));
|
|
24
|
+
}
|
|
25
|
+
if (env['TRAVIS']) {
|
|
26
|
+
return join(env['TRAVIS_REPO_SLUG'], num(env['TRAVIS_BUILD_NUMBER']));
|
|
27
|
+
}
|
|
28
|
+
if (env['TF_BUILD']) { // Azure DevOps
|
|
29
|
+
return join(env['BUILD_DEFINITIONNAME'], env['BUILD_BUILDNUMBER']);
|
|
30
|
+
}
|
|
31
|
+
if (env['JENKINS_URL']) {
|
|
32
|
+
return join(env['JOB_NAME'], num(env['BUILD_NUMBER']));
|
|
33
|
+
}
|
|
34
|
+
if (env['TEAMCITY_VERSION']) {
|
|
35
|
+
return join(env['TEAMCITY_PROJECT_NAME'], num(env['BUILD_NUMBER']));
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
function num(value) {
|
|
40
|
+
return value ? `#${value}` : undefined;
|
|
41
|
+
}
|
|
42
|
+
function join(...parts) {
|
|
43
|
+
const present = parts.filter((p) => !!p);
|
|
44
|
+
return present.length ? present.join(' ') : undefined;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=ci.js.map
|
package/dist/ci.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci.js","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAA0C,OAAO,CAAC,GAAG;IACjF,IAAI,GAAG,CAAC,kBAAkB,CAAC;QAAE,OAAO,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAE5D,IAAI,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,eAAe;QACpC,OAAO,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,GAAG,CAAC,KAAyB;IACpC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzC,CAAC;AAED,SAAS,IAAI,CAAC,GAAG,KAA6B;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createInterface } from 'node:readline/promises';
|
|
3
|
+
import { runInit } from './init.js';
|
|
4
|
+
import { VERSION } from './version.js';
|
|
5
|
+
const command = process.argv[2];
|
|
6
|
+
const nonInteractive = process.argv.includes('--yes') || process.argv.includes('-y') || !process.stdin.isTTY;
|
|
7
|
+
async function main() {
|
|
8
|
+
if (command === 'init') {
|
|
9
|
+
const rl = nonInteractive ? undefined : createInterface({ input: process.stdin, output: process.stdout });
|
|
10
|
+
try {
|
|
11
|
+
console.log(`@testingbot/mobilewright-driver ${VERSION} — project setup\n`);
|
|
12
|
+
await runInit(process.cwd(), {
|
|
13
|
+
ask: async (question, fallback) => {
|
|
14
|
+
if (!rl)
|
|
15
|
+
return fallback;
|
|
16
|
+
const answer = (await rl.question(`${question} [${fallback}]: `)).trim();
|
|
17
|
+
return answer || fallback;
|
|
18
|
+
},
|
|
19
|
+
log: (message) => console.log(message),
|
|
20
|
+
}, !nonInteractive);
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
rl?.close();
|
|
24
|
+
}
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
console.log(`@testingbot/mobilewright-driver ${VERSION}
|
|
28
|
+
|
|
29
|
+
Usage:
|
|
30
|
+
npx @testingbot/mobilewright-driver init [--yes]
|
|
31
|
+
|
|
32
|
+
init Scaffold mobilewright.config.ts and a sample test in the current
|
|
33
|
+
directory. --yes (or a non-interactive shell) accepts all defaults.
|
|
34
|
+
|
|
35
|
+
Docs: https://github.com/testingbot/mobilewright-testingbot`);
|
|
36
|
+
if (command !== undefined && command !== 'help' && command !== '--help')
|
|
37
|
+
process.exitCode = 1;
|
|
38
|
+
}
|
|
39
|
+
main().catch((err) => {
|
|
40
|
+
console.error(String(err));
|
|
41
|
+
process.exitCode = 1;
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AAE7G,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1G,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,mCAAmC,OAAO,oBAAoB,CAAC,CAAC;YAC5E,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE;gBAC3B,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;oBAChC,IAAI,CAAC,EAAE;wBAAE,OAAO,QAAQ,CAAC;oBACzB,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,KAAK,QAAQ,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACzE,OAAO,MAAM,IAAI,QAAQ,CAAC;gBAC5B,CAAC;gBACD,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;aACvC,EAAE,CAAC,cAAc,CAAC,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,EAAE,EAAE,KAAK,EAAE,CAAC;QACd,CAAC;QACD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mCAAmC,OAAO;;;;;;;;4DAQI,CAAC,CAAC;IAC5D,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AAChG,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type AllocationCriteria, type DeviceInfo, type Platform } from '@mobilewright/protocol';
|
|
2
|
+
import type { PinnedDevice } from './capabilities.js';
|
|
3
|
+
import type { RestApiClient } from './rest-api.js';
|
|
4
|
+
export declare class DeviceCatalog {
|
|
5
|
+
private readonly api;
|
|
6
|
+
private cache;
|
|
7
|
+
private virtualCache;
|
|
8
|
+
constructor(api: RestApiClient);
|
|
9
|
+
/**
|
|
10
|
+
* Pick a concrete real device matching the criteria, for pinning into
|
|
11
|
+
* `appium:deviceName`/`appium:platformVersion`. Candidates come from the
|
|
12
|
+
* FULL physical-device catalog (GET /v1/devices) — a busy device is fine,
|
|
13
|
+
* because the hub queues POST /session until it frees up. Availability is
|
|
14
|
+
* only a preference, so allocations go to idle devices first. No match at
|
|
15
|
+
* all is a config error (plain Error — retrying would never help).
|
|
16
|
+
* `pinCounts` refcounts device names pinned by this run's other slots; the
|
|
17
|
+
* pick is registered in it synchronously (no await between choosing and
|
|
18
|
+
* reserving), so concurrent allocates spread across devices instead of
|
|
19
|
+
* racing for the same one. The caller decrements on release/failure.
|
|
20
|
+
*/
|
|
21
|
+
pickRealDevice(criteria: AllocationCriteria, pinCounts: Map<string, number>): Promise<PinnedDevice>;
|
|
22
|
+
/**
|
|
23
|
+
* Pick a concrete simulator/emulator from GET /v1/browsers, resolving
|
|
24
|
+
* osVersion range expressions and deviceName regexes for virtual devices.
|
|
25
|
+
* The catalog is static configuration, so no match is a config error
|
|
26
|
+
* (thrown as a plain Error — retrying would never help), unlike the
|
|
27
|
+
* real-device path where absence is temporary.
|
|
28
|
+
*/
|
|
29
|
+
pickVirtualDevice(criteria: AllocationCriteria): Promise<PinnedDevice>;
|
|
30
|
+
/** Resolve a user-pinned physical device id to its name/version. */
|
|
31
|
+
resolveDeviceId(deviceId: string): Promise<PinnedDevice>;
|
|
32
|
+
/** All physical devices mapped to the protocol's DeviceInfo shape. */
|
|
33
|
+
listDevices(platform?: Platform): Promise<DeviceInfo[]>;
|
|
34
|
+
private getPhysical;
|
|
35
|
+
private getVirtual;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=device-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-catalog.d.ts","sourceRoot":"","sources":["../src/device-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,kBAAkB,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAgB,aAAa,EAAoB,MAAM,eAAe,CAAC;AASnF,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,KAAK,CAA4F;IACzG,OAAO,CAAC,YAAY,CAA6D;gBAErE,GAAG,EAAE,aAAa;IAI9B;;;;;;;;;;;OAWG;IACG,cAAc,CAAC,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAmBzG;;;;;;OAMG;IACG,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IAsB5E,oEAAoE;IAC9D,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ9D,sEAAsE;IAChE,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YAgB/C,WAAW;YAaX,UAAU;CASzB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { osVersionSatisfies } from '@mobilewright/protocol';
|
|
2
|
+
/** How long fetched device lists stay fresh — keeps a burst of pool-slot
|
|
3
|
+
* allocations from hammering the REST API (2000 requests / 5 min limit). */
|
|
4
|
+
const CACHE_TTL_MS = 10_000;
|
|
5
|
+
/** The simulator/emulator combo list is near-static — cache it longer. */
|
|
6
|
+
const VIRTUAL_CACHE_TTL_MS = 300_000;
|
|
7
|
+
export class DeviceCatalog {
|
|
8
|
+
api;
|
|
9
|
+
cache;
|
|
10
|
+
virtualCache;
|
|
11
|
+
constructor(api) {
|
|
12
|
+
this.api = api;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Pick a concrete real device matching the criteria, for pinning into
|
|
16
|
+
* `appium:deviceName`/`appium:platformVersion`. Candidates come from the
|
|
17
|
+
* FULL physical-device catalog (GET /v1/devices) — a busy device is fine,
|
|
18
|
+
* because the hub queues POST /session until it frees up. Availability is
|
|
19
|
+
* only a preference, so allocations go to idle devices first. No match at
|
|
20
|
+
* all is a config error (plain Error — retrying would never help).
|
|
21
|
+
* `pinCounts` refcounts device names pinned by this run's other slots; the
|
|
22
|
+
* pick is registered in it synchronously (no await between choosing and
|
|
23
|
+
* reserving), so concurrent allocates spread across devices instead of
|
|
24
|
+
* racing for the same one. The caller decrements on release/failure.
|
|
25
|
+
*/
|
|
26
|
+
async pickRealDevice(criteria, pinCounts) {
|
|
27
|
+
const { all, available } = await this.getPhysical();
|
|
28
|
+
const matching = all.filter((d) => matches(d, criteria));
|
|
29
|
+
if (matching.length === 0) {
|
|
30
|
+
throw new Error(`No TestingBot real device matches ${describeCriteria(criteria)}. ` +
|
|
31
|
+
'See https://testingbot.com/support/devices for available devices.');
|
|
32
|
+
}
|
|
33
|
+
const availableIds = new Set(available.map((d) => d.id));
|
|
34
|
+
const preferred = matching.find((d) => availableIds.has(d.id) && !pinCounts.has(d.name)) ??
|
|
35
|
+
matching.find((d) => availableIds.has(d.id)) ??
|
|
36
|
+
matching.find((d) => !pinCounts.has(d.name)) ??
|
|
37
|
+
matching[0];
|
|
38
|
+
pinCounts.set(preferred.name, (pinCounts.get(preferred.name) ?? 0) + 1);
|
|
39
|
+
return { deviceName: preferred.name, platformVersion: String(preferred.version), real: true };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Pick a concrete simulator/emulator from GET /v1/browsers, resolving
|
|
43
|
+
* osVersion range expressions and deviceName regexes for virtual devices.
|
|
44
|
+
* The catalog is static configuration, so no match is a config error
|
|
45
|
+
* (thrown as a plain Error — retrying would never help), unlike the
|
|
46
|
+
* real-device path where absence is temporary.
|
|
47
|
+
*/
|
|
48
|
+
async pickVirtualDevice(criteria) {
|
|
49
|
+
const platform = criteria.platform;
|
|
50
|
+
const combos = (await this.getVirtual()).filter((b) => {
|
|
51
|
+
if (browserPlatform(b) !== platform)
|
|
52
|
+
return false;
|
|
53
|
+
if (!b.deviceName || b.version === undefined)
|
|
54
|
+
return false;
|
|
55
|
+
// ChromeOS profiles ride along in the Android list but are not app targets.
|
|
56
|
+
if (b.deviceName.startsWith('ChromeOS'))
|
|
57
|
+
return false;
|
|
58
|
+
if (criteria.deviceNamePattern && !new RegExp(criteria.deviceNamePattern, 'i').test(b.deviceName))
|
|
59
|
+
return false;
|
|
60
|
+
if (criteria.osVersion && !osVersionSatisfies(String(b.version), criteria.osVersion))
|
|
61
|
+
return false;
|
|
62
|
+
return true;
|
|
63
|
+
});
|
|
64
|
+
if (combos.length === 0) {
|
|
65
|
+
throw new Error(`No TestingBot ${platform === 'ios' ? 'simulator' : 'emulator'} matches ${describeCriteria(criteria)}. ` +
|
|
66
|
+
'See https://testingbot.com/support/devices for available combinations.');
|
|
67
|
+
}
|
|
68
|
+
// Deterministic pick: the newest matching OS version.
|
|
69
|
+
const best = combos.reduce((a, b) => (compareVersions(String(a.version), String(b.version)) >= 0 ? a : b));
|
|
70
|
+
return { deviceName: best.deviceName, platformVersion: String(best.version), real: false };
|
|
71
|
+
}
|
|
72
|
+
/** Resolve a user-pinned physical device id to its name/version. */
|
|
73
|
+
async resolveDeviceId(deviceId) {
|
|
74
|
+
const device = await this.api.getDevice(deviceId);
|
|
75
|
+
if (!device?.name) {
|
|
76
|
+
throw new Error(`TestingBot device id "${deviceId}" was not found (GET /devices/${deviceId}).`);
|
|
77
|
+
}
|
|
78
|
+
return { deviceName: device.name, platformVersion: String(device.version), real: true };
|
|
79
|
+
}
|
|
80
|
+
/** All physical devices mapped to the protocol's DeviceInfo shape. */
|
|
81
|
+
async listDevices(platform) {
|
|
82
|
+
const { all, available } = await this.getPhysical();
|
|
83
|
+
const availableIds = new Set(available.map((d) => d.id));
|
|
84
|
+
return all
|
|
85
|
+
.filter((d) => !platform || toPlatform(d) === platform)
|
|
86
|
+
.map((d) => ({
|
|
87
|
+
id: String(d.id),
|
|
88
|
+
name: d.name,
|
|
89
|
+
platform: toPlatform(d),
|
|
90
|
+
type: 'real',
|
|
91
|
+
state: availableIds.has(d.id) ? 'online' : 'offline',
|
|
92
|
+
model: d.model_number,
|
|
93
|
+
osVersion: String(d.version),
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
async getPhysical() {
|
|
97
|
+
const now = Date.now();
|
|
98
|
+
if (this.cache && now - this.cache.fetchedAt < CACHE_TTL_MS) {
|
|
99
|
+
return this.cache;
|
|
100
|
+
}
|
|
101
|
+
const [all, available] = await Promise.all([
|
|
102
|
+
this.api.getDevices(false),
|
|
103
|
+
this.api.getDevices(true),
|
|
104
|
+
]);
|
|
105
|
+
this.cache = { all, available, fetchedAt: now };
|
|
106
|
+
return this.cache;
|
|
107
|
+
}
|
|
108
|
+
async getVirtual() {
|
|
109
|
+
const now = Date.now();
|
|
110
|
+
if (this.virtualCache && now - this.virtualCache.fetchedAt < VIRTUAL_CACHE_TTL_MS) {
|
|
111
|
+
return this.virtualCache.entries;
|
|
112
|
+
}
|
|
113
|
+
const entries = await this.api.getBrowsers();
|
|
114
|
+
this.virtualCache = { entries, fetchedAt: now };
|
|
115
|
+
return entries;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function browserPlatform(entry) {
|
|
119
|
+
const name = entry.platformName?.toLowerCase();
|
|
120
|
+
if (name === 'ios')
|
|
121
|
+
return 'ios';
|
|
122
|
+
if (name === 'android')
|
|
123
|
+
return 'android';
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
/** Compare dotted version strings numerically ("16.0" > "9.1"). */
|
|
127
|
+
function compareVersions(a, b) {
|
|
128
|
+
const pa = a.split('.').map(Number);
|
|
129
|
+
const pb = b.split('.').map(Number);
|
|
130
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
131
|
+
const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
132
|
+
if (diff !== 0)
|
|
133
|
+
return diff;
|
|
134
|
+
}
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
137
|
+
function matches(device, criteria) {
|
|
138
|
+
if (criteria.platform && toPlatform(device) !== criteria.platform)
|
|
139
|
+
return false;
|
|
140
|
+
if (criteria.deviceNamePattern && !new RegExp(criteria.deviceNamePattern, 'i').test(device.name))
|
|
141
|
+
return false;
|
|
142
|
+
if (criteria.osVersion && !osVersionSatisfies(String(device.version), criteria.osVersion))
|
|
143
|
+
return false;
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
function toPlatform(device) {
|
|
147
|
+
return device.platform_name?.toLowerCase() === 'ios' ? 'ios' : 'android';
|
|
148
|
+
}
|
|
149
|
+
function describeCriteria(criteria) {
|
|
150
|
+
const parts = [];
|
|
151
|
+
if (criteria.platform)
|
|
152
|
+
parts.push(`platform=${criteria.platform}`);
|
|
153
|
+
if (criteria.deviceNamePattern)
|
|
154
|
+
parts.push(`name~/${criteria.deviceNamePattern}/`);
|
|
155
|
+
if (criteria.osVersion)
|
|
156
|
+
parts.push(`osVersion "${criteria.osVersion}"`);
|
|
157
|
+
return parts.length ? parts.join(', ') : 'any criteria';
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=device-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-catalog.js","sourceRoot":"","sources":["../src/device-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA2D,MAAM,wBAAwB,CAAC;AAIrH;6EAC6E;AAC7E,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B,0EAA0E;AAC1E,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAErC,MAAM,OAAO,aAAa;IACP,GAAG,CAAgB;IAC5B,KAAK,CAA4F;IACjG,YAAY,CAA6D;IAEjF,YAAY,GAAkB;QAC5B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,cAAc,CAAC,QAA4B,EAAE,SAA8B;QAC/E,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,qCAAqC,gBAAgB,CAAC,QAAQ,CAAC,IAAI;gBACnE,mEAAmE,CACpE,CAAC;QACJ,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,SAAS,GACb,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACtE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5C,QAAQ,CAAC,CAAC,CAAE,CAAC;QACf,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAChG,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,iBAAiB,CAAC,QAA4B;QAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACnC,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACpD,IAAI,eAAe,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAClD,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAC3D,4EAA4E;YAC5E,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC;gBAAE,OAAO,KAAK,CAAC;YACtD,IAAI,QAAQ,CAAC,iBAAiB,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChH,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC;gBAAE,OAAO,KAAK,CAAC;YACnG,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,iBAAiB,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,YAAY,gBAAgB,CAAC,QAAQ,CAAC,IAAI;gBACxG,wEAAwE,CACzE,CAAC;QACJ,CAAC;QACD,sDAAsD;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3G,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAW,EAAE,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC9F,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,iCAAiC,QAAQ,IAAI,CAAC,CAAC;QAClG,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC1F,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,WAAW,CAAC,QAAmB;QACnC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,OAAO,GAAG;aACP,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;aACtD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;YACvB,IAAI,EAAE,MAAe;YACrB,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,QAAkB,CAAC,CAAC,CAAE,SAAmB;YAC1E,KAAK,EAAE,CAAC,CAAC,YAAY;YACrB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;SAC7B,CAAC,CAAC,CAAC;IACR,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QACD,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,YAAY,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,oBAAoB,EAAE,CAAC;YAClF,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;QACnC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,SAAS,eAAe,CAAC,KAAmB;IAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC/C,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,mEAAmE;AACnE,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IAC3C,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,OAAO,CAAC,MAAwB,EAAE,QAA4B;IACrE,IAAI,QAAQ,CAAC,QAAQ,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAChF,IAAI,QAAQ,CAAC,iBAAiB,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/G,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACxG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,MAAwB;IAC1C,OAAO,MAAM,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,SAAS,gBAAgB,CAAC,QAA4B;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnE,IAAI,QAAQ,CAAC,iBAAiB;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,iBAAiB,GAAG,CAAC,CAAC;IACnF,IAAI,QAAQ,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;AAC1D,CAAC"}
|
package/dist/driver.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { type AllocatedDevice, type AllocationCriteria, type AppInfo, type ConnectionConfig, type DeviceInfo, type DeviceSettings, type GestureSequence, type HardwareButton, type LaunchOptions, type ListDevicesOptions, type MobilewrightDriver, type Orientation, type RecordingOptions, type RecordingResult, type ScreenSize, type ScreenshotOptions, type Session, type SwipeDirection, type SwipeOptions, type TestObserver, type ViewNode } from '@mobilewright/protocol';
|
|
2
|
+
import { type TestingBotDriverOptions } from './options.js';
|
|
3
|
+
import { AppiumWebViewBridge } from './webview.js';
|
|
4
|
+
/**
|
|
5
|
+
* Mobilewright driver for TestingBot's device cloud.
|
|
6
|
+
*
|
|
7
|
+
* The WebDriver session is the allocation: `allocate()` creates an Appium
|
|
8
|
+
* session on hub.testingbot.com and hands its UUID to the device pool as the
|
|
9
|
+
* deviceId; worker processes `connect()` to that UUID over plain stateless
|
|
10
|
+
* HTTP. `disconnect()` only detaches (the pool re-grants slots without
|
|
11
|
+
* re-allocating) — the session actually ends in `release()`/`dispose()`.
|
|
12
|
+
*/
|
|
13
|
+
export declare class TestingBotDriver implements MobilewrightDriver {
|
|
14
|
+
readonly observer: TestObserver | undefined;
|
|
15
|
+
/** WebView support via Appium contexts (its presence signals capability). */
|
|
16
|
+
readonly webViewBridge: AppiumWebViewBridge;
|
|
17
|
+
private readonly options;
|
|
18
|
+
private readonly hub;
|
|
19
|
+
private readonly api;
|
|
20
|
+
private readonly catalog;
|
|
21
|
+
private readonly storage;
|
|
22
|
+
private readonly keepalive;
|
|
23
|
+
private readonly runLog;
|
|
24
|
+
private readonly tunnel;
|
|
25
|
+
/** Sessions created by this instance's allocate() (coordinator process). */
|
|
26
|
+
private readonly allocated;
|
|
27
|
+
/** Every session ever allocated this run — release() does NOT remove
|
|
28
|
+
* entries, because the observer must report sessions the pool released
|
|
29
|
+
* before onRunEnd fires (which, with Playwright's teardown ordering, is
|
|
30
|
+
* all of them). */
|
|
31
|
+
private readonly everAllocated;
|
|
32
|
+
/** Refcount of real-device names pinned by in-flight/live allocations. */
|
|
33
|
+
private readonly pinCounts;
|
|
34
|
+
/** The session this instance is connected to (worker process). */
|
|
35
|
+
private active;
|
|
36
|
+
/** sessionPerTest: pool slots whose original session this instance has already probed/used. */
|
|
37
|
+
private readonly rotatedDeviceIds;
|
|
38
|
+
constructor(options?: TestingBotDriverOptions);
|
|
39
|
+
prepare(): Promise<void>;
|
|
40
|
+
allocate(criteria: AllocationCriteria, _takenDeviceIds: ReadonlySet<string>, signal?: AbortSignal): Promise<AllocatedDevice>;
|
|
41
|
+
release(deviceId: string): Promise<void>;
|
|
42
|
+
dispose(): Promise<void>;
|
|
43
|
+
connect(config: ConnectionConfig): Promise<Session>;
|
|
44
|
+
disconnect(): Promise<void>;
|
|
45
|
+
/** Create a new hub session for this slot from the connect() config. */
|
|
46
|
+
private startFreshSession;
|
|
47
|
+
/**
|
|
48
|
+
* Best-effort, fire-and-forget per the protocol: Android animation scales
|
|
49
|
+
* via `mobile: shell` (may be unavailable depending on TestingBot's Appium
|
|
50
|
+
* feature flags — failures are logged, never thrown); iOS has no equivalent.
|
|
51
|
+
*/
|
|
52
|
+
applyDeviceSettings(settings: DeviceSettings): Promise<void>;
|
|
53
|
+
getViewHierarchy(): Promise<ViewNode[]>;
|
|
54
|
+
tap(x: number, y: number): Promise<void>;
|
|
55
|
+
doubleTap(x: number, y: number): Promise<void>;
|
|
56
|
+
longPress(x: number, y: number, duration?: number): Promise<void>;
|
|
57
|
+
typeText(text: string): Promise<void>;
|
|
58
|
+
pressKeys(keys: string[]): Promise<void>;
|
|
59
|
+
clearText(): Promise<void>;
|
|
60
|
+
swipe(direction: SwipeDirection, opts?: SwipeOptions): Promise<void>;
|
|
61
|
+
gesture(gestures: GestureSequence): Promise<void>;
|
|
62
|
+
pressButton(button: HardwareButton): Promise<void>;
|
|
63
|
+
screenshot(opts?: ScreenshotOptions): Promise<Buffer>;
|
|
64
|
+
getScreenSize(): Promise<ScreenSize>;
|
|
65
|
+
getOrientation(): Promise<Orientation>;
|
|
66
|
+
setOrientation(orientation: Orientation): Promise<void>;
|
|
67
|
+
launchApp(bundleId: string, opts?: LaunchOptions): Promise<void>;
|
|
68
|
+
terminateApp(bundleId: string): Promise<void>;
|
|
69
|
+
listApps(): Promise<AppInfo[]>;
|
|
70
|
+
getForegroundApp(): Promise<AppInfo>;
|
|
71
|
+
installApp(path: string): Promise<void>;
|
|
72
|
+
uninstallApp(bundleId: string): Promise<void>;
|
|
73
|
+
listDevices(opts?: ListDevicesOptions): Promise<DeviceInfo[]>;
|
|
74
|
+
openUrl(url: string): Promise<void>;
|
|
75
|
+
startRecording(opts: RecordingOptions): Promise<void>;
|
|
76
|
+
stopRecording(): Promise<RecordingResult>;
|
|
77
|
+
private session;
|
|
78
|
+
private unpin;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"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"}
|