@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.
Files changed (87) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +211 -0
  3. package/dist/actions.d.ts +25 -0
  4. package/dist/actions.d.ts.map +1 -0
  5. package/dist/actions.js +76 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/app-storage.d.ts +20 -0
  8. package/dist/app-storage.d.ts.map +1 -0
  9. package/dist/app-storage.js +68 -0
  10. package/dist/app-storage.js.map +1 -0
  11. package/dist/capabilities.d.ts +27 -0
  12. package/dist/capabilities.d.ts.map +1 -0
  13. package/dist/capabilities.js +120 -0
  14. package/dist/capabilities.js.map +1 -0
  15. package/dist/ci.d.ts +8 -0
  16. package/dist/ci.d.ts.map +1 -0
  17. package/dist/ci.js +46 -0
  18. package/dist/ci.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +43 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/device-catalog.d.ts +37 -0
  24. package/dist/device-catalog.d.ts.map +1 -0
  25. package/dist/device-catalog.js +159 -0
  26. package/dist/device-catalog.js.map +1 -0
  27. package/dist/driver.d.ts +80 -0
  28. package/dist/driver.d.ts.map +1 -0
  29. package/dist/driver.js +646 -0
  30. package/dist/driver.js.map +1 -0
  31. package/dist/errors.d.ts +41 -0
  32. package/dist/errors.d.ts.map +1 -0
  33. package/dist/errors.js +104 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/hierarchy.d.ts +10 -0
  36. package/dist/hierarchy.d.ts.map +1 -0
  37. package/dist/hierarchy.js +103 -0
  38. package/dist/hierarchy.js.map +1 -0
  39. package/dist/index.d.ts +4 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +3 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/init.d.ts +19 -0
  44. package/dist/init.d.ts.map +1 -0
  45. package/dist/init.js +108 -0
  46. package/dist/init.js.map +1 -0
  47. package/dist/keepalive.d.ts +16 -0
  48. package/dist/keepalive.d.ts.map +1 -0
  49. package/dist/keepalive.js +56 -0
  50. package/dist/keepalive.js.map +1 -0
  51. package/dist/keys.d.ts +32 -0
  52. package/dist/keys.d.ts.map +1 -0
  53. package/dist/keys.js +117 -0
  54. package/dist/keys.js.map +1 -0
  55. package/dist/observer.d.ts +55 -0
  56. package/dist/observer.d.ts.map +1 -0
  57. package/dist/observer.js +148 -0
  58. package/dist/observer.js.map +1 -0
  59. package/dist/options.d.ts +154 -0
  60. package/dist/options.d.ts.map +1 -0
  61. package/dist/options.js +49 -0
  62. package/dist/options.js.map +1 -0
  63. package/dist/rest-api.d.ts +67 -0
  64. package/dist/rest-api.d.ts.map +1 -0
  65. package/dist/rest-api.js +117 -0
  66. package/dist/rest-api.js.map +1 -0
  67. package/dist/run-log.d.ts +56 -0
  68. package/dist/run-log.d.ts.map +1 -0
  69. package/dist/run-log.js +72 -0
  70. package/dist/run-log.js.map +1 -0
  71. package/dist/tunnel.d.ts +13 -0
  72. package/dist/tunnel.d.ts.map +1 -0
  73. package/dist/tunnel.js +47 -0
  74. package/dist/tunnel.js.map +1 -0
  75. package/dist/version.d.ts +4 -0
  76. package/dist/version.d.ts.map +1 -0
  77. package/dist/version.js +7 -0
  78. package/dist/version.js.map +1 -0
  79. package/dist/webdriver-client.d.ts +43 -0
  80. package/dist/webdriver-client.d.ts.map +1 -0
  81. package/dist/webdriver-client.js +109 -0
  82. package/dist/webdriver-client.js.map +1 -0
  83. package/dist/webview.d.ts +16 -0
  84. package/dist/webview.d.ts.map +1 -0
  85. package/dist/webview.js +109 -0
  86. package/dist/webview.js.map +1 -0
  87. package/package.json +69 -0
