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,866 @@
1
+ ---
2
+ permalink: plugins
3
+ sidebarDepth:
4
+ sidebar: auto
5
+ title: Plugins
6
+ ---
7
+
8
+ <!-- Generated by documentation.js. Update this documentation by updating the source code. -->
9
+
10
+ ## aiTrace
11
+
12
+ Generates AI-friendly trace files for debugging with AI agents.
13
+ This plugin creates a markdown file with test execution logs and links to all artifacts
14
+ (screenshots, HTML, ARIA snapshots, browser logs, HTTP requests) for each step.
15
+
16
+ #### Configuration
17
+
18
+ ```js
19
+ "plugins": {
20
+ "aiTrace": {
21
+ "enabled": true
22
+ }
23
+ }
24
+ ```
25
+
26
+ Possible config options:
27
+
28
+ * `deleteSuccessful`: delete traces for successfully executed tests. Default: false.
29
+ * `fullPageScreenshots`: should full page screenshots be used. Default: false.
30
+ * `output`: a directory where traces should be stored. Default: `output`.
31
+ * `captureHTML`: capture HTML for each step. Default: true.
32
+ * `captureARIA`: capture ARIA snapshot for each step. Default: true.
33
+ * `captureBrowserLogs`: capture browser console logs. Default: true.
34
+ * `captureHTTP`: capture HTTP requests (requires `trace` or `recordHar` enabled in helper config). Default: true.
35
+ * `captureDebugOutput`: capture CodeceptJS debug output. Default: true.
36
+ * `ignoreSteps`: steps to ignore in trace. Array of RegExps is expected.
37
+
38
+ ### Parameters
39
+
40
+ * `config` **any**&#x20;
41
+
42
+ ## analyze
43
+
44
+ Uses AI to analyze test failures and provide insights
45
+
46
+ This plugin analyzes failed tests using AI to provide detailed explanations and group similar failures.
47
+ When enabled with --ai flag, it generates reports after test execution.
48
+
49
+ #### Usage
50
+
51
+ ```js
52
+ // in codecept.conf.js
53
+ exports.config = {
54
+ plugins: {
55
+ analyze: {
56
+ enabled: true,
57
+ clusterize: 5,
58
+ analyze: 2,
59
+ vision: false
60
+ }
61
+ }
62
+ }
63
+ ```
64
+
65
+ #### Configuration
66
+
67
+ * `clusterize` (number) - minimum number of failures to trigger clustering analysis. Default: 5
68
+ * `analyze` (number) - maximum number of individual test failures to analyze in detail. Default: 2
69
+ * `vision` (boolean) - enables visual analysis of test screenshots. Default: false
70
+ * `categories` (array) - list of failure categories for classification. Defaults to:
71
+ * Browser connection error / browser crash
72
+ * Network errors (server error, timeout, etc)
73
+ * HTML / page elements (not found, not visible, etc)
74
+ * Navigation errors (404, etc)
75
+ * Code errors (syntax error, JS errors, etc)
76
+ * Library & framework errors
77
+ * Data errors (password incorrect, invalid format, etc)
78
+ * Assertion failures
79
+ * Other errors
80
+ * `prompts` (object) - customize AI prompts for analysis
81
+ * `clusterize` - prompt for clustering analysis
82
+ * `analyze` - prompt for individual test analysis
83
+
84
+ #### Features
85
+
86
+ * Groups similar failures when number of failures >= clusterize value
87
+ * Provides detailed analysis of individual failures
88
+ * Analyzes screenshots if vision=true and screenshots are available
89
+ * Classifies failures into predefined categories
90
+ * Suggests possible causes and solutions
91
+
92
+ ### Parameters
93
+
94
+ * `config` **[Object][1]** Plugin configuration (optional, default `{}`)
95
+
96
+ Returns **void**&#x20;
97
+
98
+ ## auth
99
+
100
+ Logs user in for the first test and reuses session for next tests.
101
+ Works by saving cookies into memory or file.
102
+ If a session expires automatically logs in again.
103
+
104
+ > For better development experience cookies can be saved into file, so a session can be reused while writing tests.
105
+
106
+ #### Usage
107
+
108
+ 1. Enable this plugin and configure as described below
109
+ 2. Define user session names (example: `user`, `editor`, `admin`, etc).
110
+ 3. Define how users are logged in and how to check that user is logged in
111
+ 4. Use `login` object inside your tests to log in:
112
+
113
+ ```js
114
+ // inside a test file
115
+ // use login to inject auto-login function
116
+ Feature('Login');
117
+
118
+ Before(({ login }) => {
119
+ login('user'); // login using user session
120
+ });
121
+
122
+ // Alternatively log in for one scenario.
123
+ Scenario('log me in', ( { I, login } ) => {
124
+ login('admin');
125
+ I.see('I am logged in');
126
+ });
127
+ ```
128
+
129
+ #### Configuration
130
+
131
+ * `saveToFile` (default: false) - save cookies to file. Allows to reuse session between execution.
132
+ * `inject` (default: `login`) - name of the login function to use
133
+ * `users` - an array containing different session names and functions to:
134
+ * `login` - sign in into the system
135
+ * `check` - check that user is logged in
136
+ * `fetch` - to get current cookies (by default `I.grabCookie()`)
137
+ * `restore` - to set cookies (by default `I.amOnPage('/'); I.setCookie(cookie)`)
138
+
139
+ #### How It Works
140
+
141
+ 1. `restore` method is executed. It should open a page and set credentials.
142
+ 2. `check` method is executed. It should reload a page (so cookies are applied) and check that this page belongs to logged-in user. When you pass the second args `session`, you could perform the validation using passed session.
143
+ 3. If `restore` and `check` were not successful, `login` is executed
144
+ 4. `login` should fill in login form
145
+ 5. After successful login, `fetch` is executed to save cookies into memory or file.
146
+
147
+ #### Example: Simple login
148
+
149
+ ```js
150
+ auth: {
151
+ enabled: true,
152
+ saveToFile: true,
153
+ inject: 'login',
154
+ users: {
155
+ admin: {
156
+ // loginAdmin function is defined in `steps_file.js`
157
+ login: (I) => I.loginAdmin(),
158
+ // if we see `Admin` on page, we assume we are logged in
159
+ check: (I) => {
160
+ I.amOnPage('/');
161
+ I.see('Admin');
162
+ }
163
+ }
164
+ }
165
+ }
166
+ ```
167
+
168
+ #### Example: Multiple users
169
+
170
+ ```js
171
+ auth: {
172
+ enabled: true,
173
+ saveToFile: true,
174
+ inject: 'loginAs', // use `loginAs` instead of login
175
+ users: {
176
+ user: {
177
+ login: (I) => {
178
+ I.amOnPage('/login');
179
+ I.fillField('email', 'user@site.com');
180
+ I.fillField('password', '123456');
181
+ I.click('Login');
182
+ },
183
+ check: (I) => {
184
+ I.amOnPage('/');
185
+ I.see('User', '.navbar');
186
+ },
187
+ },
188
+ admin: {
189
+ login: (I) => {
190
+ I.amOnPage('/login');
191
+ I.fillField('email', 'admin@site.com');
192
+ I.fillField('password', '123456');
193
+ I.click('Login');
194
+ },
195
+ check: (I) => {
196
+ I.amOnPage('/');
197
+ I.see('Admin', '.navbar');
198
+ },
199
+ },
200
+ }
201
+ }
202
+ ```
203
+
204
+ #### Example: Keep cookies between tests
205
+
206
+ If you decide to keep cookies between tests you don't need to save/retrieve cookies between tests.
207
+ But you need to login once work until session expires.
208
+ For this case, disable `fetch` and `restore` methods.
209
+
210
+ ```js
211
+ helpers: {
212
+ WebDriver: {
213
+ // config goes here
214
+ keepCookies: true; // keep cookies for all tests
215
+ }
216
+ },
217
+ plugins: {
218
+ auth: {
219
+ users: {
220
+ admin: {
221
+ login: (I) => {
222
+ I.amOnPage('/login');
223
+ I.fillField('email', 'admin@site.com');
224
+ I.fillField('password', '123456');
225
+ I.click('Login');
226
+ },
227
+ check: (I) => {
228
+ I.amOnPage('/dashboard');
229
+ I.see('Admin', '.navbar');
230
+ },
231
+ fetch: () => {}, // empty function
232
+ restore: () => {}, // empty funciton
233
+ }
234
+ }
235
+ }
236
+ }
237
+ ```
238
+
239
+ #### Example: Getting sessions from local storage
240
+
241
+ If your session is stored in local storage instead of cookies you still can obtain sessions.
242
+
243
+ ```js
244
+ plugins: {
245
+ auth: {
246
+ admin: {
247
+ login: (I) => I.loginAsAdmin(),
248
+ check: (I) => I.see('Admin', '.navbar'),
249
+ fetch: (I) => {
250
+ return I.executeScript(() => localStorage.getItem('session_id'));
251
+ },
252
+ restore: (I, session) => {
253
+ I.amOnPage('/');
254
+ I.executeScript((session) => localStorage.setItem('session_id', session), session);
255
+ },
256
+ }
257
+ }
258
+ }
259
+ ```
260
+
261
+ #### Tips: Using async function in the auth
262
+
263
+ If you use async functions in the auth plugin, login function should be used with `await` keyword.
264
+
265
+ ```js
266
+ auth: {
267
+ enabled: true,
268
+ saveToFile: true,
269
+ inject: 'login',
270
+ users: {
271
+ admin: {
272
+ login: async (I) => { // If you use async function in the auth plugin
273
+ const phrase = await I.grabTextFrom('#phrase')
274
+ I.fillField('username', 'admin'),
275
+ I.fillField('password', 'password')
276
+ I.fillField('phrase', phrase)
277
+ },
278
+ check: (I) => {
279
+ I.amOnPage('/');
280
+ I.see('Admin');
281
+ },
282
+ }
283
+ }
284
+ }
285
+ ```
286
+
287
+ ```js
288
+ Scenario('login', async ( {I, login} ) => {
289
+ await login('admin') // you should use `await`
290
+ })
291
+ ```
292
+
293
+ #### Tips: Using session to validate user
294
+
295
+ Instead of asserting on page elements for the current user in `check`, you can use the `session` you saved in `fetch`
296
+
297
+ ```js
298
+ auth: {
299
+ enabled: true,
300
+ saveToFile: true,
301
+ inject: 'login',
302
+ users: {
303
+ admin: {
304
+ login: async (I) => { // If you use async function in the auth plugin
305
+ const phrase = await I.grabTextFrom('#phrase')
306
+ I.fillField('username', 'admin'),
307
+ I.fillField('password', 'password')
308
+ I.fillField('phrase', phrase)
309
+ },
310
+ check: (I, session) => {
311
+ // Throwing an error in `check` will make CodeceptJS perform the login step for the user
312
+ if (session.profile.email !== the.email.you.expect@some-mail.com) {
313
+ throw new Error ('Wrong user signed in');
314
+ }
315
+ },
316
+ }
317
+ }
318
+ }
319
+ ```
320
+
321
+ ```js
322
+ Scenario('login', async ( {I, login} ) => {
323
+ await login('admin') // you should use `await`
324
+ })
325
+ ```
326
+
327
+ ### Parameters
328
+
329
+ * `config` &#x20;
330
+
331
+ ## autoDelay
332
+
333
+ Sometimes it takes some time for a page to respond to user's actions.
334
+ Depending on app's performance this can be either slow or fast.
335
+
336
+ For instance, if you click a button and nothing happens - probably JS event is not attached to this button yet
337
+ Also, if you fill field and input validation doesn't accept your input - maybe because you typed value too fast.
338
+
339
+ This plugin allows to slow down tests execution when a test running too fast.
340
+ It puts a tiny delay for before and after action commands.
341
+
342
+ Commands affected (by default):
343
+
344
+ * `click`
345
+ * `fillField`
346
+ * `checkOption`
347
+ * `pressKey`
348
+ * `doubleClick`
349
+ * `rightClick`
350
+
351
+ #### Configuration
352
+
353
+ ```js
354
+ plugins: {
355
+ autoDelay: {
356
+ enabled: true
357
+ }
358
+ }
359
+ ```
360
+
361
+ Possible config options:
362
+
363
+ * `methods`: list of affected commands. Can be overridden
364
+ * `delayBefore`: put a delay before a command. 100ms by default
365
+ * `delayAfter`: put a delay after a command. 200ms by default
366
+
367
+ ### Parameters
368
+
369
+ * `config` &#x20;
370
+
371
+ ## browser
372
+
373
+ Overrides browser helper config from the command line. Works for all browser helpers
374
+ (Playwright, Puppeteer, WebDriver, Appium) without touching `codecept.conf`.
375
+
376
+ Enable it via `-p` option with one or more colon-chained args:
377
+
378
+ npx codeceptjs run -p browser:show
379
+ npx codeceptjs run -p browser:hide
380
+ npx codeceptjs run -p browser:browser=firefox
381
+ npx codeceptjs run -p browser:windowSize=1024x768:video=false
382
+ npx codeceptjs run -p browser:hide:browser=webkit:windowSize=800x600
383
+
384
+ #### Args
385
+
386
+ * **show** — force visible browser
387
+ * **hide** — force headless (also injects `--headless` into WebDriver chrome/firefox capability args)
388
+ * **`<key>=<value>`** — set `helpers.<eachBrowserHelper>.<key> = <value>`. Three keys
389
+ get per-helper translation via `setBrowserConfig`:
390
+ * `browser=<name>` — Puppeteer receives `product`, Playwright receives `browser`
391
+ * `windowSize=WxH` — also adds `--window-size=W,H` chromium/chrome args
392
+ * `show=true|false` — toggles `show` on Playwright/Puppeteer; injects/strips
393
+ `--headless` in WebDriver chrome/firefox capability args
394
+
395
+ Values stay as strings. `true` / `false` are coerced to booleans.
396
+
397
+ Requires `@codeceptjs/configure` to be installed; if missing, the plugin
398
+ logs a hint and skips the override.
399
+
400
+ ### Parameters
401
+
402
+ * `config` (optional, default `{}`)
403
+
404
+ ## coverage
405
+
406
+ Dumps code coverage from Playwright/Puppeteer after every test.
407
+
408
+ #### Configuration
409
+
410
+ ```js
411
+ plugins: {
412
+ coverage: {
413
+ enabled: true,
414
+ debug: true,
415
+ name: 'CodeceptJS Coverage Report',
416
+ outputDir: 'output/coverage'
417
+ }
418
+ }
419
+ ```
420
+
421
+ Possible config options, More could be found at [monocart-coverage-reports][2]
422
+
423
+ * `debug`: debug info. By default, false.
424
+ * `name`: coverage report name.
425
+ * `outputDir`: path to coverage report.
426
+ * `sourceFilter`: filter the source files.
427
+ * `sourcePath`: option to resolve a custom path.
428
+
429
+ ### Parameters
430
+
431
+ * `config` &#x20;
432
+
433
+ ## customLocator
434
+
435
+ Creates a [custom locator][3] by using special attributes in HTML.
436
+
437
+ If you have a convention to use `data-test-id` or `data-qa` attributes to mark active elements for e2e tests,
438
+ you can enable this plugin to simplify matching elements with these attributes:
439
+
440
+ ```js
441
+ // replace this:
442
+ I.click({ css: '[data-test-id=register_button]');
443
+ // with this:
444
+ I.click('$register_button');
445
+ ```
446
+
447
+ This plugin will create a valid XPath locator for you.
448
+
449
+ #### Configuration
450
+
451
+ * `enabled` (default: `false`) should a locator be enabled
452
+ * `prefix` (default: `$`) sets a prefix for a custom locator.
453
+ * `attribute` (default: `data-test-id`) to set an attribute to be matched.
454
+ * `strategy` (default: `xpath`) actual locator strategy to use in query (`css` or `xpath`).
455
+ * `showActual` (default: false) show in the output actually produced XPath or CSS locator. By default shows custom locator value.
456
+
457
+ #### Examples:
458
+
459
+ Using `data-test` attribute with `$` prefix:
460
+
461
+ ```js
462
+ // in codecept.conf.js
463
+ plugins: {
464
+ customLocator: {
465
+ enabled: true,
466
+ attribute: 'data-test'
467
+ }
468
+ }
469
+ ```
470
+
471
+ In a test:
472
+
473
+ ```js
474
+ I.seeElement('$user'); // matches => [data-test=user]
475
+ I.click('$sign-up'); // matches => [data-test=sign-up]
476
+ ```
477
+
478
+ Using `data-qa` attribute with `=` prefix:
479
+
480
+ ```js
481
+ // in codecept.conf.js
482
+ plugins: {
483
+ customLocator: {
484
+ enabled: true,
485
+ prefix: '=',
486
+ attribute: 'data-qa'
487
+ }
488
+ }
489
+ ```
490
+
491
+ In a test:
492
+
493
+ ```js
494
+ I.seeElement('=user'); // matches => [data-qa=user]
495
+ I.click('=sign-up'); // matches => [data-qa=sign-up]
496
+ ```
497
+
498
+ Using `data-qa` OR `data-test` attribute with `=` prefix:
499
+
500
+ ```js
501
+ // in codecept.conf.js
502
+ plugins: {
503
+ customLocator: {
504
+ enabled: true,
505
+ prefix: '=',
506
+ attribute: ['data-qa', 'data-test'],
507
+ strategy: 'xpath'
508
+ }
509
+ }
510
+ ```
511
+
512
+ In a test:
513
+
514
+ ```js
515
+ I.seeElement('=user'); // matches => //*[@data-qa=user or @data-test=user]
516
+ I.click('=sign-up'); // matches => //*[data-qa=sign-up or @data-test=sign-up]
517
+ ```
518
+
519
+ ```js
520
+ // in codecept.conf.js
521
+ plugins: {
522
+ customLocator: {
523
+ enabled: true,
524
+ prefix: '=',
525
+ attribute: ['data-qa', 'data-test'],
526
+ strategy: 'css'
527
+ }
528
+ }
529
+ ```
530
+
531
+ In a test:
532
+
533
+ ```js
534
+ I.seeElement('=user'); // matches => [data-qa=user],[data-test=user]
535
+ I.click('=sign-up'); // matches => [data-qa=sign-up],[data-test=sign-up]
536
+ ```
537
+
538
+ ### Parameters
539
+
540
+ * `config` &#x20;
541
+
542
+ ## customReporter
543
+
544
+ Sample custom reporter for CodeceptJS.
545
+
546
+ ### Parameters
547
+
548
+ * `config` &#x20;
549
+
550
+ ## heal
551
+
552
+ Self-healing tests with AI.
553
+
554
+ Read more about heaking in [Self-Healing Tests][4]
555
+
556
+ ```js
557
+ plugins: {
558
+ heal: {
559
+ enabled: true,
560
+ }
561
+ }
562
+ ```
563
+
564
+ More config options are available:
565
+
566
+ * `healLimit` - how many steps can be healed in a single test (default: 2)
567
+
568
+ ### Parameters
569
+
570
+ * `config` (optional, default `{}`)
571
+
572
+ ## pageInfo
573
+
574
+ Collects information from web page after each failed test and adds it to the test as an artifact.
575
+ It is suggested to enable this plugin if you run tests on CI and you need to debug failed tests.
576
+ This plugin can be paired with `analyze` plugin to provide more context.
577
+
578
+ It collects URL, HTML errors (by classes), and browser logs.
579
+
580
+ Enable this plugin in config:
581
+
582
+ ```js
583
+ plugins: {
584
+ pageInfo: {
585
+ enabled: true,
586
+ }
587
+ ```
588
+
589
+ Additional config options:
590
+
591
+ * `errorClasses` - list of classes to search for errors (default: `['error', 'warning', 'alert', 'danger']`)
592
+ * `browserLogs` - list of types of errors to search for in browser logs (default: `['error']`)
593
+
594
+ ### Parameters
595
+
596
+ * `config` (optional, default `{}`)
597
+
598
+ ## pause
599
+
600
+ Pauses test execution interactively. Replaces the legacy `pauseOnFail` plugin.
601
+ Default `on=fail` matches the old `pauseOnFail` behavior.
602
+
603
+ ```js
604
+ plugins: {
605
+ pause: {
606
+ enabled: false,
607
+ on: 'fail',
608
+ }
609
+ }
610
+ ```
611
+
612
+ #### `on=` modes
613
+
614
+ * **fail** — pause when a step fails (default)
615
+ * **test** — pause after each test
616
+ * **step** — pause before the first step (interactive walk-through)
617
+ * **file** — pause when execution reaches `path=...[;line=...]`
618
+ * **url** — pause when the current URL matches `pattern=...`
619
+
620
+ CLI examples:
621
+
622
+ npx codeceptjs run -p pause
623
+ npx codeceptjs run -p pause:on=step
624
+ npx codeceptjs run -p pause:on=file:path=tests/login_test.js
625
+ npx codeceptjs run -p pause:on=file:path=tests/login_test.js;line=43
626
+ npx codeceptjs run -p pause:on=url:pattern=/users/*
627
+
628
+ > The legacy `pauseOnFail` plugin remains as a deprecated alias that emits a
629
+ > deprecation warning and forwards to `pause` with `on=fail`.
630
+
631
+ ### Parameters
632
+
633
+ * `config` (optional, default `{}`)
634
+
635
+ ## retryFailedStep
636
+
637
+ Retries each failed step in a test.
638
+
639
+ Add this plugin to config file:
640
+
641
+ ```js
642
+ plugins: {
643
+ retryFailedStep: {
644
+ enabled: true
645
+ }
646
+ }
647
+ ```
648
+
649
+ Run tests with plugin enabled:
650
+
651
+ npx codeceptjs run --plugins retryFailedStep
652
+
653
+ #### Configuration:
654
+
655
+ * `retries` - number of retries (by default 3),
656
+ * `when` - function, when to perform a retry (accepts error as parameter)
657
+ * `factor` - The exponential factor to use. Default is 1.5.
658
+ * `minTimeout` - The number of milliseconds before starting the first retry. Default is 1000.
659
+ * `maxTimeout` - The maximum number of milliseconds between two retries. Default is Infinity.
660
+ * `randomize` - Randomizes the timeouts by multiplying with a factor from 1 to 2. Default is false.
661
+ * `defaultIgnoredSteps` - an array of steps to be ignored for retry. Includes:
662
+ * `amOnPage`
663
+ * `wait*`
664
+ * `send*`
665
+ * `execute*`
666
+ * `run*`
667
+ * `have*`
668
+ * `ignoredSteps` - an array for custom steps to ignore on retry. Use it to append custom steps to ignored list.
669
+ You can use step names or step prefixes ending with `*`. As such, `wait*` will match all steps starting with `wait`.
670
+ To append your own steps to ignore list - copy and paste a default steps list. Regexp values are accepted as well.
671
+ * `deferToScenarioRetries` - when enabled (default), step retries are automatically disabled if scenario retries are configured to avoid excessive total retries.
672
+
673
+ #### Example
674
+
675
+ ```js
676
+ plugins: {
677
+ retryFailedStep: {
678
+ enabled: true,
679
+ ignoredSteps: [
680
+ 'scroll*', // ignore all scroll steps
681
+ /Cookie/, // ignore all steps with a Cookie in it (by regexp)
682
+ ]
683
+ }
684
+ }
685
+ ```
686
+
687
+ #### Disable Per Test
688
+
689
+ This plugin can be disabled per test. In this case you will need to stet `I.retry()` to all flaky steps:
690
+
691
+ Use scenario configuration to disable plugin for a test
692
+
693
+ ```js
694
+ Scenario('scenario tite', { disableRetryFailedStep: true }, () => {
695
+ // test goes here
696
+ })
697
+ ```
698
+
699
+ ### Parameters
700
+
701
+ * `config` &#x20;
702
+
703
+ ## screencast
704
+
705
+ Records WebM video of tests using Playwright's screencast API (Playwright >= 1.59).
706
+ When `captions` is enabled, action annotations are burned into the video; when
707
+ `subtitles` is enabled, a standalone `.srt` file is also produced.
708
+
709
+ ```js
710
+ plugins: {
711
+ screencast: {
712
+ enabled: true,
713
+ on: 'fail',
714
+ }
715
+ }
716
+ ```
717
+
718
+ #### `on=` modes
719
+
720
+ * **fail** — record while running; delete on pass, keep on fail (default)
721
+ * **test** — record and keep every test's video
722
+
723
+ CLI examples:
724
+
725
+ npx codeceptjs run -p screencast
726
+ npx codeceptjs run -p screencast:on=test
727
+ npx codeceptjs run -p screencast:on=test;captions=false;subtitles=true
728
+
729
+ Possible config options:
730
+
731
+ * `captions`: burn-in action overlays via `page.screencast.showActions()`. Default: true.
732
+ * `subtitles`: also write a standalone `.srt` file alongside the video. Default: false.
733
+ * `video`: record a video. With `video=false, subtitles=true`, only the `.srt` is produced (next to `test.artifacts.video` if a helper recorded one). Default: true.
734
+ * `size`: pass-through `{ width, height }` for `screencast.start`.
735
+ * `quality`: pass-through 0–100 for `screencast.start`.
736
+
737
+ > Enabling Playwright's helper-level `video: true` and this plugin together
738
+ > produces two independent recordings. Pick one.
739
+
740
+ ### Parameters
741
+
742
+ * `config` &#x20;
743
+
744
+ ## screenshot
745
+
746
+ Saves screenshots from the browser at points triggered by `on=`. Replaces the
747
+ legacy `screenshotOnFail` plugin. Default `on=fail` preserves the old behavior.
748
+
749
+ This plugin is **enabled by default**.
750
+
751
+ ```js
752
+ plugins: {
753
+ screenshot: {
754
+ enabled: true,
755
+ on: 'fail',
756
+ }
757
+ }
758
+ ```
759
+
760
+ #### `on=` modes
761
+
762
+ * **fail** — screenshot when a test fails (default)
763
+ * **test** — screenshot at the end of every test
764
+ * **step** — screenshot after every step
765
+ * **file** — screenshot for steps in `path=...[;line=...]`
766
+ * **url** — screenshot when the current URL matches `pattern=...`
767
+
768
+ CLI examples:
769
+
770
+ npx codeceptjs run -p screenshot
771
+ npx codeceptjs run -p screenshot:on=step
772
+ npx codeceptjs run -p screenshot:on=step;slides=true
773
+ npx codeceptjs run -p screenshot:on=file:path=tests/login_test.js
774
+ npx codeceptjs run -p screenshot:on=url:pattern=/users/*
775
+
776
+ Possible config options:
777
+
778
+ * `uniqueScreenshotNames`: use unique names for screenshot. Default: false.
779
+ * `fullPageScreenshots`: make full page screenshots. Default: false.
780
+ * `slides`: generate a step-by-step slideshow report (works with `on=step|file|url`). Replaces the legacy `stepByStepReport` plugin. Default: false.
781
+ * `deleteSuccessful`: when `slides=true`, drop slideshow folders for passing tests. Default: true.
782
+ * `animateSlides`: when `slides=true`, animate transitions between slides. Default: true.
783
+ * `ignoreSteps`: when `slides=true`, RegExps of step names to skip in the slideshow.
784
+
785
+ #### Step-by-step slideshow
786
+
787
+ `screenshot:on=step;slides=true` writes a per-test `record_<hash>/index.html`
788
+ slideshow and a top-level `records.html` index. The output is a self-contained
789
+ HTML page with keyboard / dot navigation — no external assets, no JavaScript
790
+ frameworks.
791
+
792
+ > The legacy `screenshotOnFail` plugin remains as a deprecated alias. The legacy
793
+ > `stepByStepReport` plugin has been replaced by `screenshot:slides=true`.
794
+
795
+ ### Parameters
796
+
797
+ * `config` &#x20;
798
+
799
+ ## stepTimeout
800
+
801
+ Set timeout for test steps globally.
802
+
803
+ Add this plugin to config file:
804
+
805
+ ```js
806
+ plugins: {
807
+ stepTimeout: {
808
+ enabled: true
809
+ }
810
+ }
811
+ ```
812
+
813
+ Run tests with plugin enabled:
814
+
815
+ npx codeceptjs run --plugins stepTimeout
816
+
817
+ #### Configuration:
818
+
819
+ * `timeout` - global step timeout, default 150 seconds
820
+
821
+ * `overrideStepLimits` - whether to use timeouts set in plugin config to override step timeouts set in code with I.limitTime(x).action(...), default false
822
+
823
+ * `noTimeoutSteps` - an array of steps with no timeout. Default:
824
+
825
+ * `amOnPage`
826
+ * `wait*`
827
+
828
+ you could set your own noTimeoutSteps which would replace the default one.
829
+
830
+ * `customTimeoutSteps` - an array of step actions with custom timeout. Use it to override or extend noTimeoutSteps.
831
+ You can use step names or step prefixes ending with `*`. As such, `wait*` will match all steps starting with `wait`.
832
+
833
+ #### Example
834
+
835
+ ```js
836
+ plugins: {
837
+ stepTimeout: {
838
+ enabled: true,
839
+ overrideStepLimits: true,
840
+ noTimeoutSteps: [
841
+ 'scroll*', // ignore all scroll steps
842
+ /Cookie/, // ignore all steps with a Cookie in it (by regexp)
843
+ ],
844
+ customTimeoutSteps: [
845
+ ['myFlakyStep*', 1],
846
+ ['scrollWhichRequiresTimeout', 5],
847
+ ]
848
+ }
849
+ }
850
+ ```
851
+
852
+ ### Parameters
853
+
854
+ * `config` &#x20;
855
+
856
+ [1]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object
857
+
858
+ [2]: https://github.com/cenfun/monocart-coverage-reports?tab=readme-ov-file#default-options
859
+
860
+ [3]: https://codecept.io/locators#custom-locators
861
+
862
+ [4]: https://codecept.io/heal/
863
+
864
+ [5]: /basics/#pause
865
+
866
+ [6]: https://codecept.io/img/codeceptjs-slideshow.gif