codeceptjs 4.0.2-beta.9 → 4.0.2
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/README.md +39 -28
- package/bin/codecept.js +15 -2
- package/bin/codeceptq.js +49 -0
- package/bin/mcp-server.js +1189 -0
- package/docs/advanced.md +201 -0
- package/docs/agents.md +181 -0
- package/docs/ai.md +489 -0
- package/docs/aitrace.md +266 -0
- package/docs/api.md +332 -0
- package/docs/architecture.md +235 -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 +185 -0
- package/docs/continuous-integration.md +431 -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 +107 -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/environment-variables.md +131 -0
- package/docs/examples.md +160 -0
- package/docs/heal.md +213 -0
- package/docs/helpers/ApiDataFactory.md +267 -0
- package/docs/helpers/Appium.md +1419 -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/MockRequest.md +377 -0
- package/docs/helpers/Playwright.md +2970 -0
- package/docs/helpers/Puppeteer-firefox.md +86 -0
- package/docs/helpers/Puppeteer.md +2583 -0
- package/docs/helpers/REST.md +289 -0
- package/docs/helpers/WebDriver.md +2639 -0
- package/docs/hooks.md +148 -0
- package/docs/index.md +111 -0
- package/docs/installation.md +121 -0
- package/docs/internal-test-server.md +89 -0
- package/docs/locators.md +355 -0
- package/docs/mcp.md +485 -0
- package/docs/migrate-from-cypress.md +98 -0
- package/docs/migrate-from-java.md +108 -0
- package/docs/migrate-from-protractor.md +101 -0
- package/docs/migrate-from-testcafe.md +99 -0
- package/docs/migration-4.md +745 -0
- package/docs/mobile.md +338 -0
- package/docs/pageobjects.md +399 -0
- package/docs/parallel.md +187 -0
- package/docs/playwright.md +714 -0
- package/docs/plugins/aiTrace.md +49 -0
- package/docs/plugins/analyze.md +66 -0
- package/docs/plugins/auth.md +241 -0
- package/docs/plugins/autoDelay.md +48 -0
- package/docs/plugins/browser.md +41 -0
- package/docs/plugins/coverage.md +39 -0
- package/docs/plugins/customLocator.md +119 -0
- package/docs/plugins/customReporter.md +16 -0
- package/docs/plugins/expose.md +75 -0
- package/docs/plugins/heal.md +44 -0
- package/docs/plugins/junitReporter.md +51 -0
- package/docs/plugins/pageInfo.md +34 -0
- package/docs/plugins/pause.md +43 -0
- package/docs/plugins/pauseOnFail.md +18 -0
- package/docs/plugins/retryFailedStep.md +75 -0
- package/docs/plugins/screencast.md +55 -0
- package/docs/plugins/screenshot.md +58 -0
- package/docs/plugins/screenshotOnFail.md +18 -0
- package/docs/plugins/stepTimeout.md +65 -0
- package/docs/plugins.md +87 -0
- package/docs/puppeteer.md +314 -0
- package/docs/quickstart.md +120 -0
- package/docs/reports.md +195 -0
- package/docs/retry.md +311 -0
- package/docs/secrets.md +150 -0
- package/docs/sessions.md +80 -0
- package/docs/shadow.md +68 -0
- package/docs/store.md +94 -0
- package/docs/test-structure.md +275 -0
- package/docs/timeouts.md +183 -0
- package/docs/translation.md +247 -0
- package/docs/tutorial.md +323 -0
- package/docs/typescript.md +159 -0
- package/docs/web-element.md +251 -0
- package/docs/webdriver.md +641 -0
- package/docs/within.md +55 -0
- package/lib/actor.js +1 -36
- package/lib/ai.js +3 -2
- package/lib/aria.js +260 -0
- package/lib/assertions.js +18 -0
- package/lib/codecept.js +34 -25
- package/lib/command/check.js +2 -1
- package/lib/command/definitions.js +6 -7
- package/lib/command/dryRun.js +24 -5
- package/lib/command/generate.js +3 -1
- package/lib/command/gherkin/snippets.js +5 -4
- package/lib/command/init.js +249 -270
- package/lib/command/list.js +150 -10
- package/lib/command/query.js +218 -0
- package/lib/command/run-multiple.js +3 -1
- package/lib/command/run-workers.js +2 -14
- package/lib/command/run.js +3 -17
- package/lib/command/utils.js +14 -0
- package/lib/command/workers/runTests.js +84 -41
- package/lib/config.js +96 -18
- package/lib/container.js +115 -17
- package/lib/effects.js +17 -0
- package/lib/element/WebElement.js +246 -2
- package/lib/els.js +12 -6
- package/lib/globals.js +32 -19
- package/lib/heal.js +7 -4
- package/lib/helper/ApiDataFactory.js +2 -1
- package/lib/helper/Appium.js +8 -8
- package/lib/helper/FileSystem.js +3 -2
- package/lib/helper/GraphQLDataFactory.js +2 -1
- package/lib/helper/Playwright.js +358 -467
- package/lib/helper/Puppeteer.js +335 -192
- package/lib/helper/WebDriver.js +324 -111
- package/lib/helper/errors/ElementNotFound.js +5 -2
- package/lib/helper/errors/MultipleElementsFound.js +52 -0
- package/lib/helper/errors/NonFocusedType.js +8 -0
- package/lib/helper/extras/Download.js +45 -0
- package/lib/helper/extras/PlaywrightLocator.js +7 -107
- package/lib/helper/extras/elementSelection.js +58 -0
- package/lib/helper/extras/focusCheck.js +43 -0
- package/lib/helper/extras/richTextEditor.js +178 -0
- package/lib/helper/scripts/dropFile.js +11 -0
- package/lib/history.js +3 -2
- package/lib/html.js +103 -16
- package/lib/index.js +9 -1
- package/lib/listener/config.js +6 -4
- package/lib/listener/emptyRun.js +2 -1
- package/lib/listener/globalRetry.js +32 -6
- package/lib/listener/helpers.js +4 -1
- package/lib/listener/mocha.js +2 -1
- package/lib/listener/pageobjects.js +43 -0
- package/lib/listener/result.js +3 -2
- package/lib/locator.js +158 -16
- package/lib/mocha/cli.js +19 -1
- package/lib/mocha/factory.js +11 -1
- package/lib/mocha/inject.js +1 -1
- package/lib/mocha/scenarioConfig.js +2 -1
- package/lib/mocha/ui.js +5 -6
- package/lib/parser.js +2 -2
- package/lib/pause.js +38 -4
- package/lib/plugin/aiTrace.js +457 -0
- package/lib/plugin/analyze.js +9 -9
- package/lib/plugin/auth.js +5 -4
- package/lib/plugin/browser.js +77 -0
- package/lib/plugin/expose.js +159 -0
- package/lib/plugin/heal.js +47 -3
- package/lib/plugin/junitReporter.js +303 -0
- package/lib/plugin/pageInfo.js +54 -52
- package/lib/plugin/pause.js +131 -0
- package/lib/plugin/pauseOnFail.js +11 -33
- package/lib/plugin/retryFailedStep.js +43 -32
- package/lib/plugin/screencast.js +289 -0
- package/lib/plugin/screenshot.js +558 -0
- package/lib/plugin/screenshotOnFail.js +9 -170
- package/lib/plugin/stepTimeout.js +3 -2
- package/lib/recorder.js +1 -1
- package/lib/rerun.js +2 -1
- package/lib/result.js +2 -1
- package/lib/step/base.js +10 -9
- package/lib/step/comment.js +2 -2
- package/lib/step/config.js +15 -2
- package/lib/step/helper.js +4 -4
- package/lib/step/meta.js +3 -3
- package/lib/step/record.js +5 -5
- package/lib/store.js +72 -3
- package/lib/translation.js +2 -1
- package/lib/utils/loaderCheck.js +28 -0
- package/lib/utils/mask_data.js +2 -1
- package/lib/utils/pluginParser.js +151 -0
- package/lib/utils/trace.js +297 -0
- package/lib/utils/typescript.js +188 -23
- package/lib/utils.js +77 -3
- package/lib/workers.js +65 -40
- package/package.json +35 -30
- package/typings/index.d.ts +119 -8
- package/typings/promiseBasedTypes.d.ts +3158 -6065
- package/typings/types.d.ts +3453 -6494
- package/docs/webapi/amOnPage.mustache +0 -11
- package/docs/webapi/appendField.mustache +0 -11
- package/docs/webapi/attachFile.mustache +0 -12
- 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 -9
- 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/dontSeeCurrentUrlEquals.mustache +0 -10
- package/docs/webapi/dontSeeElement.mustache +0 -8
- package/docs/webapi/dontSeeElementInDOM.mustache +0 -8
- package/docs/webapi/dontSeeInCurrentUrl.mustache +0 -4
- package/docs/webapi/dontSeeInField.mustache +0 -11
- 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 -16
- 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 -12
- 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/seeCurrentUrlEquals.mustache +0 -11
- package/docs/webapi/seeElement.mustache +0 -8
- package/docs/webapi/seeElementInDOM.mustache +0 -8
- package/docs/webapi/seeInCurrentUrl.mustache +0 -8
- package/docs/webapi/seeInField.mustache +0 -12
- 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 -21
- 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/helper/Mochawesome.js +0 -96
- package/lib/helper/extras/PlaywrightReactVueLocator.js +0 -52
- package/lib/helper/extras/React.js +0 -65
- package/lib/listener/enhancedGlobalRetry.js +0 -110
- package/lib/plugin/enhancedRetryFailedStep.js +0 -99
- package/lib/plugin/htmlReporter.js +0 -3648
- package/lib/plugin/stepByStepReport.js +0 -427
- package/lib/plugin/subtitles.js +0 -89
- package/lib/retryCoordinator.js +0 -207
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
---
|
|
2
|
+
permalink: /continuous-integration
|
|
3
|
+
title: Continuous Integration
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Continuous Integration
|
|
7
|
+
|
|
8
|
+
CodeceptJS runs in any CI that can install Node.js. This page covers the setup, then provides ready-to-use configs for the major CI systems.
|
|
9
|
+
|
|
10
|
+
## Setup
|
|
11
|
+
|
|
12
|
+
- **Node.js** — install it on the runner (`actions/setup-node`, the `node:20` image, `NodeTool@0` on Azure). Examples below use Node 20.
|
|
13
|
+
- **Headless** — `codecept.conf.js` must contain `setHeadlessWhen(process.env.HEADLESS || process.env.CI)`. `codeceptjs init` adds it; since CI sets `CI=true`, the suite runs headless automatically.
|
|
14
|
+
|
|
15
|
+
```js
|
|
16
|
+
import { setHeadlessWhen } from '@codeceptjs/configure'
|
|
17
|
+
|
|
18
|
+
setHeadlessWhen(process.env.HEADLESS || process.env.CI)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Override the browser or viewport per run with the [`browser` plugin](/plugins#browser): `-p browser:browser=firefox:windowSize=1280x1024`.
|
|
22
|
+
- **Artifacts** — enable the on-failure capture plugins:
|
|
23
|
+
|
|
24
|
+
```js
|
|
25
|
+
plugins: {
|
|
26
|
+
screenshot: { enabled: true }, // screenshot on failure
|
|
27
|
+
pageInfo: { enabled: true }, // page URL, HTML errors, console logs
|
|
28
|
+
aiTrace: { enabled: true, on: 'fail' }, // AI-friendly trace.md
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
[`screencast`](/plugins#screencast) records video of failed tests (Playwright). Everything lands in `output/` — upload that directory as a build artifact. Every example below does.
|
|
33
|
+
|
|
34
|
+
## Browsers and drivers
|
|
35
|
+
|
|
36
|
+
- **Playwright** — `npx playwright install --with-deps`. Docs: [Playwright CI](https://playwright.dev/docs/ci), [Playwright Docker image](https://playwright.dev/docs/docker) (pin the tag to your installed `playwright` version).
|
|
37
|
+
- **WebDriver** — nothing to provision. WebdriverIO 9 downloads and starts both the browser (Chrome, Chromium, or Firefox) and the matching driver automatically. No Selenium server, no browser-install step. Docs: [WebDriver helper](/webdriver), [WebdriverIO driver/browser management](https://webdriver.io/docs/driverbinaries/).
|
|
38
|
+
|
|
39
|
+
## Check before running
|
|
40
|
+
|
|
41
|
+
`npx codeceptjs check` loads the config, opens the browser, and counts tests. Prepend it so a broken environment fails fast with a clear message:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npx codeceptjs check
|
|
45
|
+
npx codeceptjs run
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Every CI example below does this.
|
|
49
|
+
|
|
50
|
+
## Parallel execution
|
|
51
|
+
|
|
52
|
+
- `npx codeceptjs run` — one process.
|
|
53
|
+
- `npx codeceptjs run-workers 4` — parallel on one machine, tests handed to workers dynamically.
|
|
54
|
+
- `npx codeceptjs run --shard 1/4` — split the suite across CI matrix jobs (one shard per machine).
|
|
55
|
+
|
|
56
|
+
Shards and workers combine. Full reference: [Parallel Execution](/parallel).
|
|
57
|
+
|
|
58
|
+
## Reporting
|
|
59
|
+
|
|
60
|
+
Use [`@testomatio/reporter`](https://github.com/testomatio/reporter). It ships pipes that publish results into GitHub PR checks, GitLab merge-request widgets, and Bitbucket pipeline reports. [See Reporting](/reports).
|
|
61
|
+
|
|
62
|
+
## CI examples
|
|
63
|
+
|
|
64
|
+
Each example uses Playwright by default; a WebDriver variant follows where it differs. WebdriverIO 9 downloads its own browser and driver, so the WebDriver variants run on a plain `node:20` image with no Selenium service and no browser-install step. For Playwright, a `node:20` base image plus `npx playwright install --with-deps` keeps these configs free of version pins.
|
|
65
|
+
|
|
66
|
+
### GitHub Actions — Playwright
|
|
67
|
+
|
|
68
|
+
`.github/workflows/tests.yml`:
|
|
69
|
+
|
|
70
|
+
```yaml
|
|
71
|
+
name: Tests
|
|
72
|
+
on:
|
|
73
|
+
push:
|
|
74
|
+
branches: [main]
|
|
75
|
+
pull_request:
|
|
76
|
+
|
|
77
|
+
env:
|
|
78
|
+
FORCE_COLOR: 1
|
|
79
|
+
|
|
80
|
+
jobs:
|
|
81
|
+
test:
|
|
82
|
+
runs-on: ubuntu-latest
|
|
83
|
+
timeout-minutes: 30
|
|
84
|
+
steps:
|
|
85
|
+
- uses: actions/checkout@v4
|
|
86
|
+
- uses: actions/setup-node@v4
|
|
87
|
+
with:
|
|
88
|
+
node-version: 20
|
|
89
|
+
cache: npm
|
|
90
|
+
- run: npm ci
|
|
91
|
+
- run: npx playwright install --with-deps chromium
|
|
92
|
+
- run: npx codeceptjs check
|
|
93
|
+
- run: npx codeceptjs run-workers 4 --by pool
|
|
94
|
+
- uses: actions/upload-artifact@v4
|
|
95
|
+
if: failure()
|
|
96
|
+
with:
|
|
97
|
+
name: codeceptjs-output
|
|
98
|
+
path: output/
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### GitHub Actions — WebDriver
|
|
102
|
+
|
|
103
|
+
WebdriverIO 9 downloads its own browser and driver, so the job is just `npm ci` + run — no Selenium service, no browser-install step. This mirrors [WebdriverIO's own boilerplate CI](https://github.com/webdriverio/jasmine-boilerplate/blob/master/.github/workflows/ci.yaml).
|
|
104
|
+
|
|
105
|
+
```yaml
|
|
106
|
+
name: WebDriver Tests
|
|
107
|
+
on: [push, pull_request]
|
|
108
|
+
|
|
109
|
+
jobs:
|
|
110
|
+
test:
|
|
111
|
+
runs-on: ubuntu-latest
|
|
112
|
+
env:
|
|
113
|
+
FORCE_COLOR: 1
|
|
114
|
+
steps:
|
|
115
|
+
- uses: actions/checkout@v4
|
|
116
|
+
- uses: actions/setup-node@v4
|
|
117
|
+
with:
|
|
118
|
+
node-version: 20
|
|
119
|
+
- run: npm ci
|
|
120
|
+
- run: npx codeceptjs check
|
|
121
|
+
- run: npx codeceptjs run-workers 2 --by pool
|
|
122
|
+
- uses: actions/upload-artifact@v4
|
|
123
|
+
if: failure()
|
|
124
|
+
with:
|
|
125
|
+
name: codeceptjs-output
|
|
126
|
+
path: output/
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### GitHub Actions — sharded matrix
|
|
130
|
+
|
|
131
|
+
Each shard runs on its own runner in parallel:
|
|
132
|
+
|
|
133
|
+
```yaml
|
|
134
|
+
jobs:
|
|
135
|
+
test:
|
|
136
|
+
runs-on: ubuntu-latest
|
|
137
|
+
strategy:
|
|
138
|
+
fail-fast: false
|
|
139
|
+
matrix:
|
|
140
|
+
shard: ['1/4', '2/4', '3/4', '4/4']
|
|
141
|
+
steps:
|
|
142
|
+
- uses: actions/checkout@v4
|
|
143
|
+
- uses: actions/setup-node@v4
|
|
144
|
+
with:
|
|
145
|
+
node-version: 20
|
|
146
|
+
- run: npm ci
|
|
147
|
+
- run: npx playwright install --with-deps chromium
|
|
148
|
+
- run: npx codeceptjs check
|
|
149
|
+
- run: npx codeceptjs run --shard ${{ matrix.shard }}
|
|
150
|
+
- uses: actions/upload-artifact@v4
|
|
151
|
+
if: failure()
|
|
152
|
+
with:
|
|
153
|
+
name: output-${{ strategy.job-index }}
|
|
154
|
+
path: output/
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### GitHub Actions — browser matrix
|
|
158
|
+
|
|
159
|
+
Run the same suite across browsers and viewports via the [`browser` plugin](/plugins#browser) (`npm i --save-dev @codeceptjs/configure`):
|
|
160
|
+
|
|
161
|
+
```yaml
|
|
162
|
+
jobs:
|
|
163
|
+
test:
|
|
164
|
+
runs-on: ubuntu-latest
|
|
165
|
+
strategy:
|
|
166
|
+
fail-fast: false
|
|
167
|
+
matrix:
|
|
168
|
+
include:
|
|
169
|
+
- { browser: chromium, size: 1920x1080 }
|
|
170
|
+
- { browser: firefox, size: 1366x768 }
|
|
171
|
+
- { browser: webkit, size: 414x896 }
|
|
172
|
+
steps:
|
|
173
|
+
- uses: actions/checkout@v4
|
|
174
|
+
- uses: actions/setup-node@v4
|
|
175
|
+
with:
|
|
176
|
+
node-version: 20
|
|
177
|
+
- run: npm ci
|
|
178
|
+
- run: npx playwright install --with-deps
|
|
179
|
+
- run: npx codeceptjs check
|
|
180
|
+
- run: npx codeceptjs run -p browser:browser=${{ matrix.browser }}:windowSize=${{ matrix.size }}
|
|
181
|
+
- uses: actions/upload-artifact@v4
|
|
182
|
+
if: failure()
|
|
183
|
+
with:
|
|
184
|
+
name: output-${{ matrix.browser }}-${{ matrix.size }}
|
|
185
|
+
path: output/
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### GitLab CI
|
|
189
|
+
|
|
190
|
+
`.gitlab-ci.yml`:
|
|
191
|
+
|
|
192
|
+
```yaml
|
|
193
|
+
stages: [test]
|
|
194
|
+
|
|
195
|
+
playwright:
|
|
196
|
+
stage: test
|
|
197
|
+
image: node:20
|
|
198
|
+
variables:
|
|
199
|
+
FORCE_COLOR: "1"
|
|
200
|
+
parallel: 4
|
|
201
|
+
before_script:
|
|
202
|
+
- npm ci
|
|
203
|
+
- npx playwright install --with-deps chromium
|
|
204
|
+
script:
|
|
205
|
+
- npx codeceptjs check
|
|
206
|
+
- npx codeceptjs run --shard $CI_NODE_INDEX/$CI_NODE_TOTAL
|
|
207
|
+
artifacts:
|
|
208
|
+
when: on_failure
|
|
209
|
+
paths: [output/]
|
|
210
|
+
expire_in: 1 week
|
|
211
|
+
|
|
212
|
+
webdriver:
|
|
213
|
+
stage: test
|
|
214
|
+
image: node:20 # WebdriverIO 9 downloads its own browser and driver
|
|
215
|
+
script:
|
|
216
|
+
- npm ci
|
|
217
|
+
- npx codeceptjs check
|
|
218
|
+
- npx codeceptjs run-workers 2 --by pool
|
|
219
|
+
artifacts:
|
|
220
|
+
when: on_failure
|
|
221
|
+
paths: [output/]
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
`$CI_NODE_INDEX` is 1-based — it maps directly to CodeceptJS's `--shard` index.
|
|
225
|
+
|
|
226
|
+
### Bitbucket Pipelines
|
|
227
|
+
|
|
228
|
+
`bitbucket-pipelines.yml`:
|
|
229
|
+
|
|
230
|
+
```yaml
|
|
231
|
+
image: node:20
|
|
232
|
+
|
|
233
|
+
definitions:
|
|
234
|
+
caches:
|
|
235
|
+
playwright: ~/.cache/ms-playwright
|
|
236
|
+
|
|
237
|
+
pipelines:
|
|
238
|
+
default:
|
|
239
|
+
- parallel:
|
|
240
|
+
- step:
|
|
241
|
+
name: Playwright — shard 1/2
|
|
242
|
+
caches: [node, playwright]
|
|
243
|
+
script:
|
|
244
|
+
- npm ci
|
|
245
|
+
- npx playwright install --with-deps chromium
|
|
246
|
+
- npx codeceptjs check
|
|
247
|
+
- npx codeceptjs run --shard 1/2
|
|
248
|
+
artifacts: [output/**]
|
|
249
|
+
- step:
|
|
250
|
+
name: Playwright — shard 2/2
|
|
251
|
+
caches: [node, playwright]
|
|
252
|
+
script:
|
|
253
|
+
- npm ci
|
|
254
|
+
- npx playwright install --with-deps chromium
|
|
255
|
+
- npx codeceptjs check
|
|
256
|
+
- npx codeceptjs run --shard 2/2
|
|
257
|
+
artifacts: [output/**]
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
For WebDriver, no Selenium service or browser image is needed — WebdriverIO 9 downloads its own browser and driver:
|
|
261
|
+
|
|
262
|
+
```yaml
|
|
263
|
+
image: node:20
|
|
264
|
+
|
|
265
|
+
pipelines:
|
|
266
|
+
default:
|
|
267
|
+
- step:
|
|
268
|
+
script:
|
|
269
|
+
- npm ci
|
|
270
|
+
- npx codeceptjs check
|
|
271
|
+
- npx codeceptjs run-workers 2 --by pool
|
|
272
|
+
artifacts: [output/**]
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Jenkins
|
|
276
|
+
|
|
277
|
+
`Jenkinsfile` (declarative pipeline):
|
|
278
|
+
|
|
279
|
+
```groovy
|
|
280
|
+
pipeline {
|
|
281
|
+
agent {
|
|
282
|
+
docker {
|
|
283
|
+
image 'node:20'
|
|
284
|
+
args '-u root'
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
environment {
|
|
288
|
+
FORCE_COLOR = '1'
|
|
289
|
+
}
|
|
290
|
+
stages {
|
|
291
|
+
stage('Install') {
|
|
292
|
+
steps {
|
|
293
|
+
sh 'npm ci'
|
|
294
|
+
sh 'npx playwright install --with-deps chromium'
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
stage('Test') {
|
|
298
|
+
parallel {
|
|
299
|
+
stage('Shard 1/4') { steps { sh 'npx codeceptjs check && npx codeceptjs run --shard 1/4' } }
|
|
300
|
+
stage('Shard 2/4') { steps { sh 'npx codeceptjs check && npx codeceptjs run --shard 2/4' } }
|
|
301
|
+
stage('Shard 3/4') { steps { sh 'npx codeceptjs check && npx codeceptjs run --shard 3/4' } }
|
|
302
|
+
stage('Shard 4/4') { steps { sh 'npx codeceptjs check && npx codeceptjs run --shard 4/4' } }
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
post {
|
|
307
|
+
failure {
|
|
308
|
+
archiveArtifacts artifacts: 'output/**', allowEmptyArchive: true
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
For WebDriver, keep the same `node:20` agent — WebdriverIO 9 downloads its own browser and driver, so no Selenium container is needed:
|
|
315
|
+
|
|
316
|
+
```groovy
|
|
317
|
+
stage('Test') {
|
|
318
|
+
steps {
|
|
319
|
+
sh 'npx codeceptjs check'
|
|
320
|
+
sh 'npx codeceptjs run-workers 2 --by pool'
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### CircleCI
|
|
326
|
+
|
|
327
|
+
`.circleci/config.yml`:
|
|
328
|
+
|
|
329
|
+
```yaml
|
|
330
|
+
version: 2.1
|
|
331
|
+
|
|
332
|
+
jobs:
|
|
333
|
+
test:
|
|
334
|
+
docker:
|
|
335
|
+
- image: cimg/node:20.18-browsers
|
|
336
|
+
parallelism: 4
|
|
337
|
+
steps:
|
|
338
|
+
- checkout
|
|
339
|
+
- run: npm ci
|
|
340
|
+
- run: npx playwright install --with-deps chromium
|
|
341
|
+
- run: npx codeceptjs check
|
|
342
|
+
- run:
|
|
343
|
+
name: Run shard
|
|
344
|
+
command: |
|
|
345
|
+
INDEX=$((CIRCLE_NODE_INDEX + 1))
|
|
346
|
+
npx codeceptjs run --shard ${INDEX}/${CIRCLE_NODE_TOTAL}
|
|
347
|
+
- store_artifacts:
|
|
348
|
+
path: output
|
|
349
|
+
|
|
350
|
+
webdriver:
|
|
351
|
+
docker:
|
|
352
|
+
# WebdriverIO 9 downloads its own browser and driver
|
|
353
|
+
- image: cimg/node:20.18
|
|
354
|
+
steps:
|
|
355
|
+
- checkout
|
|
356
|
+
- run: npm ci
|
|
357
|
+
- run: npx codeceptjs check
|
|
358
|
+
- run: npx codeceptjs run-workers 2 --by pool
|
|
359
|
+
- store_artifacts:
|
|
360
|
+
path: output
|
|
361
|
+
|
|
362
|
+
workflows:
|
|
363
|
+
test:
|
|
364
|
+
jobs:
|
|
365
|
+
- test
|
|
366
|
+
- webdriver
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
`CIRCLE_NODE_INDEX` is 0-based, so add 1 to match CodeceptJS's 1-based `--shard` index.
|
|
370
|
+
|
|
371
|
+
### Azure Pipelines
|
|
372
|
+
|
|
373
|
+
`azure-pipelines.yml`:
|
|
374
|
+
|
|
375
|
+
```yaml
|
|
376
|
+
trigger: [main]
|
|
377
|
+
|
|
378
|
+
pool:
|
|
379
|
+
vmImage: ubuntu-latest
|
|
380
|
+
|
|
381
|
+
strategy:
|
|
382
|
+
parallel: 4
|
|
383
|
+
|
|
384
|
+
steps:
|
|
385
|
+
- task: NodeTool@0
|
|
386
|
+
inputs:
|
|
387
|
+
versionSpec: '20.x'
|
|
388
|
+
- script: npm ci
|
|
389
|
+
displayName: Install dependencies
|
|
390
|
+
- script: npx playwright install --with-deps chromium
|
|
391
|
+
displayName: Install browsers
|
|
392
|
+
- script: npx codeceptjs check
|
|
393
|
+
displayName: Check setup
|
|
394
|
+
- script: npx codeceptjs run --shard $(System.JobPositionInPhase)/$(System.TotalJobsInPhase)
|
|
395
|
+
displayName: Run shard $(System.JobPositionInPhase)/$(System.TotalJobsInPhase)
|
|
396
|
+
env:
|
|
397
|
+
FORCE_COLOR: 1
|
|
398
|
+
- task: PublishBuildArtifacts@1
|
|
399
|
+
condition: failed()
|
|
400
|
+
inputs:
|
|
401
|
+
pathToPublish: output
|
|
402
|
+
artifactName: codeceptjs-output-$(System.JobPositionInPhase)
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
For WebDriver, no extra setup is needed — WebdriverIO 9 downloads its own browser and driver:
|
|
406
|
+
|
|
407
|
+
```yaml
|
|
408
|
+
- script: |
|
|
409
|
+
npx codeceptjs check
|
|
410
|
+
npx codeceptjs run-workers 2 --by pool
|
|
411
|
+
displayName: Run tests
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
## Docker
|
|
415
|
+
|
|
416
|
+
The official `codeceptjs/codeceptjs` image runs Playwright, Puppeteer, and WebDriver suites with no extra setup. Pass runner flags through `CODECEPT_ARGS` and the worker count through `NO_OF_WORKERS`. See [Docker](/docker).
|
|
417
|
+
|
|
418
|
+
## See also
|
|
419
|
+
|
|
420
|
+
- [Playwright CI guide](https://playwright.dev/docs/ci) · [Playwright Docker image](https://playwright.dev/docs/docker)
|
|
421
|
+
- [WebdriverIO driver management](https://webdriver.io/blog/2023/07/31/driver-management/)
|
|
422
|
+
- [Parallel Execution](/parallel) · [Reports](/reports) · [Plugins](/plugins) · [Docker](/docker)
|
|
423
|
+
|
|
424
|
+
## Community recipes
|
|
425
|
+
|
|
426
|
+
- [CodeceptJS — Codefresh Integration](https://codecept.discourse.group/t/codeceptjs-codefresh-integration/)
|
|
427
|
+
- [CodeceptJS — GitLab Integration](https://codecept.discourse.group/t/codeceptjs-gitlab-integration/)
|
|
428
|
+
- [CodeceptJS — Jenkins Integration](https://codecept.discourse.group/t/codeceptjs-jenkins-integration/)
|
|
429
|
+
- [CodeceptJS — TeamCity Integration](https://codecept.discourse.group/t/codeceptjs-integration-with-teamcity/)
|
|
430
|
+
|
|
431
|
+
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.
|