@taqwright/taqwright 0.0.24

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 (132) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +108 -0
  3. package/dist/auto-appium.d.ts +12 -0
  4. package/dist/auto-appium.js +77 -0
  5. package/dist/bin/branding.d.ts +6 -0
  6. package/dist/bin/branding.js +22 -0
  7. package/dist/bin/index.d.ts +2 -0
  8. package/dist/bin/index.js +321 -0
  9. package/dist/bin/init.d.ts +26 -0
  10. package/dist/bin/init.js +902 -0
  11. package/dist/bin/inspect.d.ts +9 -0
  12. package/dist/bin/inspect.js +91 -0
  13. package/dist/bin/report-branding.d.ts +2 -0
  14. package/dist/bin/report-branding.js +42 -0
  15. package/dist/branding-assets.d.ts +1 -0
  16. package/dist/branding-assets.js +1 -0
  17. package/dist/capabilities-helpers.d.ts +7 -0
  18. package/dist/capabilities-helpers.js +14 -0
  19. package/dist/capabilities.d.ts +6 -0
  20. package/dist/capabilities.js +86 -0
  21. package/dist/config.d.ts +17 -0
  22. package/dist/config.js +235 -0
  23. package/dist/discovery-setup.d.ts +1 -0
  24. package/dist/discovery-setup.js +61 -0
  25. package/dist/discovery.d.ts +17 -0
  26. package/dist/discovery.js +55 -0
  27. package/dist/docs/configuration.html +376 -0
  28. package/dist/docs/custom-reporters.html +265 -0
  29. package/dist/docs/docker.html +339 -0
  30. package/dist/docs/docs.js +173 -0
  31. package/dist/docs/generating-tests.html +161 -0
  32. package/dist/docs/images/taqwright-html-report.png +0 -0
  33. package/dist/docs/index.html +13 -0
  34. package/dist/docs/installation.html +686 -0
  35. package/dist/docs/parallel.html +271 -0
  36. package/dist/docs/running-tests.html +385 -0
  37. package/dist/docs/styles.css +460 -0
  38. package/dist/docs/writing-tests.html +565 -0
  39. package/dist/doctor.d.ts +33 -0
  40. package/dist/doctor.js +508 -0
  41. package/dist/expect.d.ts +38 -0
  42. package/dist/expect.js +96 -0
  43. package/dist/fixture/artifact-mode.d.ts +2 -0
  44. package/dist/fixture/artifact-mode.js +7 -0
  45. package/dist/fixture/index.d.ts +15 -0
  46. package/dist/fixture/index.js +324 -0
  47. package/dist/images/taqwright-html-report.png +0 -0
  48. package/dist/images/taqwright_favicon.png +0 -0
  49. package/dist/images/taqwright_logo.png +0 -0
  50. package/dist/index.d.ts +9 -0
  51. package/dist/index.js +7 -0
  52. package/dist/inspector/codegen-appium.d.ts +3 -0
  53. package/dist/inspector/codegen-appium.js +228 -0
  54. package/dist/inspector/devices.d.ts +41 -0
  55. package/dist/inspector/devices.js +422 -0
  56. package/dist/inspector/locator-suggester.d.ts +23 -0
  57. package/dist/inspector/locator-suggester.js +539 -0
  58. package/dist/inspector/recorder.d.ts +128 -0
  59. package/dist/inspector/recorder.js +162 -0
  60. package/dist/inspector/server.d.ts +39 -0
  61. package/dist/inspector/server.js +1210 -0
  62. package/dist/inspector/session.d.ts +84 -0
  63. package/dist/inspector/session.js +262 -0
  64. package/dist/inspector/ui.d.ts +1 -0
  65. package/dist/inspector/ui.js +5508 -0
  66. package/dist/keys.d.ts +3 -0
  67. package/dist/keys.js +28 -0
  68. package/dist/locator/index.d.ts +206 -0
  69. package/dist/locator/index.js +1506 -0
  70. package/dist/logger.d.ts +5 -0
  71. package/dist/logger.js +5 -0
  72. package/dist/mobile/index.d.ts +130 -0
  73. package/dist/mobile/index.js +762 -0
  74. package/dist/network/android.d.ts +5 -0
  75. package/dist/network/android.js +87 -0
  76. package/dist/network/ca.d.ts +10 -0
  77. package/dist/network/ca.js +136 -0
  78. package/dist/network/har.d.ts +90 -0
  79. package/dist/network/har.js +101 -0
  80. package/dist/network/host-proxy.d.ts +16 -0
  81. package/dist/network/host-proxy.js +134 -0
  82. package/dist/network/index.d.ts +26 -0
  83. package/dist/network/index.js +105 -0
  84. package/dist/network/ios-sim.d.ts +3 -0
  85. package/dist/network/ios-sim.js +29 -0
  86. package/dist/network/proxy.d.ts +13 -0
  87. package/dist/network/proxy.js +310 -0
  88. package/dist/providers/appium.d.ts +23 -0
  89. package/dist/providers/appium.js +288 -0
  90. package/dist/providers/browserstack/index.d.ts +5 -0
  91. package/dist/providers/browserstack/index.js +77 -0
  92. package/dist/providers/browserstack/utils.d.ts +1 -0
  93. package/dist/providers/browserstack/utils.js +6 -0
  94. package/dist/providers/cloud.d.ts +53 -0
  95. package/dist/providers/cloud.js +117 -0
  96. package/dist/providers/emulator/index.d.ts +8 -0
  97. package/dist/providers/emulator/index.js +47 -0
  98. package/dist/providers/index.d.ts +10 -0
  99. package/dist/providers/index.js +33 -0
  100. package/dist/providers/lambdatest/index.d.ts +28 -0
  101. package/dist/providers/lambdatest/index.js +99 -0
  102. package/dist/providers/lambdatest/utils.d.ts +1 -0
  103. package/dist/providers/lambdatest/utils.js +6 -0
  104. package/dist/providers/local/index.d.ts +9 -0
  105. package/dist/providers/local/index.js +53 -0
  106. package/dist/providers/local-session.d.ts +16 -0
  107. package/dist/providers/local-session.js +55 -0
  108. package/dist/setup/archive.d.ts +2 -0
  109. package/dist/setup/archive.js +43 -0
  110. package/dist/setup/avd.d.ts +12 -0
  111. package/dist/setup/avd.js +103 -0
  112. package/dist/setup/index.d.ts +6 -0
  113. package/dist/setup/index.js +55 -0
  114. package/dist/setup/install-android.d.ts +2 -0
  115. package/dist/setup/install-android.js +70 -0
  116. package/dist/setup/install-appium.d.ts +1 -0
  117. package/dist/setup/install-appium.js +64 -0
  118. package/dist/setup/install-jdk.d.ts +1 -0
  119. package/dist/setup/install-jdk.js +58 -0
  120. package/dist/setup/paths.d.ts +16 -0
  121. package/dist/setup/paths.js +88 -0
  122. package/dist/setup/spawn-tool.d.ts +3 -0
  123. package/dist/setup/spawn-tool.js +11 -0
  124. package/dist/tracer/index.d.ts +34 -0
  125. package/dist/tracer/index.js +687 -0
  126. package/dist/tracer/proxy.d.ts +3 -0
  127. package/dist/tracer/proxy.js +60 -0
  128. package/dist/types/index.d.ts +189 -0
  129. package/dist/types/index.js +6 -0
  130. package/dist/utils.d.ts +2 -0
  131. package/dist/utils.js +37 -0
  132. package/package.json +79 -0
