@arcadialdev/arcality 2.2.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/.agents/skills/e2e-testing-expert/SKILL.md +28 -0
- package/.agents/skills/frontend-design/LICENSE.txt +177 -0
- package/.agents/skills/frontend-design/SKILL.md +42 -0
- package/.agents/skills/nodejs-backend-patterns/SKILL.md +639 -0
- package/.agents/skills/nodejs-backend-patterns/references/advanced-patterns.md +430 -0
- package/.agents/skills/playwright-best-practices/LICENSE.md +7 -0
- package/.agents/skills/playwright-best-practices/README.md +147 -0
- package/.agents/skills/playwright-best-practices/SKILL.md +303 -0
- package/.agents/skills/playwright-best-practices/advanced/authentication-flows.md +360 -0
- package/.agents/skills/playwright-best-practices/advanced/authentication.md +871 -0
- package/.agents/skills/playwright-best-practices/advanced/clock-mocking.md +364 -0
- package/.agents/skills/playwright-best-practices/advanced/mobile-testing.md +409 -0
- package/.agents/skills/playwright-best-practices/advanced/multi-context.md +288 -0
- package/.agents/skills/playwright-best-practices/advanced/multi-user.md +393 -0
- package/.agents/skills/playwright-best-practices/advanced/network-advanced.md +452 -0
- package/.agents/skills/playwright-best-practices/advanced/third-party.md +464 -0
- package/.agents/skills/playwright-best-practices/architecture/pom-vs-fixtures.md +363 -0
- package/.agents/skills/playwright-best-practices/architecture/test-architecture.md +369 -0
- package/.agents/skills/playwright-best-practices/architecture/when-to-mock.md +383 -0
- package/.agents/skills/playwright-best-practices/browser-apis/browser-apis.md +391 -0
- package/.agents/skills/playwright-best-practices/browser-apis/iframes.md +403 -0
- package/.agents/skills/playwright-best-practices/browser-apis/service-workers.md +504 -0
- package/.agents/skills/playwright-best-practices/browser-apis/websockets.md +403 -0
- package/.agents/skills/playwright-best-practices/core/annotations.md +424 -0
- package/.agents/skills/playwright-best-practices/core/assertions-waiting.md +361 -0
- package/.agents/skills/playwright-best-practices/core/configuration.md +452 -0
- package/.agents/skills/playwright-best-practices/core/fixtures-hooks.md +417 -0
- package/.agents/skills/playwright-best-practices/core/global-setup.md +434 -0
- package/.agents/skills/playwright-best-practices/core/locators.md +242 -0
- package/.agents/skills/playwright-best-practices/core/page-object-model.md +315 -0
- package/.agents/skills/playwright-best-practices/core/projects-dependencies.md +453 -0
- package/.agents/skills/playwright-best-practices/core/test-data.md +492 -0
- package/.agents/skills/playwright-best-practices/core/test-suite-structure.md +361 -0
- package/.agents/skills/playwright-best-practices/core/test-tags.md +298 -0
- package/.agents/skills/playwright-best-practices/debugging/console-errors.md +420 -0
- package/.agents/skills/playwright-best-practices/debugging/debugging.md +504 -0
- package/.agents/skills/playwright-best-practices/debugging/error-testing.md +360 -0
- package/.agents/skills/playwright-best-practices/debugging/flaky-tests.md +496 -0
- package/.agents/skills/playwright-best-practices/frameworks/angular.md +530 -0
- package/.agents/skills/playwright-best-practices/frameworks/nextjs.md +469 -0
- package/.agents/skills/playwright-best-practices/frameworks/react.md +531 -0
- package/.agents/skills/playwright-best-practices/frameworks/vue.md +574 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/ci-cd.md +468 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/docker.md +283 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/github-actions.md +546 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/gitlab.md +397 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/other-providers.md +521 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/parallel-sharding.md +371 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/performance.md +453 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/reporting.md +424 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/test-coverage.md +497 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/accessibility.md +359 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/api-testing.md +719 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/browser-extensions.md +506 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/canvas-webgl.md +493 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/component-testing.md +500 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/drag-drop.md +576 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/electron.md +509 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/file-operations.md +377 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/file-upload-download.md +562 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/forms-validation.md +561 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/graphql-testing.md +331 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/i18n.md +508 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/performance-testing.md +476 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/security-testing.md +430 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/visual-regression.md +634 -0
- package/.env.example +21 -0
- package/README.md +30 -0
- package/bin/arcality.mjs +86 -0
- package/package.json +66 -0
- package/playwright.config.ts +12 -0
- package/scripts/cleanup-qmsdev.mjs +63 -0
- package/scripts/discover-view.mjs +52 -0
- package/scripts/extract-view.mjs +64 -0
- package/scripts/gen-and-run.mjs +838 -0
- package/scripts/init.mjs +290 -0
- package/scripts/migrate-to-central-out.mjs +157 -0
- package/scripts/postinstall.mjs +63 -0
- package/scripts/rebrand-report.mjs +241 -0
- package/scripts/setup.mjs +166 -0
- package/src/KnowledgeService.ts +239 -0
- package/src/arcalityClient.mjs +266 -0
- package/src/configLoader.mjs +179 -0
- package/src/configManager.mjs +172 -0
- package/src/consoleBanner.ts +32 -0
- package/src/envSetup.ts +205 -0
- package/src/index.ts +25 -0
- package/src/projectInspector.ts +42 -0
- package/src/services/collectiveMemoryService.ts +178 -0
- package/src/testRunner.ts +201 -0
- package/tests/_helpers/ArcalityReporter.ts +490 -0
- package/tests/_helpers/agentic-runner.spec.ts +741 -0
- package/tests/_helpers/ai-agent-helper.ts +1573 -0
- package/tests/_helpers/discover-view.spec.ts +238 -0
- package/tests/_helpers/extract-view.spec.ts +118 -0
- package/tests/_helpers/qa-tools.ts +333 -0
- package/tests/_helpers/smart-action.spec.ts +1458 -0
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
# GitHub Actions for Playwright
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
1. [CLI Commands](#cli-commands)
|
|
6
|
+
2. [Workflow Patterns](#workflow-patterns)
|
|
7
|
+
3. [Scenario Guide](#scenario-guide)
|
|
8
|
+
4. [Common Mistakes](#common-mistakes)
|
|
9
|
+
5. [Troubleshooting](#troubleshooting)
|
|
10
|
+
6. [Related](#related)
|
|
11
|
+
|
|
12
|
+
> **When to use**: Automating Playwright tests on pull requests, main branch merges, or scheduled runs.
|
|
13
|
+
|
|
14
|
+
## CLI Commands
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npx playwright install --with-deps # browsers + OS dependencies
|
|
18
|
+
npx playwright test --shard=1/4 # run shard 1 of 4
|
|
19
|
+
npx playwright test --reporter=github # PR annotations
|
|
20
|
+
npx playwright merge-reports ./blob-report # combine shard reports
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Workflow Patterns
|
|
24
|
+
|
|
25
|
+
### Basic Workflow
|
|
26
|
+
|
|
27
|
+
**Use when**: Starting a new project or running a small test suite.
|
|
28
|
+
|
|
29
|
+
```yaml
|
|
30
|
+
# .github/workflows/e2e.yml
|
|
31
|
+
name: E2E Tests
|
|
32
|
+
|
|
33
|
+
on:
|
|
34
|
+
push:
|
|
35
|
+
branches: [main]
|
|
36
|
+
pull_request:
|
|
37
|
+
branches: [main]
|
|
38
|
+
|
|
39
|
+
concurrency:
|
|
40
|
+
group: e2e-${{ github.ref }}
|
|
41
|
+
cancel-in-progress: true
|
|
42
|
+
|
|
43
|
+
env:
|
|
44
|
+
CI: true
|
|
45
|
+
|
|
46
|
+
jobs:
|
|
47
|
+
test:
|
|
48
|
+
timeout-minutes: 30
|
|
49
|
+
runs-on: ubuntu-latest
|
|
50
|
+
|
|
51
|
+
steps:
|
|
52
|
+
- uses: actions/checkout@v4
|
|
53
|
+
|
|
54
|
+
- run: npm ci
|
|
55
|
+
|
|
56
|
+
- name: Cache browsers
|
|
57
|
+
id: browser-cache
|
|
58
|
+
uses: actions/cache@v4
|
|
59
|
+
with:
|
|
60
|
+
path: ~/.cache/ms-playwright
|
|
61
|
+
key: pw-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
|
|
62
|
+
|
|
63
|
+
- name: Install browsers
|
|
64
|
+
if: steps.browser-cache.outputs.cache-hit != 'true'
|
|
65
|
+
run: npx playwright install --with-deps
|
|
66
|
+
|
|
67
|
+
- name: Install OS dependencies
|
|
68
|
+
if: steps.browser-cache.outputs.cache-hit == 'true'
|
|
69
|
+
run: npx playwright install-deps
|
|
70
|
+
|
|
71
|
+
- run: npx playwright test
|
|
72
|
+
|
|
73
|
+
- name: Upload report
|
|
74
|
+
uses: actions/upload-artifact@v4
|
|
75
|
+
if: ${{ !cancelled() }}
|
|
76
|
+
with:
|
|
77
|
+
name: test-report
|
|
78
|
+
path: playwright-report/
|
|
79
|
+
retention-days: 14
|
|
80
|
+
|
|
81
|
+
- name: Upload traces
|
|
82
|
+
uses: actions/upload-artifact@v4
|
|
83
|
+
if: failure()
|
|
84
|
+
with:
|
|
85
|
+
name: traces
|
|
86
|
+
path: test-results/
|
|
87
|
+
retention-days: 7
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Sharded Execution
|
|
91
|
+
|
|
92
|
+
**Use when**: Test suite exceeds 10 minutes. Sharding cuts wall-clock time significantly.
|
|
93
|
+
**Avoid when**: Suite runs under 5 minutes—sharding overhead negates benefits.
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
# .github/workflows/e2e-sharded.yml
|
|
97
|
+
name: E2E Tests (Sharded)
|
|
98
|
+
|
|
99
|
+
on:
|
|
100
|
+
push:
|
|
101
|
+
branches: [main]
|
|
102
|
+
pull_request:
|
|
103
|
+
branches: [main]
|
|
104
|
+
|
|
105
|
+
concurrency:
|
|
106
|
+
group: e2e-${{ github.ref }}
|
|
107
|
+
cancel-in-progress: true
|
|
108
|
+
|
|
109
|
+
env:
|
|
110
|
+
CI: true
|
|
111
|
+
|
|
112
|
+
jobs:
|
|
113
|
+
test:
|
|
114
|
+
timeout-minutes: 20
|
|
115
|
+
runs-on: ubuntu-latest
|
|
116
|
+
strategy:
|
|
117
|
+
fail-fast: false
|
|
118
|
+
matrix:
|
|
119
|
+
shard: [1/4, 2/4, 3/4, 4/4]
|
|
120
|
+
|
|
121
|
+
steps:
|
|
122
|
+
- uses: actions/checkout@v4
|
|
123
|
+
|
|
124
|
+
- run: npm ci
|
|
125
|
+
|
|
126
|
+
- name: Cache browsers
|
|
127
|
+
id: browser-cache
|
|
128
|
+
uses: actions/cache@v4
|
|
129
|
+
with:
|
|
130
|
+
path: ~/.cache/ms-playwright
|
|
131
|
+
key: pw-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
|
|
132
|
+
|
|
133
|
+
- name: Install browsers
|
|
134
|
+
if: steps.browser-cache.outputs.cache-hit != 'true'
|
|
135
|
+
run: npx playwright install --with-deps
|
|
136
|
+
|
|
137
|
+
- name: Install OS dependencies
|
|
138
|
+
if: steps.browser-cache.outputs.cache-hit == 'true'
|
|
139
|
+
run: npx playwright install-deps
|
|
140
|
+
|
|
141
|
+
- name: Run tests (shard ${{ matrix.shard }})
|
|
142
|
+
run: npx playwright test --shard=${{ matrix.shard }}
|
|
143
|
+
|
|
144
|
+
- name: Upload blob report
|
|
145
|
+
uses: actions/upload-artifact@v4
|
|
146
|
+
if: ${{ !cancelled() }}
|
|
147
|
+
with:
|
|
148
|
+
name: blob-${{ strategy.job-index }}
|
|
149
|
+
path: blob-report/
|
|
150
|
+
retention-days: 1
|
|
151
|
+
|
|
152
|
+
merge:
|
|
153
|
+
if: ${{ !cancelled() }}
|
|
154
|
+
needs: test
|
|
155
|
+
runs-on: ubuntu-latest
|
|
156
|
+
|
|
157
|
+
steps:
|
|
158
|
+
- uses: actions/checkout@v4
|
|
159
|
+
|
|
160
|
+
- run: npm ci
|
|
161
|
+
|
|
162
|
+
- name: Download blob reports
|
|
163
|
+
uses: actions/download-artifact@v4
|
|
164
|
+
with:
|
|
165
|
+
path: all-blobs
|
|
166
|
+
pattern: blob-*
|
|
167
|
+
merge-multiple: true
|
|
168
|
+
|
|
169
|
+
- name: Merge reports
|
|
170
|
+
run: npx playwright merge-reports --reporter=html ./all-blobs
|
|
171
|
+
|
|
172
|
+
- name: Upload merged report
|
|
173
|
+
uses: actions/upload-artifact@v4
|
|
174
|
+
with:
|
|
175
|
+
name: test-report
|
|
176
|
+
path: playwright-report/
|
|
177
|
+
retention-days: 14
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Config for sharding**—enable blob reporter:
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// playwright.config.ts
|
|
184
|
+
import { defineConfig } from '@playwright/test';
|
|
185
|
+
|
|
186
|
+
export default defineConfig({
|
|
187
|
+
reporter: process.env.CI
|
|
188
|
+
? [['blob'], ['github']]
|
|
189
|
+
: [['html', { open: 'on-failure' }]],
|
|
190
|
+
});
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Container-Based Execution
|
|
194
|
+
|
|
195
|
+
**Use when**: Reproducible environment matching local Docker setup, or runner OS dependencies cause issues.
|
|
196
|
+
**Avoid when**: Standard `ubuntu-latest` with `--with-deps` works fine.
|
|
197
|
+
|
|
198
|
+
```yaml
|
|
199
|
+
# .github/workflows/e2e-container.yml
|
|
200
|
+
name: E2E Tests (Container)
|
|
201
|
+
|
|
202
|
+
on:
|
|
203
|
+
pull_request:
|
|
204
|
+
branches: [main]
|
|
205
|
+
|
|
206
|
+
jobs:
|
|
207
|
+
test:
|
|
208
|
+
timeout-minutes: 30
|
|
209
|
+
runs-on: ubuntu-latest
|
|
210
|
+
container:
|
|
211
|
+
image: mcr.microsoft.com/playwright:v1.48.0-noble
|
|
212
|
+
|
|
213
|
+
steps:
|
|
214
|
+
- uses: actions/checkout@v4
|
|
215
|
+
|
|
216
|
+
- run: npm ci
|
|
217
|
+
|
|
218
|
+
- name: Run tests
|
|
219
|
+
run: npx playwright test
|
|
220
|
+
env:
|
|
221
|
+
HOME: /root
|
|
222
|
+
|
|
223
|
+
- uses: actions/upload-artifact@v4
|
|
224
|
+
if: ${{ !cancelled() }}
|
|
225
|
+
with:
|
|
226
|
+
name: test-report
|
|
227
|
+
path: playwright-report/
|
|
228
|
+
retention-days: 14
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Environment Secrets
|
|
232
|
+
|
|
233
|
+
**Use when**: Tests target staging/production with credentials.
|
|
234
|
+
**Avoid when**: Tests only run against local dev server.
|
|
235
|
+
|
|
236
|
+
```yaml
|
|
237
|
+
# .github/workflows/e2e-staging.yml
|
|
238
|
+
name: Staging Tests
|
|
239
|
+
|
|
240
|
+
on:
|
|
241
|
+
push:
|
|
242
|
+
branches: [main]
|
|
243
|
+
workflow_dispatch:
|
|
244
|
+
|
|
245
|
+
jobs:
|
|
246
|
+
test:
|
|
247
|
+
timeout-minutes: 30
|
|
248
|
+
runs-on: ubuntu-latest
|
|
249
|
+
environment: staging
|
|
250
|
+
|
|
251
|
+
env:
|
|
252
|
+
CI: true
|
|
253
|
+
BASE_URL: ${{ vars.STAGING_URL }}
|
|
254
|
+
TEST_USER_PASSWORD: ${{ secrets.TEST_USER_PASSWORD }}
|
|
255
|
+
API_TOKEN: ${{ secrets.API_TOKEN }}
|
|
256
|
+
|
|
257
|
+
steps:
|
|
258
|
+
- uses: actions/checkout@v4
|
|
259
|
+
|
|
260
|
+
- run: npm ci
|
|
261
|
+
|
|
262
|
+
- name: Cache browsers
|
|
263
|
+
id: browser-cache
|
|
264
|
+
uses: actions/cache@v4
|
|
265
|
+
with:
|
|
266
|
+
path: ~/.cache/ms-playwright
|
|
267
|
+
key: pw-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
|
|
268
|
+
|
|
269
|
+
- name: Install browsers
|
|
270
|
+
if: steps.browser-cache.outputs.cache-hit != 'true'
|
|
271
|
+
run: npx playwright install --with-deps
|
|
272
|
+
|
|
273
|
+
- name: Install OS dependencies
|
|
274
|
+
if: steps.browser-cache.outputs.cache-hit == 'true'
|
|
275
|
+
run: npx playwright install-deps
|
|
276
|
+
|
|
277
|
+
- name: Run smoke tests
|
|
278
|
+
run: npx playwright test --grep @smoke
|
|
279
|
+
|
|
280
|
+
- uses: actions/upload-artifact@v4
|
|
281
|
+
if: ${{ !cancelled() }}
|
|
282
|
+
with:
|
|
283
|
+
name: staging-report
|
|
284
|
+
path: playwright-report/
|
|
285
|
+
retention-days: 14
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Scheduled Runs
|
|
289
|
+
|
|
290
|
+
**Use when**: Full regression suite is too slow for every PR—run nightly instead.
|
|
291
|
+
**Avoid when**: Suite runs under 15 minutes and can run on every PR.
|
|
292
|
+
|
|
293
|
+
```yaml
|
|
294
|
+
# .github/workflows/nightly.yml
|
|
295
|
+
name: Nightly Regression
|
|
296
|
+
|
|
297
|
+
on:
|
|
298
|
+
schedule:
|
|
299
|
+
- cron: '0 3 * * 1-5'
|
|
300
|
+
workflow_dispatch:
|
|
301
|
+
|
|
302
|
+
jobs:
|
|
303
|
+
test:
|
|
304
|
+
timeout-minutes: 60
|
|
305
|
+
runs-on: ubuntu-latest
|
|
306
|
+
|
|
307
|
+
env:
|
|
308
|
+
CI: true
|
|
309
|
+
BASE_URL: ${{ vars.STAGING_URL }}
|
|
310
|
+
|
|
311
|
+
steps:
|
|
312
|
+
- uses: actions/checkout@v4
|
|
313
|
+
|
|
314
|
+
- run: npm ci
|
|
315
|
+
|
|
316
|
+
- name: Install browsers
|
|
317
|
+
run: npx playwright install --with-deps
|
|
318
|
+
|
|
319
|
+
- name: Run full regression
|
|
320
|
+
run: npx playwright test --grep @regression
|
|
321
|
+
|
|
322
|
+
- uses: actions/upload-artifact@v4
|
|
323
|
+
if: ${{ !cancelled() }}
|
|
324
|
+
with:
|
|
325
|
+
name: nightly-${{ github.run_number }}
|
|
326
|
+
path: playwright-report/
|
|
327
|
+
retention-days: 30
|
|
328
|
+
|
|
329
|
+
- name: Notify on failure
|
|
330
|
+
if: failure()
|
|
331
|
+
uses: slackapi/slack-github-action@latest
|
|
332
|
+
with:
|
|
333
|
+
payload: |
|
|
334
|
+
{
|
|
335
|
+
"text": "Nightly regression failed: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
|
336
|
+
}
|
|
337
|
+
env:
|
|
338
|
+
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### Reusable Workflow
|
|
342
|
+
|
|
343
|
+
**Use when**: Multiple repositories share the same Playwright setup.
|
|
344
|
+
**Avoid when**: Single repo with one workflow.
|
|
345
|
+
|
|
346
|
+
```yaml
|
|
347
|
+
# .github/workflows/pw-reusable.yml
|
|
348
|
+
name: Playwright Reusable
|
|
349
|
+
|
|
350
|
+
on:
|
|
351
|
+
workflow_call:
|
|
352
|
+
inputs:
|
|
353
|
+
node-version:
|
|
354
|
+
type: string
|
|
355
|
+
default: 'lts/*'
|
|
356
|
+
test-command:
|
|
357
|
+
type: string
|
|
358
|
+
default: 'npx playwright test'
|
|
359
|
+
secrets:
|
|
360
|
+
BASE_URL:
|
|
361
|
+
required: false
|
|
362
|
+
TEST_PASSWORD:
|
|
363
|
+
required: false
|
|
364
|
+
|
|
365
|
+
jobs:
|
|
366
|
+
test:
|
|
367
|
+
timeout-minutes: 30
|
|
368
|
+
runs-on: ubuntu-latest
|
|
369
|
+
|
|
370
|
+
env:
|
|
371
|
+
CI: true
|
|
372
|
+
BASE_URL: ${{ secrets.BASE_URL }}
|
|
373
|
+
TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }}
|
|
374
|
+
|
|
375
|
+
steps:
|
|
376
|
+
- uses: actions/checkout@v4
|
|
377
|
+
|
|
378
|
+
- uses: actions/setup-node@v4
|
|
379
|
+
with:
|
|
380
|
+
node-version: ${{ inputs.node-version }}
|
|
381
|
+
cache: npm
|
|
382
|
+
|
|
383
|
+
- run: npm ci
|
|
384
|
+
|
|
385
|
+
- name: Cache browsers
|
|
386
|
+
id: browser-cache
|
|
387
|
+
uses: actions/cache@v4
|
|
388
|
+
with:
|
|
389
|
+
path: ~/.cache/ms-playwright
|
|
390
|
+
key: pw-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
|
|
391
|
+
|
|
392
|
+
- name: Install browsers
|
|
393
|
+
if: steps.browser-cache.outputs.cache-hit != 'true'
|
|
394
|
+
run: npx playwright install --with-deps
|
|
395
|
+
|
|
396
|
+
- name: Install OS dependencies
|
|
397
|
+
if: steps.browser-cache.outputs.cache-hit == 'true'
|
|
398
|
+
run: npx playwright install-deps
|
|
399
|
+
|
|
400
|
+
- name: Run tests
|
|
401
|
+
run: ${{ inputs.test-command }}
|
|
402
|
+
|
|
403
|
+
- uses: actions/upload-artifact@v4
|
|
404
|
+
if: ${{ !cancelled() }}
|
|
405
|
+
with:
|
|
406
|
+
name: test-report
|
|
407
|
+
path: playwright-report/
|
|
408
|
+
retention-days: 14
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
**Calling the reusable workflow:**
|
|
412
|
+
|
|
413
|
+
```yaml
|
|
414
|
+
# .github/workflows/ci.yml
|
|
415
|
+
name: CI
|
|
416
|
+
on:
|
|
417
|
+
pull_request:
|
|
418
|
+
branches: [main]
|
|
419
|
+
|
|
420
|
+
jobs:
|
|
421
|
+
e2e:
|
|
422
|
+
uses: ./.github/workflows/pw-reusable.yml
|
|
423
|
+
with:
|
|
424
|
+
node-version: 'lts/*'
|
|
425
|
+
secrets:
|
|
426
|
+
BASE_URL: ${{ secrets.STAGING_URL }}
|
|
427
|
+
TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }}
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
## Scenario Guide
|
|
431
|
+
|
|
432
|
+
| Scenario | Approach |
|
|
433
|
+
|---|---|
|
|
434
|
+
| Small suite (< 5 min) | Single job, no sharding |
|
|
435
|
+
| Medium suite (5-20 min) | 2-4 shards with matrix |
|
|
436
|
+
| Large suite (20+ min) | 4-8 shards + blob merge |
|
|
437
|
+
| Cross-browser on PRs | Chromium only on PRs; all browsers on main |
|
|
438
|
+
| Staging/prod smoke tests | Separate workflow with `environment:` |
|
|
439
|
+
| Nightly full regression | `schedule` trigger + `workflow_dispatch` |
|
|
440
|
+
| Multiple repos, same setup | Reusable workflow with `workflow_call` |
|
|
441
|
+
| Reproducible env needed | Container job with Playwright image |
|
|
442
|
+
|
|
443
|
+
## Common Mistakes
|
|
444
|
+
|
|
445
|
+
| Mistake | Problem | Fix |
|
|
446
|
+
|---|---|---|
|
|
447
|
+
| No `concurrency` group | Duplicate runs waste minutes | Add `concurrency: { group: ..., cancel-in-progress: true }` |
|
|
448
|
+
| `fail-fast: true` with sharding | One failure cancels others | Set `fail-fast: false` |
|
|
449
|
+
| No browser caching | 60-90 seconds wasted per run | Cache `~/.cache/ms-playwright` |
|
|
450
|
+
| No `timeout-minutes` | Stuck jobs run for 6 hours | Set explicit timeout: 20-30 minutes |
|
|
451
|
+
| Artifacts only on failure | No report when tests pass | Use `if: ${{ !cancelled() }}` |
|
|
452
|
+
| Hardcoded secrets | Security risk | Use GitHub Secrets and Environments |
|
|
453
|
+
| All browsers on every PR | 3x CI cost | Chromium on PR; cross-browser on main |
|
|
454
|
+
| No artifact retention | Default 90-day fills storage | Set `retention-days: 7-14` |
|
|
455
|
+
| Missing `--with-deps` | Browser launch failures | Always use `npx playwright install --with-deps` |
|
|
456
|
+
|
|
457
|
+
## Troubleshooting
|
|
458
|
+
|
|
459
|
+
### Browser launch fails: "Missing dependencies"
|
|
460
|
+
|
|
461
|
+
**Cause**: Browsers restored from cache but OS dependencies weren't cached.
|
|
462
|
+
|
|
463
|
+
**Fix**: Run `npx playwright install-deps` on cache hit:
|
|
464
|
+
|
|
465
|
+
```yaml
|
|
466
|
+
- name: Install OS dependencies
|
|
467
|
+
if: steps.browser-cache.outputs.cache-hit == 'true'
|
|
468
|
+
run: npx playwright install-deps
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
### Tests pass locally but timeout in CI
|
|
472
|
+
|
|
473
|
+
**Cause**: CI runners have fewer resources than dev machines.
|
|
474
|
+
|
|
475
|
+
**Fix**: Reduce workers and increase timeouts:
|
|
476
|
+
|
|
477
|
+
```typescript
|
|
478
|
+
// playwright.config.ts
|
|
479
|
+
import { defineConfig } from '@playwright/test';
|
|
480
|
+
|
|
481
|
+
export default defineConfig({
|
|
482
|
+
workers: process.env.CI ? '50%' : undefined,
|
|
483
|
+
use: {
|
|
484
|
+
actionTimeout: process.env.CI ? 15_000 : 10_000,
|
|
485
|
+
navigationTimeout: process.env.CI ? 30_000 : 15_000,
|
|
486
|
+
},
|
|
487
|
+
});
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Sharded reports incomplete
|
|
491
|
+
|
|
492
|
+
**Cause**: Artifact names collide or `merge-multiple` not set.
|
|
493
|
+
|
|
494
|
+
**Fix**: Unique names per shard and enable merge:
|
|
495
|
+
|
|
496
|
+
```yaml
|
|
497
|
+
# Upload in each shard
|
|
498
|
+
- uses: actions/upload-artifact@v4
|
|
499
|
+
with:
|
|
500
|
+
name: blob-${{ strategy.job-index }}
|
|
501
|
+
path: blob-report/
|
|
502
|
+
|
|
503
|
+
# Download in merge job
|
|
504
|
+
- uses: actions/download-artifact@v4
|
|
505
|
+
with:
|
|
506
|
+
path: all-blobs
|
|
507
|
+
pattern: blob-*
|
|
508
|
+
merge-multiple: true
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
### `webServer` fails: "port already in use"
|
|
512
|
+
|
|
513
|
+
**Cause**: Zombie process from previous run.
|
|
514
|
+
|
|
515
|
+
**Fix**: Kill stale processes before starting:
|
|
516
|
+
|
|
517
|
+
```yaml
|
|
518
|
+
- name: Kill stale processes
|
|
519
|
+
run: lsof -ti:3000 | xargs kill -9 2>/dev/null || true
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
### No PR annotations
|
|
523
|
+
|
|
524
|
+
**Cause**: `github` reporter not configured.
|
|
525
|
+
|
|
526
|
+
**Fix**: Add `github` reporter for CI:
|
|
527
|
+
|
|
528
|
+
```typescript
|
|
529
|
+
// playwright.config.ts
|
|
530
|
+
import { defineConfig } from '@playwright/test';
|
|
531
|
+
|
|
532
|
+
export default defineConfig({
|
|
533
|
+
reporter: process.env.CI
|
|
534
|
+
? [['html', { open: 'never' }], ['github']]
|
|
535
|
+
: [['html', { open: 'on-failure' }]],
|
|
536
|
+
});
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
## Related
|
|
540
|
+
|
|
541
|
+
- [test-tags.md](../core/test-tags.md) — tagging and filtering tests
|
|
542
|
+
- [parallel-sharding.md](parallel-sharding.md) — sharding strategies
|
|
543
|
+
- [reporting.md](reporting.md) — reporter configuration
|
|
544
|
+
- [docker.md](docker.md) — container images
|
|
545
|
+
- [gitlab.md](gitlab.md) — GitLab CI equivalent
|
|
546
|
+
- [other-providers.md](other-providers.md) — CircleCI, Azure DevOps, Jenkins
|