@@ -0,0 +1,109 @@
1
+ import createDebug from 'debug';
2
+ const debug = createDebug('testingbot:webview');
3
+ const NATIVE_CONTEXT = 'NATIVE_APP';
4
+ /**
5
+ * WebView support over Appium's context API. Attaching switches the ONE
6
+ * WebDriver context the session has — native commands issued while a webview
7
+ * session is open target the web layer, which is also how the reference
8
+ * drivers behave. close() switches back to the native context.
9
+ */
10
+ export class AppiumWebViewBridge {
11
+ hub;
12
+ sessionId;
13
+ constructor(hub, sessionId) {
14
+ this.hub = hub;
15
+ this.sessionId = sessionId;
16
+ }
17
+ async listWebViews() {
18
+ const sessionId = this.sessionId();
19
+ // `mobile: getContexts` is richer (title/url) but not uniform across
20
+ // drivers; fall back to the plain context list (names only).
21
+ let entries;
22
+ try {
23
+ entries = await this.hub.execute(sessionId, 'mobile: getContexts', []);
24
+ }
25
+ catch {
26
+ entries = await this.hub.get(sessionId, '/contexts');
27
+ }
28
+ return entries
29
+ .map((entry) => normalizeContext(entry))
30
+ .filter((info) => info !== undefined && info.id !== NATIVE_CONTEXT);
31
+ }
32
+ async attachWebView(id) {
33
+ const sessionId = this.sessionId();
34
+ await this.hub.post(sessionId, '/context', { name: id });
35
+ debug('attached to %s', id);
36
+ return new AppiumWebViewSession(this.hub, sessionId, id);
37
+ }
38
+ }
39
+ class AppiumWebViewSession {
40
+ hub;
41
+ sessionId;
42
+ contextId;
43
+ constructor(hub, sessionId, contextId) {
44
+ this.hub = hub;
45
+ this.sessionId = sessionId;
46
+ this.contextId = contextId;
47
+ }
48
+ async evaluate(expr) {
49
+ return await this.hub.execute(this.sessionId, `return (${expr});`, []);
50
+ }
51
+ async goto(url) {
52
+ await this.hub.post(this.sessionId, '/url', { url });
53
+ }
54
+ async goBack() {
55
+ await this.hub.post(this.sessionId, '/back', {});
56
+ }
57
+ async goForward() {
58
+ await this.hub.post(this.sessionId, '/forward', {});
59
+ }
60
+ async url() {
61
+ return await this.hub.get(this.sessionId, '/url');
62
+ }
63
+ async title() {
64
+ return await this.hub.get(this.sessionId, '/title');
65
+ }
66
+ async reload() {
67
+ await this.hub.post(this.sessionId, '/refresh', {});
68
+ }
69
+ async waitForLoadState(state = 'load') {
70
+ const acceptable = state === 'load' ? ['complete'] : ['interactive', 'complete'];
71
+ const deadline = Date.now() + 30_000;
72
+ for (;;) {
73
+ const readyState = await this.evaluate('document.readyState').catch(() => '');
74
+ if (acceptable.includes(readyState))
75
+ return;
76
+ if (Date.now() >= deadline) {
77
+ throw new Error(`TestingBotDriver: webview ${this.contextId} did not reach "${state}" within 30s`);
78
+ }
79
+ await new Promise((resolve) => setTimeout(resolve, 250));
80
+ }
81
+ }
82
+ async close() {
83
+ await this.hub.post(this.sessionId, '/context', { name: NATIVE_CONTEXT });
84
+ debug('detached from %s', this.contextId);
85
+ }
86
+ }
87
+ /** Contexts arrive as plain names or driver-specific objects. */
88
+ function normalizeContext(entry) {
89
+ if (typeof entry === 'string') {
90
+ return { id: entry, url: '', title: '' };
91
+ }
92
+ if (entry && typeof entry === 'object') {
93
+ const record = entry;
94
+ const pages = Array.isArray(record['pages']) ? record['pages'] : [];
95
+ const id = str(record['id']) ?? str(record['name']) ?? str(record['webviewName']);
96
+ if (!id)
97
+ return undefined;
98
+ return {
99
+ id,
100
+ url: str(record['url']) ?? str(pages[0]?.['url']) ?? '',
101
+ title: str(record['title']) ?? str(pages[0]?.['title']) ?? '',
102
+ };
103
+ }
104
+ return undefined;
105
+ }
106
+ function str(value) {
107
+ return typeof value === 'string' && value ? value : undefined;
108
+ }
109
+ //# sourceMappingURL=webview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webview.js","sourceRoot":"","sources":["../src/webview.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@testingbot/mobilewright-driver",
3
+ "version": "0.1.0",
4
+ "description": "TestingBot driver for Mobilewright — run mobilewright tests on TestingBot's device cloud",
5
+ "homepage": "https://testingbot.com",
6
+ "license": "Apache-2.0",
7
+ "engines": {
8
+ "node": ">=18"
9
+ },
10
+ "type": "module",
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ }
18
+ },
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.build.json",
21
+ "typecheck": "tsc --noEmit",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest",
24
+ "prepublishOnly": "npm run build"
25
+ },
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/testingbot/mobilewright-testingbot.git"
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "keywords": [
34
+ "mobilewright",
35
+ "testingbot",
36
+ "appium",
37
+ "webdriver",
38
+ "mobile",
39
+ "testing",
40
+ "ios",
41
+ "android"
42
+ ],
43
+ "peerDependencies": {
44
+ "@mobilewright/protocol": ">=0.0.53 <0.1.0",
45
+ "testingbot-tunnel-launcher": ">=1.1.0"
46
+ },
47
+ "dependencies": {
48
+ "debug": "^4.4.0",
49
+ "fast-xml-parser": "^5.11.0"
50
+ },
51
+ "devDependencies": {
52
+ "@mobilewright/protocol": "0.0.53",
53
+ "@types/debug": "^4.1.12",
54
+ "@types/node": "^20.17.0",
55
+ "typescript": "^5.6.0",
56
+ "vitest": "^4.1.10"
57
+ },
58
+ "peerDependenciesMeta": {
59
+ "testingbot-tunnel-launcher": {
60
+ "optional": true
61
+ }
62
+ },
63
+ "bin": {
64
+ "mobilewright-driver": "dist/cli.js"
65
+ },
66
+ "publishConfig": {
67
+ "access": "public"
68
+ }
69
+ }