@@ -0,0 +1,271 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Parallel runs · taqwright</title>
7
+ <meta name="description" content="Run taqwright tests in parallel — device pools, worker partitioning, the workers × fullyParallel × pool matrix, and BrowserStack / LambdaTest.">
8
+ <link rel="stylesheet" href="styles.css">
9
+ <script>try{var t=localStorage.getItem('tw-theme');if(t==='light'||(!t&&typeof matchMedia==='function'&&matchMedia('(prefers-color-scheme: light)').matches))document.documentElement.setAttribute('data-theme','light');}catch(e){}</script>
10
+ </head>
11
+ <body>
12
+
13
+ <header class="topbar">
14
+ <button class="menu-toggle" id="menu-toggle" aria-label="Toggle navigation">☰</button>
15
+ <a class="brand" href="installation.html"><span class="accent">taq</span>wright</a>
16
+ <nav class="primary">
17
+ <a href="installation.html" class="current">Docs</a>
18
+ <a href="generating-tests.html">Inspector</a>
19
+ <a href="writing-tests.html#actions">API</a>
20
+ </nav>
21
+ <span class="spacer"></span>
22
+ <div class="search" title="Search (placeholder)">
23
+ <span>Search docs…</span>
24
+ <span class="kbd">⌘K</span>
25
+ </div>
26
+ <button class="theme-toggle" id="theme-toggle" aria-label="Switch to light theme" title="Switch to light theme"></button>
27
+ <a class="gh-link" href="https://github.com/taqelah/taqwright" title="GitHub">
28
+ <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 .5a11.5 11.5 0 0 0-3.64 22.42c.58.1.79-.25.79-.55v-2.02c-3.2.7-3.88-1.36-3.88-1.36-.52-1.33-1.28-1.68-1.28-1.68-1.05-.71.08-.7.08-.7 1.16.08 1.77 1.19 1.77 1.19 1.03 1.77 2.7 1.26 3.36.96.1-.75.4-1.26.73-1.55-2.55-.29-5.24-1.28-5.24-5.7 0-1.26.45-2.29 1.19-3.1-.12-.29-.52-1.47.11-3.06 0 0 .97-.31 3.18 1.18a11 11 0 0 1 5.79 0c2.21-1.49 3.18-1.18 3.18-1.18.63 1.59.23 2.77.11 3.06.74.81 1.18 1.84 1.18 3.1 0 4.43-2.7 5.4-5.27 5.69.41.36.78 1.06.78 2.14v3.17c0 .31.21.66.8.55A11.5 11.5 0 0 0 12 .5Z"/></svg>
29
+ </a>
30
+ </header>
31
+
32
+ <div class="shell">
33
+
34
+ <aside class="sidebar" id="sidebar">
35
+ <h3>Getting started</h3>
36
+ <ul>
37
+ <li><a href="installation.html">Installation</a></li>
38
+ <li><a href="writing-tests.html">Writing tests</a></li>
39
+ <li><a href="generating-tests.html">Generating tests</a></li>
40
+ <li><a href="running-tests.html">Running &amp; debugging</a></li>
41
+ <li><a href="custom-reporters.html">Custom reporters</a></li>
42
+ <li><a href="parallel.html" class="current">Parallel runs</a></li>
43
+ <li class="sub"><a href="parallel.html#parallel">Device pools</a></li>
44
+ <li class="sub"><a href="parallel.html#parallel-combos">The matrix</a></li>
45
+ <li class="sub"><a href="parallel.html#parallel-cloud">On the cloud</a></li>
46
+ <li><a href="docker.html">Run in Docker</a></li>
47
+ </ul>
48
+
49
+ <h3>Taqwright Test</h3>
50
+ <ul>
51
+ <li><a href="configuration.html">Configuration</a></li>
52
+ </ul>
53
+
54
+ <h3>Reference</h3>
55
+ <ul>
56
+ <li><a href="https://playwright.dev/docs/intro">Playwright runner ↗</a></li>
57
+ <li><a href="https://appium.io/docs/en/latest/">Appium 3 ↗</a></li>
58
+ </ul>
59
+ </aside>
60
+
61
+ <main>
62
+
63
+ <div class="breadcrumb">
64
+ <a href="installation.html">Docs</a> / Getting started / Parallel runs
65
+ </div>
66
+
67
+ <h1>Parallel runs</h1>
68
+ <p class="lede">
69
+ Taqwright is <strong>serial by default</strong> — one Appium, one device. To go parallel you either declare a local <strong>device pool</strong> and raise <code>workers</code>, or point at a cloud provider where each worker is its own independent session.
70
+ </p>
71
+
72
+ <h2 id="parallel">Device pools</h2>
73
+ <p>
74
+ Taqwright defaults to <code>workers: 1</code> — one Appium + one device, serial. To run tests truly in parallel against multiple devices, declare a <strong>device pool</strong> and bump <code>workers</code>:
75
+ </p>
76
+
77
+ <div class="codeblock">
78
+ <div class="filename">taqwright.config.ts</div>
79
+ <pre class="code"><button class="copy">Copy</button><code>import { defineConfig, Platform } from 'taqwright';
80
+
81
+ export default defineConfig({
82
+ workers: 3,
83
+ fullyParallel: true,
84
+ projects: [{
85
+ name: 'android-parallel',
86
+ use: {
87
+ platform: Platform.ANDROID,
88
+ device: {
89
+ provider: 'emulator',
90
+ pool: [
91
+ { udid: 'emulator-5554', name: 'Pixel_7_API_34' },
92
+ { udid: 'emulator-5556', name: 'Pixel_7_API_34_2' },
93
+ { udid: 'emulator-5558', name: 'Pixel_7_API_34_3' },
94
+ ],
95
+ },
96
+ buildPath: './app.apk',
97
+ appBundleId: 'com.example.app',
98
+ appium: { autoStart: true, port: 4723 },
99
+ },
100
+ }],
101
+ });</code></pre>
102
+ </div>
103
+
104
+ <p>How worker partitioning works:</p>
105
+ <ul>
106
+ <li>Worker <code>N</code> picks <code>pool[N]</code>. Worker <code>N</code> where <code>N &gt;= pool.length</code> fails fast with a clear error — never silently double-books a device.</li>
107
+ <li>Each worker spawns its own Appium on <code>basePort + N</code> when <code>appium.autoStart: true</code>, and kills it when the worker tears down.</li>
108
+ <li>Driver-specific ports (<code>appium:systemPort</code>, <code>appium:wdaLocalPort</code>, <code>appium:chromedriverPort</code>, <code>appium:mjpegServerPort</code>) are auto-staggered per worker so two UiAutomator2 / XCUITest sessions don't fight over the same port.</li>
109
+ </ul>
110
+
111
+ <p>For iOS, the WDA / MJPEG port + DerivedData staggering is handled by <a href="configuration.html#ios-parallel-caps"><code>iosParallelCaps()</code></a> — one slot per separate iOS <em>project</em>; pool-driven parallelism within a single iOS project is auto-staggered per worker.</p>
112
+
113
+ <h3 id="parallel-combos"><code>workers</code> × <code>fullyParallel</code> × <code>device.pool</code> — what happens</h3>
114
+ <p>
115
+ <code>fullyParallel</code> only changes Playwright's <em>scheduling granularity</em> (tests-within-a-file vs whole-files per worker) — it never raises the concurrent-device count, which is bounded by <code>workers</code>. So the only thing that risks device contention is <code>workers&nbsp;&gt;&nbsp;1</code>, and that's now caught at <strong>config load</strong>.
116
+ </p>
117
+ <table class="api">
118
+ <thead><tr><th><code>workers</code></th><th><code>fullyParallel</code></th><th><code>device.pool</code></th><th>Result</th><th>What to do</th></tr></thead>
119
+ <tbody>
120
+ <tr>
121
+ <td><code>1</code> (default)</td><td><code>false</code> (default)</td><td>none</td>
122
+ <td><strong>Safe.</strong> Serial — one Appium + one device, one test at a time.</td>
123
+ <td>Nothing — this is the default.</td>
124
+ </tr>
125
+ <tr>
126
+ <td><code>1</code></td><td><code>true</code></td><td>none</td>
127
+ <td><strong>Safe.</strong> Still serial (one worker). <code>fullyParallel</code> only re-orders the schedule; nothing runs concurrently.</td>
128
+ <td>Harmless; it has no real effect with one worker. Leave it or drop it.</td>
129
+ </tr>
130
+ <tr>
131
+ <td><code>&gt; 1</code></td><td>any</td><td><strong>none</strong></td>
132
+ <td><strong>Rejected at config load.</strong> <code>defineConfig</code> throws; <code>taqwright&nbsp;test</code> aborts before any Appium/device work (no silent collision).</td>
133
+ <td>Add a <code>device.pool</code> with at least <code>workers</code> entries, <em>or</em> set <code>workers:&nbsp;1</code>.</td>
134
+ </tr>
135
+ <tr>
136
+ <td><code>&gt; 1</code></td><td>any</td><td>pool, <code>length &lt; workers</code></td>
137
+ <td><strong>Rejected at config load.</strong> Under-sized pool — some workers would have no device.</td>
138
+ <td>Grow the pool to at least <code>workers</code> entries, <em>or</em> lower <code>workers</code>.</td>
139
+ </tr>
140
+ <tr>
141
+ <td><code>&gt; 1</code></td><td><code>true</code></td><td>pool, <code>length &gt;= workers</code></td>
142
+ <td><strong>Correct parallel.</strong> Each worker gets <code>pool[idx]</code> + its own Appium + staggered driver ports; every test fans out across the pool.</td>
143
+ <td>This is the intended parallel setup.</td>
144
+ </tr>
145
+ <tr>
146
+ <td><code>&gt; 1</code></td><td><code>false</code></td><td>pool, <code>length &gt;= workers</code></td>
147
+ <td><strong>Parallel across files only.</strong> Workers run different files concurrently; tests within a file stay sequential.</td>
148
+ <td>Fine for file-level parallelism. Set <code>fullyParallel:&nbsp;true</code> to also distribute tests <em>within</em> a file.</td>
149
+ </tr>
150
+ </tbody>
151
+ </table>
152
+ <p>
153
+ <strong>Cloud exemption:</strong> <code>browserstack</code> / <code>lambdatest</code> projects have no <code>device.pool</code> (the field doesn't exist on their type) and the provider manages its own device queueing, so the config-load check skips them — <code>workers&nbsp;&gt;&nbsp;1</code> is not rejected for a cloud-only project.
154
+ </p>
155
+
156
+ <div class="callout warn">
157
+ <strong>Don't run multiple workers against one device.</strong>
158
+ Without an adequately sized pool, <code>workers &gt; 1</code> is rejected with a clear error at config load — <code>taqwright test</code> aborts before any device work, rather than letting multiple workers collide on one Appium session. Either set <code>workers: 1</code>, or declare a <code>device.pool</code> with at least <code>workers</code> entries.
159
+ </div>
160
+
161
+ <h3 id="parallel-cloud">Parallel runs on BrowserStack / LambdaTest</h3>
162
+ <p>
163
+ Cloud providers need <strong>no <code>device.pool</code></strong>. Each Playwright worker is its own OS process and opens its own independent cloud session, so parallelism is plain <code>workers: N</code> + <code>fullyParallel: true</code> — the provider queues device contention on its side. The config-load pool check skips cloud-only projects, so <code>workers&nbsp;&gt;&nbsp;1</code> is never rejected for them.
164
+ </p>
165
+
166
+ <div class="codeblock">
167
+ <div class="filename">taqwright.config.ts</div>
168
+ <pre class="code"><button class="copy">Copy</button><code>import { defineConfig, Platform } from 'taqwright';
169
+
170
+ export default defineConfig({
171
+ workers: 5, // 5 parallel cloud sessions — no device.pool
172
+ fullyParallel: true, // defineConfig defaults to false (serial)
173
+ projects: [{
174
+ name: 'browserstack',
175
+ use: {
176
+ platform: Platform.ANDROID,
177
+ device: {
178
+ provider: 'browserstack', // or 'lambdatest'
179
+ name: 'Google Pixel 8',
180
+ osVersion: '14.0',
181
+ orientation: 'portrait', // optional
182
+ },
183
+ buildPath: 'bs://&lt;hashed-app-id&gt;', // pre-uploaded; see note below
184
+ appBundleId: 'com.example.app', // required for LambdaTest
185
+ trace: 'on-failure',
186
+ video: 'off', // cloud records server-side
187
+ },
188
+ }],
189
+ });</code></pre>
190
+ </div>
191
+
192
+ <div class="codeblock"><pre class="code"><button class="copy">Copy</button><code>export BROWSERSTACK_USERNAME=... # or LAMBDATEST_USERNAME
193
+ export BROWSERSTACK_ACCESS_KEY=... # or LAMBDATEST_ACCESS_KEY
194
+
195
+ npx taqwright test --project browserstack --workers 5</code></pre></div>
196
+
197
+ <ul>
198
+ <li><strong>Parallelism is <code>workers: N</code>, nothing else.</strong> No <code>device.pool</code>, no per-worker Appium, no driver-port staggering — that machinery is local-only. One worker = one cloud session; pass/fail is pushed to the provider dashboard on teardown so sessions don't sit &quot;Running&quot; until idle-timeout.</li>
199
+ <li><strong>Credentials come from the environment</strong> (<code>BROWSERSTACK_USERNAME</code>/<code>BROWSERSTACK_ACCESS_KEY</code>, or <code>LAMBDATEST_USERNAME</code>/<code>LAMBDATEST_ACCESS_KEY</code>) — never in the config. Missing creds fail the worker fast with the provider's own message, before any session opens.</li>
200
+ <li><strong><code>--workers N</code> overrides the config value</strong> for that run, so you can dial parallelism per-run without editing the config.</li>
201
+ <li><strong>Video</strong> is recorded server-side and viewed on the provider dashboard — taqwright attaches no mp4 for cloud runs. <strong>Trace</strong> still works and lands in the HTML report.</li>
202
+ <li><strong><code>resetBetweenTests</code></strong> still type-requires <code>buildPath</code>&nbsp;+&nbsp;<code>appBundleId</code>, but the on-device terminate/reinstall dance is skipped — the build lives in the cloud. Isolation comes from a fresh session per test plus the provider's own reset.</li>
203
+ </ul>
204
+
205
+ <div class="callout">
206
+ <strong>Two cloud gotchas.</strong>
207
+ <strong>(1)</strong> Bound <code>workers</code> to your provider plan's parallel-session limit — extra workers just block waiting for a free slot.
208
+ <strong>(2)</strong> The build upload runs <em>once per worker process</em> and the cached URL doesn't cross worker boundaries, so a local <code>.apk</code>/<code>.ipa</code> in <code>buildPath</code> is uploaded <code>N</code> times for <code>N</code> workers. Pre-upload once and reference the returned <code>bs://</code> / <code>lt://</code> URL (as above) — that path skips the upload entirely.
209
+ </div>
210
+
211
+ <div class="pager">
212
+ <a href="custom-reporters.html">
213
+ <div class="label">← Previous</div>
214
+ <div class="title">Custom reporters</div>
215
+ </a>
216
+ <a class="next" href="docker.html">
217
+ <div class="label">Next →</div>
218
+ <div class="title">Run in Docker</div>
219
+ </a>
220
+ </div>
221
+
222
+ </main>
223
+
224
+ <aside class="onthispage">
225
+ <h4>On this page</h4>
226
+ <ol>
227
+ <li><a href="#parallel">Device pools</a></li>
228
+ <li><a href="#parallel-combos">The matrix</a></li>
229
+ <li><a href="#parallel-cloud">On the cloud</a></li>
230
+ </ol>
231
+ </aside>
232
+
233
+ </div>
234
+
235
+ <footer class="bot">
236
+ <div class="cols">
237
+ <div>
238
+ <h5>Getting started</h5>
239
+ <ul>
240
+ <li><a href="installation.html">Installation</a></li>
241
+ <li><a href="writing-tests.html">Writing tests</a></li>
242
+ <li><a href="generating-tests.html">Generating tests</a></li>
243
+ <li><a href="running-tests.html">Running &amp; debugging</a></li>
244
+ </ul>
245
+ </div>
246
+ <div>
247
+ <h5>Guides</h5>
248
+ <ul>
249
+ <li><a href="custom-reporters.html">Custom reporters</a></li>
250
+ <li><a href="parallel.html">Parallel runs</a></li>
251
+ <li><a href="docker.html">Run in Docker</a></li>
252
+ <li><a href="writing-tests.html#actions">API surface</a></li>
253
+ </ul>
254
+ </div>
255
+ <div>
256
+ <h5>Built on</h5>
257
+ <ul>
258
+ <li><a href="https://playwright.dev/">Playwright</a></li>
259
+ <li><a href="https://appium.io/">Appium 3</a></li>
260
+ </ul>
261
+ </div>
262
+ </div>
263
+ <div class="copy">
264
+ Apache-2.0 licensed · Built on Playwright + Appium
265
+ </div>
266
+ </footer>
267
+
268
+ <script src="docs.js"></script>
269
+
270
+ </body>
271
+ </html>