codeceptjs 4.0.0-rc.17 → 4.0.0-rc.19
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/bin/codecept.js +15 -2
- package/bin/codeceptq.js +49 -0
- package/bin/mcp-server.js +733 -196
- package/docs/advanced.md +201 -0
- package/docs/agents.md +159 -0
- package/docs/ai.md +537 -0
- package/docs/aitrace.md +266 -0
- package/docs/api.md +332 -0
- package/docs/assertions.md +415 -0
- package/docs/auth.md +318 -0
- package/docs/basics.md +424 -0
- package/docs/bdd.md +539 -0
- package/docs/best.md +240 -0
- package/docs/bootstrap.md +132 -0
- package/docs/commands.md +352 -0
- package/docs/community-helpers.md +63 -0
- package/docs/configuration.md +230 -0
- package/docs/continuous-integration.md +497 -0
- package/docs/custom-helpers.md +297 -0
- package/docs/data.md +448 -0
- package/docs/debugging.md +332 -0
- package/docs/detox.md +235 -0
- package/docs/docker.md +136 -0
- package/docs/effects.md +179 -0
- package/docs/element-based-testing.md +295 -0
- package/docs/element-selection.md +125 -0
- package/docs/els.md +328 -0
- package/docs/examples.md +161 -0
- package/docs/heal.md +213 -0
- package/docs/helpers/ApiDataFactory.md +267 -0
- package/docs/helpers/Appium.md +1405 -0
- package/docs/helpers/Detox.md +665 -0
- package/docs/helpers/ExpectHelper.md +275 -0
- package/docs/helpers/FileSystem.md +152 -0
- package/docs/helpers/GraphQL.md +152 -0
- package/docs/helpers/GraphQLDataFactory.md +226 -0
- package/docs/helpers/JSONResponse.md +255 -0
- package/docs/helpers/Mochawesome.md +8 -0
- package/docs/helpers/MockRequest.md +377 -0
- package/docs/helpers/MockServer.md +212 -0
- package/docs/helpers/Playwright.md +2969 -0
- package/docs/helpers/Polly.md +44 -0
- package/docs/helpers/Protractor.md +1769 -0
- package/docs/helpers/Puppeteer-firefox.md +86 -0
- package/docs/helpers/Puppeteer.md +2690 -0
- package/docs/helpers/REST.md +289 -0
- package/docs/helpers/SoftExpectHelper.md +352 -0
- package/docs/helpers/WebDriver.md +2682 -0
- package/docs/hooks.md +339 -0
- package/docs/index.md +111 -0
- package/docs/installation.md +83 -0
- package/docs/internal-api.md +265 -0
- package/docs/internal-test-server.md +89 -0
- package/docs/locators.md +355 -0
- package/docs/mcp.md +485 -0
- package/docs/migration-4.md +556 -0
- package/docs/mobile.md +338 -0
- package/docs/pageobjects.md +399 -0
- package/docs/parallel.md +585 -0
- package/docs/playwright.md +714 -0
- package/docs/plugins.md +866 -0
- package/docs/puppeteer.md +314 -0
- package/docs/quickstart.md +120 -0
- package/docs/react.md +70 -0
- package/docs/reports.md +483 -0
- package/docs/retry.md +274 -0
- package/docs/secrets.md +150 -0
- package/docs/sessions.md +80 -0
- package/docs/shadow.md +68 -0
- package/docs/test-structure.md +275 -0
- package/docs/timeouts.md +183 -0
- package/docs/translation.md +247 -0
- package/docs/tutorial.md +271 -0
- package/docs/typescript.md +374 -0
- package/docs/web-element.md +251 -0
- package/docs/webdriver.md +708 -0
- package/docs/within.md +55 -0
- package/lib/aria.js +260 -0
- package/lib/command/dryRun.js +23 -3
- package/lib/command/init.js +247 -266
- package/lib/command/list.js +150 -10
- package/lib/command/query.js +218 -0
- package/lib/config.js +77 -4
- package/lib/container.js +34 -2
- package/lib/element/WebElement.js +37 -0
- package/lib/globals.js +11 -10
- package/lib/helper/Playwright.js +5 -6
- package/lib/helper/extras/PlaywrightReactVueLocator.js +45 -36
- package/lib/html.js +90 -16
- package/lib/index.js +9 -1
- package/lib/locator.js +2 -2
- package/lib/mocha/factory.js +5 -1
- package/lib/mocha/inject.js +1 -1
- package/lib/parser.js +2 -2
- package/lib/pause.js +38 -4
- package/lib/plugin/aiTrace.js +72 -84
- package/lib/plugin/browser.js +77 -0
- package/lib/plugin/expose.js +159 -0
- package/lib/plugin/heal.js +44 -1
- package/lib/plugin/pageInfo.js +51 -48
- package/lib/plugin/pause.js +131 -0
- package/lib/plugin/pauseOnFail.js +10 -34
- package/lib/plugin/screencast.js +287 -0
- package/lib/plugin/screenshot.js +563 -0
- package/lib/plugin/screenshotOnFail.js +8 -170
- package/lib/utils/pluginParser.js +151 -0
- package/lib/utils/trace.js +297 -0
- package/lib/utils.js +25 -0
- package/lib/workers.js +1 -15
- package/package.json +12 -10
- package/typings/index.d.ts +0 -5
- package/docs/webapi/amOnPage.mustache +0 -11
- package/docs/webapi/appendField.mustache +0 -16
- package/docs/webapi/attachFile.mustache +0 -24
- package/docs/webapi/blur.mustache +0 -18
- package/docs/webapi/checkOption.mustache +0 -13
- package/docs/webapi/clearCookie.mustache +0 -9
- package/docs/webapi/clearField.mustache +0 -14
- package/docs/webapi/click.mustache +0 -29
- package/docs/webapi/clickLink.mustache +0 -8
- package/docs/webapi/closeCurrentTab.mustache +0 -7
- package/docs/webapi/closeOtherTabs.mustache +0 -8
- package/docs/webapi/dontSee.mustache +0 -11
- package/docs/webapi/dontSeeCheckboxIsChecked.mustache +0 -10
- package/docs/webapi/dontSeeCookie.mustache +0 -8
- package/docs/webapi/dontSeeCurrentPathEquals.mustache +0 -10
- package/docs/webapi/dontSeeCurrentUrlEquals.mustache +0 -10
- package/docs/webapi/dontSeeElement.mustache +0 -12
- package/docs/webapi/dontSeeElementInDOM.mustache +0 -8
- package/docs/webapi/dontSeeInCurrentUrl.mustache +0 -4
- package/docs/webapi/dontSeeInField.mustache +0 -16
- package/docs/webapi/dontSeeInSource.mustache +0 -8
- package/docs/webapi/dontSeeInTitle.mustache +0 -8
- package/docs/webapi/dontSeeTraffic.mustache +0 -13
- package/docs/webapi/doubleClick.mustache +0 -13
- package/docs/webapi/downloadFile.mustache +0 -12
- package/docs/webapi/dragAndDrop.mustache +0 -9
- package/docs/webapi/dragSlider.mustache +0 -11
- package/docs/webapi/executeAsyncScript.mustache +0 -24
- package/docs/webapi/executeScript.mustache +0 -26
- package/docs/webapi/fillField.mustache +0 -21
- package/docs/webapi/flushNetworkTraffics.mustache +0 -5
- package/docs/webapi/focus.mustache +0 -13
- package/docs/webapi/forceClick.mustache +0 -28
- package/docs/webapi/forceRightClick.mustache +0 -18
- package/docs/webapi/grabAllWindowHandles.mustache +0 -7
- package/docs/webapi/grabAttributeFrom.mustache +0 -10
- package/docs/webapi/grabAttributeFromAll.mustache +0 -9
- package/docs/webapi/grabBrowserLogs.mustache +0 -9
- package/docs/webapi/grabCookie.mustache +0 -11
- package/docs/webapi/grabCssPropertyFrom.mustache +0 -11
- package/docs/webapi/grabCssPropertyFromAll.mustache +0 -10
- package/docs/webapi/grabCurrentUrl.mustache +0 -9
- package/docs/webapi/grabCurrentWindowHandle.mustache +0 -6
- package/docs/webapi/grabDataFromPerformanceTiming.mustache +0 -20
- package/docs/webapi/grabElementBoundingRect.mustache +0 -20
- package/docs/webapi/grabGeoLocation.mustache +0 -8
- package/docs/webapi/grabHTMLFrom.mustache +0 -10
- package/docs/webapi/grabHTMLFromAll.mustache +0 -9
- package/docs/webapi/grabNumberOfOpenTabs.mustache +0 -8
- package/docs/webapi/grabNumberOfVisibleElements.mustache +0 -9
- package/docs/webapi/grabPageScrollPosition.mustache +0 -8
- package/docs/webapi/grabPopupText.mustache +0 -5
- package/docs/webapi/grabRecordedNetworkTraffics.mustache +0 -10
- package/docs/webapi/grabSource.mustache +0 -8
- package/docs/webapi/grabTextFrom.mustache +0 -10
- package/docs/webapi/grabTextFromAll.mustache +0 -9
- package/docs/webapi/grabTitle.mustache +0 -8
- package/docs/webapi/grabValueFrom.mustache +0 -9
- package/docs/webapi/grabValueFromAll.mustache +0 -8
- package/docs/webapi/grabWebElement.mustache +0 -9
- package/docs/webapi/grabWebElements.mustache +0 -9
- package/docs/webapi/moveCursorTo.mustache +0 -16
- package/docs/webapi/openNewTab.mustache +0 -7
- package/docs/webapi/pressKey.mustache +0 -12
- package/docs/webapi/pressKeyDown.mustache +0 -12
- package/docs/webapi/pressKeyUp.mustache +0 -12
- package/docs/webapi/pressKeyWithKeyNormalization.mustache +0 -60
- package/docs/webapi/refreshPage.mustache +0 -6
- package/docs/webapi/resizeWindow.mustache +0 -6
- package/docs/webapi/rightClick.mustache +0 -14
- package/docs/webapi/saveElementScreenshot.mustache +0 -10
- package/docs/webapi/saveScreenshot.mustache +0 -12
- package/docs/webapi/say.mustache +0 -10
- package/docs/webapi/scrollIntoView.mustache +0 -11
- package/docs/webapi/scrollPageToBottom.mustache +0 -6
- package/docs/webapi/scrollPageToTop.mustache +0 -6
- package/docs/webapi/scrollTo.mustache +0 -12
- package/docs/webapi/see.mustache +0 -11
- package/docs/webapi/seeAttributesOnElements.mustache +0 -9
- package/docs/webapi/seeCheckboxIsChecked.mustache +0 -10
- package/docs/webapi/seeCookie.mustache +0 -8
- package/docs/webapi/seeCssPropertiesOnElements.mustache +0 -9
- package/docs/webapi/seeCurrentPathEquals.mustache +0 -10
- package/docs/webapi/seeCurrentUrlEquals.mustache +0 -11
- package/docs/webapi/seeElement.mustache +0 -12
- package/docs/webapi/seeElementInDOM.mustache +0 -8
- package/docs/webapi/seeInCurrentUrl.mustache +0 -8
- package/docs/webapi/seeInField.mustache +0 -17
- package/docs/webapi/seeInPopup.mustache +0 -8
- package/docs/webapi/seeInSource.mustache +0 -7
- package/docs/webapi/seeInTitle.mustache +0 -8
- package/docs/webapi/seeNumberOfElements.mustache +0 -11
- package/docs/webapi/seeNumberOfVisibleElements.mustache +0 -10
- package/docs/webapi/seeTextEquals.mustache +0 -9
- package/docs/webapi/seeTitleEquals.mustache +0 -8
- package/docs/webapi/seeTraffic.mustache +0 -36
- package/docs/webapi/selectOption.mustache +0 -26
- package/docs/webapi/setCookie.mustache +0 -16
- package/docs/webapi/setGeoLocation.mustache +0 -12
- package/docs/webapi/startRecordingTraffic.mustache +0 -8
- package/docs/webapi/startRecordingWebSocketMessages.mustache +0 -8
- package/docs/webapi/stopRecordingTraffic.mustache +0 -5
- package/docs/webapi/stopRecordingWebSocketMessages.mustache +0 -7
- package/docs/webapi/switchTo.mustache +0 -9
- package/docs/webapi/switchToNextTab.mustache +0 -10
- package/docs/webapi/switchToPreviousTab.mustache +0 -10
- package/docs/webapi/type.mustache +0 -21
- package/docs/webapi/uncheckOption.mustache +0 -13
- package/docs/webapi/wait.mustache +0 -8
- package/docs/webapi/waitForClickable.mustache +0 -11
- package/docs/webapi/waitForCookie.mustache +0 -9
- package/docs/webapi/waitForDetached.mustache +0 -10
- package/docs/webapi/waitForDisabled.mustache +0 -6
- package/docs/webapi/waitForElement.mustache +0 -11
- package/docs/webapi/waitForEnabled.mustache +0 -6
- package/docs/webapi/waitForFunction.mustache +0 -17
- package/docs/webapi/waitForInvisible.mustache +0 -10
- package/docs/webapi/waitForNumberOfTabs.mustache +0 -9
- package/docs/webapi/waitForText.mustache +0 -13
- package/docs/webapi/waitForValue.mustache +0 -10
- package/docs/webapi/waitForVisible.mustache +0 -10
- package/docs/webapi/waitInUrl.mustache +0 -9
- package/docs/webapi/waitNumberOfVisibleElements.mustache +0 -10
- package/docs/webapi/waitToHide.mustache +0 -10
- package/docs/webapi/waitUrlEquals.mustache +0 -10
- package/lib/helper/AI.js +0 -214
- package/lib/plugin/pauseOn.js +0 -167
- package/lib/plugin/stepByStepReport.js +0 -432
- package/lib/plugin/subtitles.js +0 -89
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
---
|
|
2
|
+
permalink: /continuous-integration
|
|
3
|
+
title: Continuous Integration
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Continuous Integration
|
|
7
|
+
|
|
8
|
+
CodeceptJS runs in any CI system that can install Node.js. The work is in the surrounding environment: a headless browser, a driver server for WebDriver, failure artifacts to upload, and a parallelization strategy that keeps the wall-clock time reasonable. This guide covers each step and provides drop-in configs for the major CI systems.
|
|
9
|
+
|
|
10
|
+
## Preparing tests for CI
|
|
11
|
+
|
|
12
|
+
A CI-ready suite needs only a few things:
|
|
13
|
+
|
|
14
|
+
- **Headless mode.** Playwright runs headless by default — only act if you set `show: true` locally. To toggle it from CI, export `HEADLESS=true` and read it from your config.
|
|
15
|
+
- **Colored logs.** Export `FORCE_COLOR=1` so CodeceptJS output renders correctly in CI log viewers.
|
|
16
|
+
- **Failure artifacts.** Keep `screenshotOnFail` enabled (it is on by default). For Playwright, also enable `trace` and `video` in the helper config — they make a remote failure diagnosable from a single artifact.
|
|
17
|
+
- **Self-healing for flaky tests.** Use the [`heal` plugin](/heal) to recover from broken locators. The `retryFailedStep` plugin is already enabled by default — you do not need to configure it.
|
|
18
|
+
|
|
19
|
+
You do **not** need to set `CI=true`. Every CI provider exports it automatically, and CodeceptJS reads it to relax certain timeouts.
|
|
20
|
+
|
|
21
|
+
## Installing browsers and drivers
|
|
22
|
+
|
|
23
|
+
### Playwright
|
|
24
|
+
|
|
25
|
+
Playwright needs browser binaries plus Linux system libraries. The recommended approach (per the [official Playwright CI docs](https://playwright.dev/docs/ci)) is:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm ci
|
|
29
|
+
npx playwright install --with-deps chromium
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`--with-deps` pulls in `libnss`, fonts, and other OS packages. To install all engines, drop the `chromium` argument. Playwright explicitly recommends against caching browser binaries — restoring the cache takes about as long as a fresh download.
|
|
33
|
+
|
|
34
|
+
If you prefer the official Playwright Docker image, see the [Playwright Docker docs](https://playwright.dev/docs/docker). Pin the image tag to **the same version as your installed `playwright` package** — a mismatched image will fail to find browser executables. The examples below use `node:20` + `npx playwright install --with-deps` to avoid this version-pin problem entirely.
|
|
35
|
+
|
|
36
|
+
### WebDriver
|
|
37
|
+
|
|
38
|
+
CodeceptJS's WebDriver helper talks to any WebDriver-protocol endpoint. In CI, the simplest setup is a [Selenium Docker container](https://github.com/SeleniumHQ/docker-selenium):
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
docker run -d --net=host --shm-size=2g selenium/standalone-chrome
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Point the helper at it:
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
helpers: {
|
|
48
|
+
WebDriver: {
|
|
49
|
+
url: 'http://localhost:8000',
|
|
50
|
+
browser: 'chrome',
|
|
51
|
+
host: process.env.SELENIUM_HOST || 'localhost',
|
|
52
|
+
port: parseInt(process.env.SELENIUM_PORT || '4444', 10),
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
For an alternative without Selenium, see the [WebDriver helper docs](/webdriver) — recent WebdriverIO versions can manage drivers (chromedriver, geckodriver) directly. Selenium is still the most portable choice for CI.
|
|
58
|
+
|
|
59
|
+
`--shm-size=2g` matters. The default 64 MB causes Chrome tabs to crash on heavy pages.
|
|
60
|
+
|
|
61
|
+
## Running tests
|
|
62
|
+
|
|
63
|
+
A single process:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npx codeceptjs run
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Parallel workers on one machine:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npx codeceptjs run-workers 4 --by pool
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`--by pool` distributes tests dynamically: each worker grabs the next test as it finishes, so no worker sits idle. See [Parallel Execution](/parallel) for `--by test` and `--by suite`.
|
|
76
|
+
|
|
77
|
+
Sharded across multiple machines (CI matrix):
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npx codeceptjs run --shard 1/4
|
|
81
|
+
npx codeceptjs run --shard 2/4
|
|
82
|
+
npx codeceptjs run --shard 3/4
|
|
83
|
+
npx codeceptjs run --shard 4/4
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
You can combine the two — each shard runs on its own machine, and `run-workers` parallelizes within the shard.
|
|
87
|
+
|
|
88
|
+
Filter by tag:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npx codeceptjs run --grep "@smoke"
|
|
92
|
+
npx codeceptjs run --grep "@slow" --invert
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Reporting
|
|
96
|
+
|
|
97
|
+
For CI test reporting, use [`@testomatio/reporter`](https://github.com/testomatio/reporter). It ships built-in **pipes** that publish results directly into the CI platform's UI — no XML wrangling required.
|
|
98
|
+
|
|
99
|
+
| CI | Recommended pipes | Result |
|
|
100
|
+
|---|---|---|
|
|
101
|
+
| GitHub Actions | `github` + `html` | PR check annotations + a self-contained HTML report |
|
|
102
|
+
| GitLab CI | `gitlab` | Merge request widget with test results |
|
|
103
|
+
| Bitbucket Pipelines | `bitbucket` | Pipeline test report |
|
|
104
|
+
| Any | `html` | HTML report you can upload as an artifact |
|
|
105
|
+
|
|
106
|
+
Install:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
npm i --save-dev @testomatio/reporter
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
See the [reporter README](https://github.com/testomatio/reporter) for the per-pipe environment variables.
|
|
113
|
+
|
|
114
|
+
Whatever reporter you use, also upload the `output/` directory as a build artifact. It contains failure screenshots and, with Playwright, traces and videos.
|
|
115
|
+
|
|
116
|
+
For other reporter formats, see [Reports](/reports).
|
|
117
|
+
|
|
118
|
+
## CI system examples
|
|
119
|
+
|
|
120
|
+
The examples below use Playwright by default. A WebDriver-with-Selenium variant follows where it differs.
|
|
121
|
+
|
|
122
|
+
### GitHub Actions — Playwright
|
|
123
|
+
|
|
124
|
+
`.github/workflows/tests.yml`:
|
|
125
|
+
|
|
126
|
+
```yaml
|
|
127
|
+
name: Tests
|
|
128
|
+
on:
|
|
129
|
+
push:
|
|
130
|
+
branches: [main]
|
|
131
|
+
pull_request:
|
|
132
|
+
|
|
133
|
+
env:
|
|
134
|
+
FORCE_COLOR: 1
|
|
135
|
+
|
|
136
|
+
jobs:
|
|
137
|
+
test:
|
|
138
|
+
runs-on: ubuntu-latest
|
|
139
|
+
timeout-minutes: 30
|
|
140
|
+
steps:
|
|
141
|
+
- uses: actions/checkout@v4
|
|
142
|
+
- uses: actions/setup-node@v4
|
|
143
|
+
with:
|
|
144
|
+
node-version: 20
|
|
145
|
+
cache: npm
|
|
146
|
+
- run: npm ci
|
|
147
|
+
- run: npx playwright install --with-deps chromium
|
|
148
|
+
- run: npx codeceptjs run-workers 4 --by pool
|
|
149
|
+
- uses: actions/upload-artifact@v4
|
|
150
|
+
if: failure()
|
|
151
|
+
with:
|
|
152
|
+
name: codeceptjs-output
|
|
153
|
+
path: output/
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### GitHub Actions — WebDriver + Selenium
|
|
157
|
+
|
|
158
|
+
```yaml
|
|
159
|
+
name: WebDriver Tests
|
|
160
|
+
on: [push, pull_request]
|
|
161
|
+
|
|
162
|
+
jobs:
|
|
163
|
+
test:
|
|
164
|
+
runs-on: ubuntu-latest
|
|
165
|
+
services:
|
|
166
|
+
selenium:
|
|
167
|
+
image: selenium/standalone-chrome
|
|
168
|
+
ports:
|
|
169
|
+
- 4444:4444
|
|
170
|
+
options: --shm-size=2g
|
|
171
|
+
env:
|
|
172
|
+
SELENIUM_HOST: localhost
|
|
173
|
+
SELENIUM_PORT: 4444
|
|
174
|
+
FORCE_COLOR: 1
|
|
175
|
+
steps:
|
|
176
|
+
- uses: actions/checkout@v4
|
|
177
|
+
- uses: actions/setup-node@v4
|
|
178
|
+
with:
|
|
179
|
+
node-version: 20
|
|
180
|
+
- run: npm ci
|
|
181
|
+
- run: npx codeceptjs run-workers 2 --by pool
|
|
182
|
+
- uses: actions/upload-artifact@v4
|
|
183
|
+
if: failure()
|
|
184
|
+
with:
|
|
185
|
+
name: codeceptjs-output
|
|
186
|
+
path: output/
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### GitHub Actions — Sharding matrix
|
|
190
|
+
|
|
191
|
+
Each shard runs on its own runner in parallel:
|
|
192
|
+
|
|
193
|
+
```yaml
|
|
194
|
+
jobs:
|
|
195
|
+
test:
|
|
196
|
+
runs-on: ubuntu-latest
|
|
197
|
+
strategy:
|
|
198
|
+
fail-fast: false
|
|
199
|
+
matrix:
|
|
200
|
+
shard: ['1/4', '2/4', '3/4', '4/4']
|
|
201
|
+
steps:
|
|
202
|
+
- uses: actions/checkout@v4
|
|
203
|
+
- uses: actions/setup-node@v4
|
|
204
|
+
with:
|
|
205
|
+
node-version: 20
|
|
206
|
+
- run: npm ci
|
|
207
|
+
- run: npx playwright install --with-deps chromium
|
|
208
|
+
- run: npx codeceptjs run --shard ${{ matrix.shard }}
|
|
209
|
+
- uses: actions/upload-artifact@v4
|
|
210
|
+
if: failure()
|
|
211
|
+
with:
|
|
212
|
+
name: output-shard-${{ strategy.job-index }}
|
|
213
|
+
path: output/
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### GitLab CI
|
|
217
|
+
|
|
218
|
+
`.gitlab-ci.yml`:
|
|
219
|
+
|
|
220
|
+
```yaml
|
|
221
|
+
stages: [test]
|
|
222
|
+
|
|
223
|
+
playwright:
|
|
224
|
+
stage: test
|
|
225
|
+
image: node:20
|
|
226
|
+
variables:
|
|
227
|
+
FORCE_COLOR: "1"
|
|
228
|
+
parallel: 4
|
|
229
|
+
before_script:
|
|
230
|
+
- npm ci
|
|
231
|
+
- npx playwright install --with-deps chromium
|
|
232
|
+
script:
|
|
233
|
+
- npx codeceptjs run --shard $CI_NODE_INDEX/$CI_NODE_TOTAL
|
|
234
|
+
artifacts:
|
|
235
|
+
when: on_failure
|
|
236
|
+
paths:
|
|
237
|
+
- output/
|
|
238
|
+
expire_in: 1 week
|
|
239
|
+
|
|
240
|
+
webdriver:
|
|
241
|
+
stage: test
|
|
242
|
+
image: node:20
|
|
243
|
+
services:
|
|
244
|
+
- name: selenium/standalone-chrome
|
|
245
|
+
alias: selenium
|
|
246
|
+
variables:
|
|
247
|
+
SELENIUM_HOST: selenium
|
|
248
|
+
SELENIUM_PORT: "4444"
|
|
249
|
+
script:
|
|
250
|
+
- npm ci
|
|
251
|
+
- npx codeceptjs run-workers 2 --by pool
|
|
252
|
+
artifacts:
|
|
253
|
+
when: on_failure
|
|
254
|
+
paths: [output/]
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
`$CI_NODE_INDEX` is 1-based, which matches CodeceptJS's `--shard` syntax exactly.
|
|
258
|
+
|
|
259
|
+
### Bitbucket Pipelines
|
|
260
|
+
|
|
261
|
+
`bitbucket-pipelines.yml`:
|
|
262
|
+
|
|
263
|
+
```yaml
|
|
264
|
+
image: node:20
|
|
265
|
+
|
|
266
|
+
definitions:
|
|
267
|
+
services:
|
|
268
|
+
selenium:
|
|
269
|
+
image: selenium/standalone-chrome
|
|
270
|
+
memory: 2048
|
|
271
|
+
|
|
272
|
+
pipelines:
|
|
273
|
+
default:
|
|
274
|
+
- step:
|
|
275
|
+
name: Install
|
|
276
|
+
caches: [node]
|
|
277
|
+
script:
|
|
278
|
+
- npm ci
|
|
279
|
+
- npx playwright install --with-deps chromium
|
|
280
|
+
- parallel:
|
|
281
|
+
- step:
|
|
282
|
+
name: Shard 1/4
|
|
283
|
+
script:
|
|
284
|
+
- npx codeceptjs run --shard 1/4
|
|
285
|
+
artifacts:
|
|
286
|
+
- output/**
|
|
287
|
+
- step:
|
|
288
|
+
name: Shard 2/4
|
|
289
|
+
script:
|
|
290
|
+
- npx codeceptjs run --shard 2/4
|
|
291
|
+
artifacts:
|
|
292
|
+
- output/**
|
|
293
|
+
- step:
|
|
294
|
+
name: Shard 3/4
|
|
295
|
+
script:
|
|
296
|
+
- npx codeceptjs run --shard 3/4
|
|
297
|
+
artifacts:
|
|
298
|
+
- output/**
|
|
299
|
+
- step:
|
|
300
|
+
name: Shard 4/4
|
|
301
|
+
script:
|
|
302
|
+
- npx codeceptjs run --shard 4/4
|
|
303
|
+
artifacts:
|
|
304
|
+
- output/**
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
For WebDriver, attach the Selenium service to the step:
|
|
308
|
+
|
|
309
|
+
```yaml
|
|
310
|
+
pipelines:
|
|
311
|
+
default:
|
|
312
|
+
- step:
|
|
313
|
+
image: node:20
|
|
314
|
+
services: [selenium]
|
|
315
|
+
script:
|
|
316
|
+
- npm ci
|
|
317
|
+
- export SELENIUM_HOST=localhost SELENIUM_PORT=4444
|
|
318
|
+
- npx codeceptjs run-workers 2 --by pool
|
|
319
|
+
artifacts:
|
|
320
|
+
- output/**
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Jenkins
|
|
324
|
+
|
|
325
|
+
`Jenkinsfile` (declarative pipeline):
|
|
326
|
+
|
|
327
|
+
```groovy
|
|
328
|
+
pipeline {
|
|
329
|
+
agent {
|
|
330
|
+
docker {
|
|
331
|
+
image 'node:20'
|
|
332
|
+
args '-u root'
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
environment {
|
|
336
|
+
FORCE_COLOR = '1'
|
|
337
|
+
}
|
|
338
|
+
stages {
|
|
339
|
+
stage('Install') {
|
|
340
|
+
steps {
|
|
341
|
+
sh 'npm ci'
|
|
342
|
+
sh 'npx playwright install --with-deps chromium'
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
stage('Test') {
|
|
346
|
+
parallel {
|
|
347
|
+
stage('Shard 1/4') { steps { sh 'npx codeceptjs run --shard 1/4' } }
|
|
348
|
+
stage('Shard 2/4') { steps { sh 'npx codeceptjs run --shard 2/4' } }
|
|
349
|
+
stage('Shard 3/4') { steps { sh 'npx codeceptjs run --shard 3/4' } }
|
|
350
|
+
stage('Shard 4/4') { steps { sh 'npx codeceptjs run --shard 4/4' } }
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
post {
|
|
355
|
+
failure {
|
|
356
|
+
archiveArtifacts artifacts: 'output/**', allowEmptyArchive: true
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
For WebDriver, launch Selenium alongside the test container:
|
|
363
|
+
|
|
364
|
+
```groovy
|
|
365
|
+
stage('Test') {
|
|
366
|
+
steps {
|
|
367
|
+
script {
|
|
368
|
+
docker.image('selenium/standalone-chrome')
|
|
369
|
+
.withRun('--shm-size=2g -p 4444:4444') { c ->
|
|
370
|
+
sh '''
|
|
371
|
+
export SELENIUM_HOST=localhost SELENIUM_PORT=4444
|
|
372
|
+
npx codeceptjs run-workers 2 --by pool
|
|
373
|
+
'''
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### CircleCI
|
|
381
|
+
|
|
382
|
+
`.circleci/config.yml`:
|
|
383
|
+
|
|
384
|
+
```yaml
|
|
385
|
+
version: 2.1
|
|
386
|
+
|
|
387
|
+
jobs:
|
|
388
|
+
test:
|
|
389
|
+
docker:
|
|
390
|
+
- image: cimg/node:20.18-browsers
|
|
391
|
+
parallelism: 4
|
|
392
|
+
steps:
|
|
393
|
+
- checkout
|
|
394
|
+
- run: npm ci
|
|
395
|
+
- run: npx playwright install --with-deps chromium
|
|
396
|
+
- run:
|
|
397
|
+
name: Run shard
|
|
398
|
+
command: |
|
|
399
|
+
INDEX=$((CIRCLE_NODE_INDEX + 1))
|
|
400
|
+
npx codeceptjs run --shard ${INDEX}/${CIRCLE_NODE_TOTAL}
|
|
401
|
+
- store_artifacts:
|
|
402
|
+
path: output
|
|
403
|
+
|
|
404
|
+
webdriver:
|
|
405
|
+
docker:
|
|
406
|
+
- image: cimg/node:20.18
|
|
407
|
+
- image: selenium/standalone-chrome
|
|
408
|
+
environment:
|
|
409
|
+
SELENIUM_HOST: localhost
|
|
410
|
+
SELENIUM_PORT: 4444
|
|
411
|
+
steps:
|
|
412
|
+
- checkout
|
|
413
|
+
- run: npm ci
|
|
414
|
+
- run: npx codeceptjs run-workers 2 --by pool
|
|
415
|
+
- store_artifacts:
|
|
416
|
+
path: output
|
|
417
|
+
|
|
418
|
+
workflows:
|
|
419
|
+
test:
|
|
420
|
+
jobs:
|
|
421
|
+
- test
|
|
422
|
+
- webdriver
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
`CIRCLE_NODE_INDEX` is 0-based, so add 1 to match CodeceptJS's 1-based `--shard` index.
|
|
426
|
+
|
|
427
|
+
### Azure Pipelines
|
|
428
|
+
|
|
429
|
+
`azure-pipelines.yml`:
|
|
430
|
+
|
|
431
|
+
```yaml
|
|
432
|
+
trigger: [main]
|
|
433
|
+
|
|
434
|
+
pool:
|
|
435
|
+
vmImage: ubuntu-latest
|
|
436
|
+
|
|
437
|
+
strategy:
|
|
438
|
+
parallel: 4
|
|
439
|
+
|
|
440
|
+
steps:
|
|
441
|
+
- task: NodeTool@0
|
|
442
|
+
inputs:
|
|
443
|
+
versionSpec: '20.x'
|
|
444
|
+
- script: npm ci
|
|
445
|
+
displayName: Install dependencies
|
|
446
|
+
- script: npx playwright install --with-deps chromium
|
|
447
|
+
displayName: Install Playwright browsers
|
|
448
|
+
- script: |
|
|
449
|
+
npx codeceptjs run --shard $(System.JobPositionInPhase)/$(System.TotalJobsInPhase)
|
|
450
|
+
displayName: Run shard $(System.JobPositionInPhase)/$(System.TotalJobsInPhase)
|
|
451
|
+
env:
|
|
452
|
+
FORCE_COLOR: 1
|
|
453
|
+
- task: PublishBuildArtifacts@1
|
|
454
|
+
condition: failed()
|
|
455
|
+
inputs:
|
|
456
|
+
pathToPublish: output
|
|
457
|
+
artifactName: codeceptjs-output-$(System.JobPositionInPhase)
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
For WebDriver, run Selenium as a sidecar before tests:
|
|
461
|
+
|
|
462
|
+
```yaml
|
|
463
|
+
- script: docker run -d --net=host --shm-size=2g selenium/standalone-chrome
|
|
464
|
+
displayName: Start Selenium
|
|
465
|
+
- script: |
|
|
466
|
+
export SELENIUM_HOST=localhost SELENIUM_PORT=4444
|
|
467
|
+
npx codeceptjs run-workers 2 --by pool
|
|
468
|
+
displayName: Run tests
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
## Docker
|
|
472
|
+
|
|
473
|
+
The official `codeceptjs/codeceptjs` image runs Playwright, Puppeteer, and WebDriver suites without further setup. Pass runtime flags through `CODECEPT_ARGS` and the worker count through `NO_OF_WORKERS`. See [Docker](/docker) for the full reference and Compose examples.
|
|
474
|
+
|
|
475
|
+
## Tips
|
|
476
|
+
|
|
477
|
+
- **Raise per-test timeouts in CI.** CI machines are slower than your laptop. Bump `timeout` in `codecept.conf.js` when assertions race the page.
|
|
478
|
+
- **Diagnose from logs.** Re-run with `--debug` or `DEBUG=codeceptjs:*` when a job fails and you cannot reproduce locally.
|
|
479
|
+
- **Selenium Chrome: always `--shm-size=2g`.** The default 64 MB causes tab crashes on heavy pages.
|
|
480
|
+
- **Custom Playwright images: install OS deps.** When you cannot use `mcr.microsoft.com/playwright`, run `npx playwright install --with-deps` to pull in `libnss`, fonts, and other system libraries.
|
|
481
|
+
- **Upload `output/` only on failure.** Successful runs produce no useful artifacts.
|
|
482
|
+
|
|
483
|
+
## See also
|
|
484
|
+
|
|
485
|
+
- [Playwright CI guide](https://playwright.dev/docs/ci) — upstream notes on browser install, sharding, and per-platform config.
|
|
486
|
+
- [Playwright Docker image](https://playwright.dev/docs/docker) — image tags and the version-pinning rule.
|
|
487
|
+
- [WebdriverIO Selenium Grid](https://webdriver.io/docs/seleniumgrid) — connection options for `host`/`port`/`path`.
|
|
488
|
+
- [Selenium Docker images](https://github.com/SeleniumHQ/docker-selenium) — image variants (`standalone-chrome`, `standalone-firefox`, debug images with VNC).
|
|
489
|
+
|
|
490
|
+
## Community recipes
|
|
491
|
+
|
|
492
|
+
- [CodeceptJS — Codefresh Integration](https://codecept.discourse.group/t/codeceptjs-codefresh-integration/)
|
|
493
|
+
- [CodeceptJS — GitLab Integration](https://codecept.discourse.group/t/codeceptjs-gitlab-integration/)
|
|
494
|
+
- [CodeceptJS — Jenkins Integration](https://codecept.discourse.group/t/codeceptjs-jenkins-integration/)
|
|
495
|
+
- [CodeceptJS — TeamCity Integration](https://codecept.discourse.group/t/codeceptjs-integration-with-teamcity/)
|
|
496
|
+
|
|
497
|
+
Got a setup that works for you? [Share your recipe](https://codecept.discourse.group/c/CodeceptJS-issues-in-general/ci/9) and we will list it here.
|