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
package/docs/ai.md ADDED
@@ -0,0 +1,537 @@
1
+ ---
2
+ permalink: /ai
3
+ title: Testing with AI 🪄
4
+ ---
5
+
6
+ # 🪄 Testing with AI
7
+
8
+ **CodeceptJS is the first open-source test automation framework with AI** features to improve the testing experience. CodeceptJS uses AI provider like OpenAI or Anthropic to auto-heal failing tests, assist in writing tests, and more...
9
+
10
+ Think of it as your testing co-pilot built into the testing framework
11
+
12
+ > 🪄 **AI features for testing are experimental**. AI works only for web based testing with Playwright, WebDriver, etc. Those features will be improved based on user's experience.
13
+
14
+ ## How AI Improves Automated Testing
15
+
16
+ LLMs like ChatGPT can technically write automated tests for you. However, ChatGPT misses the context of your application so it will guess elements on page, instead of writing the code that works.
17
+
18
+ CodeceptJS can share the testing context with AI provider when asked questions about a test.
19
+
20
+ So, instead of asking "write me a test" it can ask "write a test for **this** page". GPT knows how to write CodeceptJS code, how to build good-looking semantic locators and how to analyze HTML to match them. Even more, GPT suggestions can be tested in real-time in a browser, making a feedback loop.
21
+
22
+ CodeceptJS AI can do the following:
23
+
24
+ - 🏋️‍♀️ **assist writing tests** in `pause()` or interactive shell mode
25
+ - 🚑 **self-heal failing tests** (can be used on CI)
26
+
27
+ ![](/img/fill_form.gif)
28
+
29
+ ## How it works
30
+
31
+ As we can't send a browser window with ChatGPT we are not be able to fully share the context. But we can chare HTML of the current page, which is quite enough to analyze and identify if a page contains an element which can be used in a test.
32
+
33
+ AI providers have limits on input tokens but HTML pages can be huge. However, some information from a web page may be irrelevant for testing. For instance, if you test a blog, you won't need text contents of a post, as it can't be used in locators. That's why CodeceptJS sends HTML with **all non-interactive HTML elements removed**. So, only links, buttons, fields, etc will be sent to AI as a context. In case you have clickable `<div>` but with no `role="button"` it will be ignored. Also, we minify HTML before sending.
34
+
35
+ Even though, the HTML is still quite big and may exceed the token limit. So we recommend using models with at least 16K input tokens, (approx. 50K of HTML text), which should be enough for most web pages. It is possible to strictly limit the size of HTML to not exceed tokens limit.
36
+
37
+ > ❗AI features require sending HTML contents to AI provider. Choosing one may depend on the descurity policy of your company. Ask your security department which AI providers you can use.
38
+
39
+ ## Set up AI Provider
40
+
41
+ CodeceptJS uses [Vercel AI SDK](https://ai-sdk.dev) to connect to different AI providers. To enable AI features, add an `ai` section to your `codecept.conf` file with a configured model.
42
+
43
+ ### Quick Start
44
+
45
+ Install the AI SDK and your preferred provider package:
46
+
47
+ ```bash
48
+ npm install ai @ai-sdk/openai
49
+ # or
50
+ npm install ai @ai-sdk/anthropic
51
+ ```
52
+
53
+ Then configure the model in your `codecept.conf.js`:
54
+
55
+ ```js
56
+ import { openai } from '@ai-sdk/openai'
57
+
58
+ export default {
59
+ // ... other config
60
+ ai: {
61
+ model: openai('gpt-5'),
62
+ },
63
+ }
64
+ ```
65
+
66
+ Once AI provider is configured run tests with `--ai` flag to enable AI features
67
+
68
+ ```
69
+ npx codeceptjs run --ai
70
+ ```
71
+
72
+ Below we list sample configuration for popular AI providers
73
+
74
+ ### OpenAI GPT
75
+
76
+ Install the OpenAI provider:
77
+
78
+ ```bash
79
+ npm install @ai-sdk/openai
80
+ ```
81
+
82
+ Set your API key as environment variable:
83
+
84
+ ```bash
85
+ export OPENAI_API_KEY=your-api-key
86
+ ```
87
+
88
+ Configure in `codecept.conf.js`:
89
+
90
+ ```js
91
+ import { openai } from '@ai-sdk/openai'
92
+
93
+ export default {
94
+ ai: {
95
+ model: openai('gpt-5'),
96
+ // or use gpt-4o, gpt-3.5-turbo, etc.
97
+ },
98
+ }
99
+ ```
100
+
101
+ ### Anthropic Claude
102
+
103
+ Install the Anthropic provider:
104
+
105
+ ```bash
106
+ npm install @ai-sdk/anthropic
107
+ ```
108
+
109
+ Set your API key as environment variable:
110
+
111
+ ```bash
112
+ export ANTHROPIC_API_KEY=your-api-key
113
+ ```
114
+
115
+ Configure in `codecept.conf.js`:
116
+
117
+ ```js
118
+ import { anthropic } from '@ai-sdk/anthropic'
119
+
120
+ export default {
121
+ ai: {
122
+ model: anthropic('claude-sonnet-4-6'),
123
+ // or use claude-opus-4-7, claude-haiku-4-5, etc.
124
+ },
125
+ }
126
+ ```
127
+
128
+ ### Google Gemini
129
+
130
+ Install the Google provider:
131
+
132
+ ```bash
133
+ npm install @ai-sdk/google
134
+ ```
135
+
136
+ Set your API key as environment variable:
137
+
138
+ ```bash
139
+ export GOOGLE_GENERATIVE_AI_API_KEY=your-api-key
140
+ ```
141
+
142
+ Configure in `codecept.conf.js`:
143
+
144
+ ```js
145
+ import { google } from '@ai-sdk/google'
146
+
147
+ export default {
148
+ ai: {
149
+ model: google('gemini-1.5-flash'),
150
+ // or use gemini-1.5-pro, gemini-2.0-flash-exp, etc.
151
+ },
152
+ }
153
+ ```
154
+
155
+ ### Other Providers
156
+
157
+ The AI SDK supports 20+ providers including:
158
+
159
+ - **xAI (Grok)**: `npm install @ai-sdk/xai`
160
+ - **Mistral**: `npm install @ai-sdk/mistral`
161
+ - **Groq**: `npm install @ai-sdk/groq`
162
+ - **Cohere**: `npm install @ai-sdk/cohere`
163
+ - **Azure OpenAI**: `npm install @ai-sdk/azure`
164
+
165
+ See [AI SDK Providers](https://ai-sdk.dev/docs/foundations/providers-and-models) for complete list and configuration details.
166
+
167
+ ## Writing Tests with AI Copilot
168
+
169
+ If AI features are enabled when using [interactive pause](/basics/#debug) with `pause()` command inside tests:
170
+
171
+ For instance, let's create a test to try ai features via `gt` command:
172
+
173
+ ```
174
+ npx codeceptjs gt
175
+ ```
176
+
177
+ Name a test and write the code. We will use `Scenario.only` instead of Scenario to execute only this exact test.
178
+
179
+ ```js
180
+ Feature('ai')
181
+
182
+ Scenario.only('test ai features', ({ I }) => {
183
+ I.amOnPage('https://getbootstrap.com/docs/5.1/examples/checkout/')
184
+ pause()
185
+ })
186
+ ```
187
+
188
+ Now run the test in debug mode with AI enabled:
189
+
190
+ ```
191
+ npx codeceptjs run --debug --ai
192
+ ```
193
+
194
+ When pause mode started you can ask GPT to fill in the fields on this page. Use natural language to describe your request, and provide enough details that AI could operate with it. It is important to include at least a space char in your input, otherwise, CodeceptJS will consider the input to be JavaScript code.
195
+
196
+ ```
197
+ I.fill checkout form with valid values without submitting it
198
+ ```
199
+
200
+ ![](/img/fill_form_1.png)
201
+
202
+ GPT will generate code and data and CodeceptJS will try to execute its code. If it succeeds, the code will be saved to history and you will be able to copy it to your test.
203
+
204
+ ![](/img/fill_form2.png)
205
+
206
+ This AI copilot works best with long static forms. In the case of complex and dynamic single-page applications, it may not perform as well, as the form may not be present on HTML page yet. For instance, interacting with calendars or inputs with real-time validations (like credit cards) can not yet be performed by AI.
207
+
208
+ Please keep in mind that GPT can't react to page changes and operates with static text only. This is why it is not ready yet to write the test completely. However, if you are new to CodeceptJS and automated testing AI copilot may help you write tests more efficiently.
209
+
210
+ > 👶 Enable AI copilot for junior test automation engineers. It may help them to get started with CodeceptJS and to write good semantic locators.
211
+
212
+ ## Self-Healing Tests
213
+
214
+ In large test suites, the cost of maintaining tests goes exponentially. That's why any effort that can improve the stability of tests pays itself. That's why CodeceptJS has concept of [heal recipes](./heal), functions that can be executed on a test failure. Those functions can try to revive the test and continue execution. When combined with AI, heal recipe can ask AI provider how to fix the test. It will provide error message, step being executed and HTML context of a page. Based on this information AI can suggest the code to be executed to fix the failing test.
215
+
216
+ AI healing can solve exactly one problem: if a locator of an element has changed, and an action can't be performed, **it matches a new locator, tries a command again, and continues executing a test**. For instance, if the "Sign in" button was renamed to "Login" or changed its class, it will detect a new locator of the button and will retry execution.
217
+
218
+ > You can define your own [heal recipes](./heal) that won't use AI to revive failing tests.
219
+
220
+ Heal actions \*\*work only on actions like `click`, `fillField`, etc, and won't work on assertions, waiters, grabbers, etc. Assertions can't be guessed by AI, the same way as grabbers, as this may lead to unpredictable results.
221
+
222
+ If Heal plugin successfully fixes the step, it will print a suggested change at the end of execution. Take it as actionable advice and use it to update the codebase. Heal plugin is supposed to be used on CI, and works automatically without human assistance.
223
+
224
+ To start, make sure [AI provider is connected](#set-up-ai-provider), and [heal recipes were created](/heal#how-to-start-healing) by running this command:
225
+
226
+ ```
227
+ npx codeceptjs generate:heal
228
+ ```
229
+
230
+ Heal recipes should be included into `codecept.conf.js` or `codecept.conf.ts` config file:
231
+
232
+ ```js
233
+ import './heal.js'
234
+
235
+ export const config = {
236
+ // ... your codeceptjs config
237
+ ```
238
+
239
+ Then enable `heal` plugin:
240
+
241
+ ```js
242
+ plugins: {
243
+ heal: {
244
+ enabled: true
245
+ }
246
+ }
247
+ ```
248
+
249
+ If you run tests in AI mode and a test fails, a request to AI provider will be sent
250
+
251
+ ```
252
+ npx codeceptjs run --ai
253
+ ```
254
+
255
+ ![](/img/heal.png)
256
+
257
+ When execution finishes, you will receive information on token usage and code suggestions proposed by AI.
258
+ By evaluating this information you will be able to check how effective AI can be for your case.
259
+
260
+ ## Analyze Results
261
+
262
+ When running tests with AI enabled, CodeceptJS can automatically analyze test failures and provide insights. The analyze plugin helps identify patterns in test failures and provides detailed explanations of what went wrong.
263
+
264
+ Enable the analyze plugin in your config:
265
+
266
+ ```js
267
+ plugins: {
268
+ analyze: {
269
+ enabled: true,
270
+ // analyze up to 3 failures in detail
271
+ analyze: 3,
272
+ // group similar failures when 5 or more tests fail
273
+ clusterize: 5,
274
+ // enable screenshot analysis (requires modal that can analyze screenshots)
275
+ vision: false
276
+ }
277
+ }
278
+ ```
279
+
280
+ When tests are executed with `--ai` flag, the analyze plugin will:
281
+
282
+ **Analyze Individual Failures**: For each failed test (up to the `analyze` limit), it will:
283
+
284
+ - Examine the error message and stack trace
285
+ - Review the test steps that led to the failure
286
+ - Provide a detailed explanation of what likely caused the failure
287
+ - Suggest possible fixes and improvements
288
+
289
+ Sample Analysis report:
290
+
291
+ When analyzing individual failures (less than `clusterize` threshold), the output looks like this:
292
+
293
+ ```
294
+ 🪄 AI REPORT:
295
+ --------------------------------
296
+ → Cannot submit registration form with invalid email 👀
297
+
298
+ * SUMMARY: Form submission failed due to invalid email format, system correctly shows validation message
299
+ * ERROR: expected element ".success-message" to be visible, but it is not present in DOM
300
+ * CATEGORY: Data errors (password incorrect, no options in select, invalid format, etc)
301
+ * STEPS: I.fillField('#email', 'invalid-email'); I.click('Submit'); I.see('.success-message')
302
+ * URL: /register
303
+
304
+ ```
305
+
306
+ > The 👀 emoji indicates that screenshot analysis was performed (when `vision: true`).
307
+
308
+ **Cluster Similar Failures**: When number of failures exceeds the `clusterize` threshold:
309
+
310
+ - Groups failures with similar error patterns
311
+ - Identifies common root causes
312
+ - Suggests fixes that could resolve multiple failures
313
+ - Helps prioritize which issues to tackle first
314
+
315
+ **Categorize Failures**: Automatically classifies failures into categories like:
316
+
317
+ - Browser/connection issues
318
+ - Network errors
319
+ - Element locator problems
320
+ - Navigation errors
321
+ - Code errors
322
+ - Data validation issues
323
+ - etc.
324
+
325
+ Clusterization output:
326
+
327
+ ```
328
+ 🪄 AI REPORT:
329
+ _______________________________
330
+
331
+ ## Group 1 🔍
332
+
333
+ * SUMMARY: Element locator failures across login flow
334
+ * CATEGORY: HTML / page elements (not found, not visible, etc)
335
+ * ERROR: Element "#login-button" is not visible
336
+ * STEP: I.click('#login-button')
337
+ * SUITE: Authentication
338
+ * TAG: @login
339
+ * AFFECTED TESTS (4):
340
+ x Cannot login with valid credentials
341
+ x Should show error on invalid login
342
+ x Login button should be disabled when form empty
343
+ x Should redirect to dashboard after login
344
+
345
+ ## Group 2 🌐
346
+
347
+ * SUMMARY: API timeout issues during user data fetch
348
+ * CATEGORY: Network errors (server error, timeout, etc)
349
+ * URL: /api/v1/users
350
+ * ERROR: Request failed with status code 504, Gateway Timeout
351
+ * SUITE: User Management
352
+ * AFFECTED TESTS (3):
353
+ x Should load user profile data
354
+ x Should display user settings
355
+ x Should fetch user notifications
356
+
357
+ ## Group 3 ⚠️
358
+
359
+ * SUMMARY: Form validation errors on registration page
360
+ * CATEGORY: Data errors (password incorrect, no options in select, invalid format, etc)
361
+ * ERROR: Expected field "password" to have error "Must be at least 8 characters"
362
+ * STEP: I.see('Must be at least 8 characters', '.error-message')
363
+ * SUITE: User Registration
364
+ * TAG: @registration
365
+ * AFFECTED TESTS (2):
366
+ x Should validate password requirements
367
+ x Should show all validation errors on submit
368
+ ```
369
+
370
+ If `vision: true` is enabled and your tests take screenshots on failure, the plugin will also analyze screenshots to provide additional visual context about the failure.
371
+
372
+ The analysis helps teams:
373
+
374
+ - Quickly understand the root cause of failures
375
+ - Identify patterns in failing tests
376
+ - Prioritize fixes based on impact
377
+ - Maintain more stable test suites
378
+
379
+ Run tests with both AI and analyze enabled:
380
+
381
+ ```bash
382
+ npx codeceptjs run --ai
383
+ ```
384
+
385
+ ## Advanced Configuration
386
+
387
+ AI prompts and HTML compression can be configured inside `ai` section of `codecept.conf` file:
388
+
389
+ ```js
390
+ ai: {
391
+ // configure AI model (required)
392
+ model: openai('gpt-4o-mini'),
393
+
394
+ // redefine prompts
395
+ prompts: {
396
+ // {}
397
+ },
398
+ // how to process HTML content
399
+ html: {
400
+ // {}
401
+ }
402
+ // limit the number of tokens to be
403
+ // used during one session
404
+ maxTokens: 100000
405
+ }
406
+ ```
407
+
408
+ ### Customizing Prompts
409
+
410
+ CodeceptJS uses three main prompts for AI features:
411
+
412
+ - `writeStep` - generates test code in interactive pause mode
413
+ - `healStep` - suggests fixes for failing tests
414
+ - `generatePageObject` - creates page objects from HTML
415
+
416
+ To customize a prompt, generate it using:
417
+
418
+ ```bash
419
+ npx codeceptjs generate:prompt <promptName>
420
+ # or use alias
421
+ npx codeceptjs gp <promptName>
422
+ ```
423
+
424
+ For example, to customize the heal step prompt:
425
+
426
+ ```bash
427
+ npx codeceptjs generate:prompt healStep
428
+ ```
429
+
430
+ This creates `prompts/healStep.js` file in your project root:
431
+
432
+ ```js
433
+ export default (html, { step, error, prevSteps }) => {
434
+ return [
435
+ {
436
+ role: 'user',
437
+ content: `As a test automation engineer I am testing web application using CodeceptJS.
438
+ I want to heal a test that fails. Here is the list of executed steps: ${prevSteps.map(s => s.toString()).join(', ')}
439
+ Propose how to adjust ${step.toCode()} step to fix the test.
440
+ Use locators in order of preference: semantic locator by text, CSS, XPath. Use codeblocks marked with \`\`\`
441
+ Here is the error message: ${error.message}
442
+ Here is HTML code of a page where the failure has happened: \n\n${html}`,
443
+ },
444
+ ]
445
+ }
446
+ ```
447
+
448
+ Modify this prompt to fit your needs. CodeceptJS will automatically load custom prompts from the `prompts/` directory when AI features are enabled.
449
+
450
+ You can also override prompts programmatically in config:
451
+
452
+ ```js
453
+ ai: {
454
+ prompts: {
455
+ writeStep: (html, input) => [{ role: 'user', content: 'As a test engineer...' }]
456
+ healStep: (html, { step, error, prevSteps }) => [{ role: 'user', content: 'As a test engineer...' }]
457
+ generatePageObject: (html, extraPrompt = '', rootLocator = null) => [{ role: 'user', content: 'As a test engineer...' }]
458
+ }
459
+ }
460
+ ```
461
+
462
+ HTML is processed before sending it to GPT to reduce the number of tokens used. You may need to adjust default settings to work with your application. For instance, the default strategy may remove some important elements, or contrary keep HTML elements that have no use for test automation.
463
+
464
+ Here is the default config:
465
+
466
+ ```js
467
+ ai: {
468
+ html: {
469
+ maxLength: 50000,
470
+ simplify: true,
471
+ minify: true,
472
+ interactiveElements: ['a', 'input', 'button', 'select', 'textarea', 'option'],
473
+ textElements: ['label', 'h1', 'h2'],
474
+ allowedAttrs: ['id', 'for', 'class', 'name', 'type', 'value', 'tabindex', 'aria-labelledby', 'aria-label', 'label', 'placeholder', 'title', 'alt', 'src', 'role'],
475
+ allowedRoles: ['button', 'checkbox', 'search', 'textbox', 'tab'],
476
+ }
477
+ }
478
+ ```
479
+
480
+ - `maxLength`: the size of HTML to cut to not reach the token limit. 50K is the current default but you may try to increase it or even set it to null.
481
+ - `simplify`: should we process HTML before sending to GPT. This will remove all non-interactive elements from HTML.
482
+ - `minify`: should HTML be additionally minified. This removed empty attributes, shortens notations, etc.
483
+ - `interactiveElements`: explicit list of all elements that are considered interactive.
484
+ - `textElements`: elements that contain text which can be used for test automation.
485
+ - `allowedAttrs`: explicit list of attributes that may be used to construct locators. If you use special `data-` attributes to enable locators, add them to the list.
486
+ - `allowedRoles`: list of roles that make standard elements interactive.
487
+
488
+ It is recommended to try HTML processing on one of your web pages before launching AI features of CodeceptJS.
489
+
490
+ To do that open the common page of your application and using DevTools copy the outerHTML of `<html>` element. Don't use `Page Source` for that, as it may not include dynamically added HTML elements. Save this HTML into a file and create a NodeJS script:
491
+
492
+ ```js
493
+ import { removeNonInteractiveElements } from 'codeceptjs/lib/html'
494
+ import fs from 'fs'
495
+
496
+ const htmlOpts = {
497
+ interactiveElements: ['a', 'input', 'button', 'select', 'textarea', 'label', 'option'],
498
+ allowedAttrs: ['id', 'for', 'class', 'name', 'type', 'value', 'aria-labelledby', 'aria-label', 'label', 'placeholder', 'title', 'alt', 'src', 'role'],
499
+ textElements: ['label', 'h1', 'h2'],
500
+ allowedRoles: ['button', 'checkbox', 'search', 'textbox', 'tab'],
501
+ }
502
+
503
+ html = fs.readFileSync('saved.html', 'utf8')
504
+ const result = removeNonInteractiveElements(html, htmlOpts)
505
+
506
+ console.log(result)
507
+ ```
508
+
509
+ Tune the options until you are satisfied with the results and use this as `html` config for `ai` section inside `codecept.conf` file.
510
+ It is also recommended to check the source of [removeNonInteractiveElements](https://github.com/codeceptjs/CodeceptJS/blob/3.x/lib/html.js) and if needed propose improvements to it.
511
+
512
+ For instance, if you use `data-qa` attributes to specify locators and you want to include them in HTML, use the following config:
513
+
514
+ ```js
515
+ {
516
+ // inside codecept.conf.js
517
+ ai: {
518
+ html: {
519
+ allowedAttrs: ['data-qa', 'id', 'for', 'class', 'name', 'type', 'value', 'aria-labelledby', 'aria-label', 'label', 'placeholder', 'title', 'alt', 'src', 'role']
520
+ }
521
+ }
522
+ }
523
+ ```
524
+
525
+ ## Debugging
526
+
527
+ To debug AI features run tests with `DEBUG="codeceptjs:ai"` flag. This will print all prompts and responses from AI provider
528
+
529
+ ```
530
+ DEBUG="codeceptjs:ai" npx codeceptjs run --ai
531
+ ```
532
+
533
+ or if you run it in shell mode:
534
+
535
+ ```
536
+ DEBUG="codeceptjs:ai" npx codeceptjs shell --ai
537
+ ```