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