codeceptjs 4.0.0-rc.2 → 4.0.0-rc.20

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 (294) hide show
  1. package/README.md +39 -27
  2. package/bin/codecept.js +15 -2
  3. package/bin/codeceptq.js +49 -0
  4. package/bin/mcp-server.js +1187 -0
  5. package/docs/advanced.md +201 -0
  6. package/docs/agents.md +159 -0
  7. package/docs/ai.md +537 -0
  8. package/docs/aitrace.md +266 -0
  9. package/docs/api.md +332 -0
  10. package/docs/assertions.md +415 -0
  11. package/docs/auth.md +318 -0
  12. package/docs/basics.md +424 -0
  13. package/docs/bdd.md +539 -0
  14. package/docs/best.md +240 -0
  15. package/docs/bootstrap.md +132 -0
  16. package/docs/commands.md +352 -0
  17. package/docs/community-helpers.md +63 -0
  18. package/docs/configuration.md +230 -0
  19. package/docs/continuous-integration.md +497 -0
  20. package/docs/custom-helpers.md +297 -0
  21. package/docs/data.md +448 -0
  22. package/docs/debugging.md +332 -0
  23. package/docs/detox.md +235 -0
  24. package/docs/docker.md +136 -0
  25. package/docs/effects.md +179 -0
  26. package/docs/element-based-testing.md +295 -0
  27. package/docs/element-selection.md +125 -0
  28. package/docs/els.md +328 -0
  29. package/docs/examples.md +161 -0
  30. package/docs/heal.md +213 -0
  31. package/docs/helpers/ApiDataFactory.md +267 -0
  32. package/docs/helpers/Appium.md +1405 -0
  33. package/docs/helpers/Detox.md +665 -0
  34. package/docs/helpers/ExpectHelper.md +275 -0
  35. package/docs/helpers/FileSystem.md +152 -0
  36. package/docs/helpers/GraphQL.md +152 -0
  37. package/docs/helpers/GraphQLDataFactory.md +226 -0
  38. package/docs/helpers/JSONResponse.md +255 -0
  39. package/docs/helpers/Mochawesome.md +8 -0
  40. package/docs/helpers/MockRequest.md +377 -0
  41. package/docs/helpers/MockServer.md +212 -0
  42. package/docs/helpers/Playwright.md +2969 -0
  43. package/docs/helpers/Polly.md +44 -0
  44. package/docs/helpers/Protractor.md +1769 -0
  45. package/docs/helpers/Puppeteer-firefox.md +86 -0
  46. package/docs/helpers/Puppeteer.md +2690 -0
  47. package/docs/helpers/REST.md +289 -0
  48. package/docs/helpers/SoftExpectHelper.md +352 -0
  49. package/docs/helpers/WebDriver.md +2682 -0
  50. package/docs/hooks.md +339 -0
  51. package/docs/index.md +111 -0
  52. package/docs/installation.md +83 -0
  53. package/docs/internal-api.md +265 -0
  54. package/docs/internal-test-server.md +89 -0
  55. package/docs/locators.md +355 -0
  56. package/docs/mcp.md +485 -0
  57. package/docs/migration-4.md +556 -0
  58. package/docs/mobile.md +338 -0
  59. package/docs/pageobjects.md +399 -0
  60. package/docs/parallel.md +585 -0
  61. package/docs/playwright.md +714 -0
  62. package/docs/plugins.md +866 -0
  63. package/docs/puppeteer.md +314 -0
  64. package/docs/quickstart.md +120 -0
  65. package/docs/react.md +70 -0
  66. package/docs/reports.md +483 -0
  67. package/docs/retry.md +274 -0
  68. package/docs/secrets.md +150 -0
  69. package/docs/sessions.md +80 -0
  70. package/docs/shadow.md +68 -0
  71. package/docs/test-structure.md +275 -0
  72. package/docs/timeouts.md +183 -0
  73. package/docs/translation.md +247 -0
  74. package/docs/tutorial.md +271 -0
  75. package/docs/typescript.md +374 -0
  76. package/docs/web-element.md +251 -0
  77. package/docs/webdriver.md +708 -0
  78. package/docs/within.md +55 -0
  79. package/lib/ai.js +3 -2
  80. package/lib/aria.js +260 -0
  81. package/lib/assertions.js +18 -0
  82. package/lib/codecept.js +26 -23
  83. package/lib/command/check.js +2 -1
  84. package/lib/command/dryRun.js +24 -5
  85. package/lib/command/generate.js +2 -0
  86. package/lib/command/gherkin/snippets.js +5 -4
  87. package/lib/command/init.js +248 -269
  88. package/lib/command/list.js +150 -10
  89. package/lib/command/query.js +218 -0
  90. package/lib/command/run-multiple.js +2 -0
  91. package/lib/command/run-workers.js +2 -0
  92. package/lib/command/run.js +1 -1
  93. package/lib/command/workers/runTests.js +10 -10
  94. package/lib/config.js +77 -4
  95. package/lib/container.js +114 -17
  96. package/lib/effects.js +17 -0
  97. package/lib/element/WebElement.js +246 -2
  98. package/lib/els.js +12 -6
  99. package/lib/globals.js +32 -19
  100. package/lib/heal.js +4 -3
  101. package/lib/helper/ApiDataFactory.js +2 -1
  102. package/lib/helper/Appium.js +8 -8
  103. package/lib/helper/FileSystem.js +3 -2
  104. package/lib/helper/GraphQLDataFactory.js +2 -1
  105. package/lib/helper/Playwright.js +228 -162
  106. package/lib/helper/Puppeteer.js +208 -76
  107. package/lib/helper/WebDriver.js +173 -68
  108. package/lib/helper/errors/MultipleElementsFound.js +27 -110
  109. package/lib/helper/errors/NonFocusedType.js +8 -0
  110. package/lib/helper/extras/Download.js +45 -0
  111. package/lib/helper/extras/PlaywrightReactVueLocator.js +45 -36
  112. package/lib/helper/extras/elementSelection.js +58 -0
  113. package/lib/helper/extras/focusCheck.js +43 -0
  114. package/lib/helper/extras/richTextEditor.js +178 -0
  115. package/lib/helper/scripts/dropFile.js +11 -0
  116. package/lib/history.js +3 -2
  117. package/lib/html.js +103 -16
  118. package/lib/index.js +9 -1
  119. package/lib/listener/config.js +6 -4
  120. package/lib/listener/emptyRun.js +2 -1
  121. package/lib/listener/globalRetry.js +32 -6
  122. package/lib/listener/helpers.js +4 -1
  123. package/lib/listener/mocha.js +2 -1
  124. package/lib/listener/pageobjects.js +43 -0
  125. package/lib/listener/result.js +3 -2
  126. package/lib/locator.js +126 -3
  127. package/lib/mocha/cli.js +14 -2
  128. package/lib/mocha/factory.js +7 -2
  129. package/lib/mocha/inject.js +1 -1
  130. package/lib/mocha/scenarioConfig.js +2 -1
  131. package/lib/mocha/ui.js +5 -6
  132. package/lib/parser.js +2 -2
  133. package/lib/pause.js +38 -4
  134. package/lib/plugin/aiTrace.js +453 -0
  135. package/lib/plugin/analyze.js +1 -1
  136. package/lib/plugin/auth.js +3 -3
  137. package/lib/plugin/browser.js +77 -0
  138. package/lib/plugin/expose.js +159 -0
  139. package/lib/plugin/heal.js +44 -1
  140. package/lib/plugin/pageInfo.js +53 -49
  141. package/lib/plugin/pause.js +131 -0
  142. package/lib/plugin/pauseOnFail.js +10 -34
  143. package/lib/plugin/retryFailedStep.js +28 -19
  144. package/lib/plugin/screencast.js +287 -0
  145. package/lib/plugin/screenshot.js +563 -0
  146. package/lib/plugin/screenshotOnFail.js +8 -171
  147. package/lib/rerun.js +2 -1
  148. package/lib/result.js +2 -1
  149. package/lib/step/base.js +3 -2
  150. package/lib/step/config.js +15 -2
  151. package/lib/step/record.js +2 -2
  152. package/lib/store.js +72 -3
  153. package/lib/translation.js +2 -1
  154. package/lib/utils/mask_data.js +2 -1
  155. package/lib/utils/pluginParser.js +151 -0
  156. package/lib/utils/trace.js +297 -0
  157. package/lib/utils.js +77 -3
  158. package/lib/workers.js +52 -22
  159. package/package.json +19 -13
  160. package/typings/index.d.ts +19 -5
  161. package/docs/webapi/amOnPage.mustache +0 -11
  162. package/docs/webapi/appendField.mustache +0 -11
  163. package/docs/webapi/attachFile.mustache +0 -12
  164. package/docs/webapi/blur.mustache +0 -18
  165. package/docs/webapi/checkOption.mustache +0 -13
  166. package/docs/webapi/clearCookie.mustache +0 -9
  167. package/docs/webapi/clearField.mustache +0 -9
  168. package/docs/webapi/click.mustache +0 -29
  169. package/docs/webapi/clickLink.mustache +0 -8
  170. package/docs/webapi/closeCurrentTab.mustache +0 -7
  171. package/docs/webapi/closeOtherTabs.mustache +0 -8
  172. package/docs/webapi/dontSee.mustache +0 -11
  173. package/docs/webapi/dontSeeCheckboxIsChecked.mustache +0 -10
  174. package/docs/webapi/dontSeeCookie.mustache +0 -8
  175. package/docs/webapi/dontSeeCurrentPathEquals.mustache +0 -10
  176. package/docs/webapi/dontSeeCurrentUrlEquals.mustache +0 -10
  177. package/docs/webapi/dontSeeElement.mustache +0 -8
  178. package/docs/webapi/dontSeeElementInDOM.mustache +0 -8
  179. package/docs/webapi/dontSeeInCurrentUrl.mustache +0 -4
  180. package/docs/webapi/dontSeeInField.mustache +0 -11
  181. package/docs/webapi/dontSeeInSource.mustache +0 -8
  182. package/docs/webapi/dontSeeInTitle.mustache +0 -8
  183. package/docs/webapi/dontSeeTraffic.mustache +0 -13
  184. package/docs/webapi/doubleClick.mustache +0 -13
  185. package/docs/webapi/downloadFile.mustache +0 -12
  186. package/docs/webapi/dragAndDrop.mustache +0 -9
  187. package/docs/webapi/dragSlider.mustache +0 -11
  188. package/docs/webapi/executeAsyncScript.mustache +0 -24
  189. package/docs/webapi/executeScript.mustache +0 -26
  190. package/docs/webapi/fillField.mustache +0 -16
  191. package/docs/webapi/flushNetworkTraffics.mustache +0 -5
  192. package/docs/webapi/focus.mustache +0 -13
  193. package/docs/webapi/forceClick.mustache +0 -28
  194. package/docs/webapi/forceRightClick.mustache +0 -18
  195. package/docs/webapi/grabAllWindowHandles.mustache +0 -7
  196. package/docs/webapi/grabAttributeFrom.mustache +0 -10
  197. package/docs/webapi/grabAttributeFromAll.mustache +0 -9
  198. package/docs/webapi/grabBrowserLogs.mustache +0 -9
  199. package/docs/webapi/grabCookie.mustache +0 -11
  200. package/docs/webapi/grabCssPropertyFrom.mustache +0 -11
  201. package/docs/webapi/grabCssPropertyFromAll.mustache +0 -10
  202. package/docs/webapi/grabCurrentUrl.mustache +0 -9
  203. package/docs/webapi/grabCurrentWindowHandle.mustache +0 -6
  204. package/docs/webapi/grabDataFromPerformanceTiming.mustache +0 -20
  205. package/docs/webapi/grabElementBoundingRect.mustache +0 -20
  206. package/docs/webapi/grabGeoLocation.mustache +0 -8
  207. package/docs/webapi/grabHTMLFrom.mustache +0 -10
  208. package/docs/webapi/grabHTMLFromAll.mustache +0 -9
  209. package/docs/webapi/grabNumberOfOpenTabs.mustache +0 -8
  210. package/docs/webapi/grabNumberOfVisibleElements.mustache +0 -9
  211. package/docs/webapi/grabPageScrollPosition.mustache +0 -8
  212. package/docs/webapi/grabPopupText.mustache +0 -5
  213. package/docs/webapi/grabRecordedNetworkTraffics.mustache +0 -10
  214. package/docs/webapi/grabSource.mustache +0 -8
  215. package/docs/webapi/grabTextFrom.mustache +0 -10
  216. package/docs/webapi/grabTextFromAll.mustache +0 -9
  217. package/docs/webapi/grabTitle.mustache +0 -8
  218. package/docs/webapi/grabValueFrom.mustache +0 -9
  219. package/docs/webapi/grabValueFromAll.mustache +0 -8
  220. package/docs/webapi/grabWebElement.mustache +0 -9
  221. package/docs/webapi/grabWebElements.mustache +0 -9
  222. package/docs/webapi/moveCursorTo.mustache +0 -12
  223. package/docs/webapi/openNewTab.mustache +0 -7
  224. package/docs/webapi/pressKey.mustache +0 -12
  225. package/docs/webapi/pressKeyDown.mustache +0 -12
  226. package/docs/webapi/pressKeyUp.mustache +0 -12
  227. package/docs/webapi/pressKeyWithKeyNormalization.mustache +0 -60
  228. package/docs/webapi/refreshPage.mustache +0 -6
  229. package/docs/webapi/resizeWindow.mustache +0 -6
  230. package/docs/webapi/rightClick.mustache +0 -14
  231. package/docs/webapi/saveElementScreenshot.mustache +0 -10
  232. package/docs/webapi/saveScreenshot.mustache +0 -12
  233. package/docs/webapi/say.mustache +0 -10
  234. package/docs/webapi/scrollIntoView.mustache +0 -11
  235. package/docs/webapi/scrollPageToBottom.mustache +0 -6
  236. package/docs/webapi/scrollPageToTop.mustache +0 -6
  237. package/docs/webapi/scrollTo.mustache +0 -12
  238. package/docs/webapi/see.mustache +0 -11
  239. package/docs/webapi/seeAttributesOnElements.mustache +0 -9
  240. package/docs/webapi/seeCheckboxIsChecked.mustache +0 -10
  241. package/docs/webapi/seeCookie.mustache +0 -8
  242. package/docs/webapi/seeCssPropertiesOnElements.mustache +0 -9
  243. package/docs/webapi/seeCurrentPathEquals.mustache +0 -10
  244. package/docs/webapi/seeCurrentUrlEquals.mustache +0 -11
  245. package/docs/webapi/seeElement.mustache +0 -8
  246. package/docs/webapi/seeElementInDOM.mustache +0 -8
  247. package/docs/webapi/seeInCurrentUrl.mustache +0 -8
  248. package/docs/webapi/seeInField.mustache +0 -12
  249. package/docs/webapi/seeInPopup.mustache +0 -8
  250. package/docs/webapi/seeInSource.mustache +0 -7
  251. package/docs/webapi/seeInTitle.mustache +0 -8
  252. package/docs/webapi/seeNumberOfElements.mustache +0 -11
  253. package/docs/webapi/seeNumberOfVisibleElements.mustache +0 -10
  254. package/docs/webapi/seeTextEquals.mustache +0 -9
  255. package/docs/webapi/seeTitleEquals.mustache +0 -8
  256. package/docs/webapi/seeTraffic.mustache +0 -36
  257. package/docs/webapi/selectOption.mustache +0 -21
  258. package/docs/webapi/setCookie.mustache +0 -16
  259. package/docs/webapi/setGeoLocation.mustache +0 -12
  260. package/docs/webapi/startRecordingTraffic.mustache +0 -8
  261. package/docs/webapi/startRecordingWebSocketMessages.mustache +0 -8
  262. package/docs/webapi/stopRecordingTraffic.mustache +0 -5
  263. package/docs/webapi/stopRecordingWebSocketMessages.mustache +0 -7
  264. package/docs/webapi/switchTo.mustache +0 -9
  265. package/docs/webapi/switchToNextTab.mustache +0 -10
  266. package/docs/webapi/switchToPreviousTab.mustache +0 -10
  267. package/docs/webapi/type.mustache +0 -21
  268. package/docs/webapi/uncheckOption.mustache +0 -13
  269. package/docs/webapi/wait.mustache +0 -8
  270. package/docs/webapi/waitForClickable.mustache +0 -11
  271. package/docs/webapi/waitForCookie.mustache +0 -9
  272. package/docs/webapi/waitForDetached.mustache +0 -10
  273. package/docs/webapi/waitForDisabled.mustache +0 -6
  274. package/docs/webapi/waitForElement.mustache +0 -11
  275. package/docs/webapi/waitForEnabled.mustache +0 -6
  276. package/docs/webapi/waitForFunction.mustache +0 -17
  277. package/docs/webapi/waitForInvisible.mustache +0 -10
  278. package/docs/webapi/waitForNumberOfTabs.mustache +0 -9
  279. package/docs/webapi/waitForText.mustache +0 -13
  280. package/docs/webapi/waitForValue.mustache +0 -10
  281. package/docs/webapi/waitForVisible.mustache +0 -10
  282. package/docs/webapi/waitInUrl.mustache +0 -9
  283. package/docs/webapi/waitNumberOfVisibleElements.mustache +0 -10
  284. package/docs/webapi/waitToHide.mustache +0 -10
  285. package/docs/webapi/waitUrlEquals.mustache +0 -10
  286. package/lib/helper/AI.js +0 -214
  287. package/lib/listener/enhancedGlobalRetry.js +0 -110
  288. package/lib/plugin/enhancedRetryFailedStep.js +0 -99
  289. package/lib/plugin/htmlReporter.js +0 -3648
  290. package/lib/plugin/stepByStepReport.js +0 -427
  291. package/lib/plugin/subtitles.js +0 -89
  292. package/lib/retryCoordinator.js +0 -207
  293. package/typings/promiseBasedTypes.d.ts +0 -9469
  294. package/typings/types.d.ts +0 -11402
@@ -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.