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.
- package/README.md +39 -27
- package/bin/codecept.js +15 -2
- package/bin/codeceptq.js +49 -0
- package/bin/mcp-server.js +1187 -0
- package/docs/advanced.md +201 -0
- package/docs/agents.md +159 -0
- package/docs/ai.md +537 -0
- package/docs/aitrace.md +266 -0
- package/docs/api.md +332 -0
- package/docs/assertions.md +415 -0
- package/docs/auth.md +318 -0
- package/docs/basics.md +424 -0
- package/docs/bdd.md +539 -0
- package/docs/best.md +240 -0
- package/docs/bootstrap.md +132 -0
- package/docs/commands.md +352 -0
- package/docs/community-helpers.md +63 -0
- package/docs/configuration.md +230 -0
- package/docs/continuous-integration.md +497 -0
- package/docs/custom-helpers.md +297 -0
- package/docs/data.md +448 -0
- package/docs/debugging.md +332 -0
- package/docs/detox.md +235 -0
- package/docs/docker.md +136 -0
- package/docs/effects.md +179 -0
- package/docs/element-based-testing.md +295 -0
- package/docs/element-selection.md +125 -0
- package/docs/els.md +328 -0
- package/docs/examples.md +161 -0
- package/docs/heal.md +213 -0
- package/docs/helpers/ApiDataFactory.md +267 -0
- package/docs/helpers/Appium.md +1405 -0
- package/docs/helpers/Detox.md +665 -0
- package/docs/helpers/ExpectHelper.md +275 -0
- package/docs/helpers/FileSystem.md +152 -0
- package/docs/helpers/GraphQL.md +152 -0
- package/docs/helpers/GraphQLDataFactory.md +226 -0
- package/docs/helpers/JSONResponse.md +255 -0
- package/docs/helpers/Mochawesome.md +8 -0
- package/docs/helpers/MockRequest.md +377 -0
- package/docs/helpers/MockServer.md +212 -0
- package/docs/helpers/Playwright.md +2969 -0
- package/docs/helpers/Polly.md +44 -0
- package/docs/helpers/Protractor.md +1769 -0
- package/docs/helpers/Puppeteer-firefox.md +86 -0
- package/docs/helpers/Puppeteer.md +2690 -0
- package/docs/helpers/REST.md +289 -0
- package/docs/helpers/SoftExpectHelper.md +352 -0
- package/docs/helpers/WebDriver.md +2682 -0
- package/docs/hooks.md +339 -0
- package/docs/index.md +111 -0
- package/docs/installation.md +83 -0
- package/docs/internal-api.md +265 -0
- package/docs/internal-test-server.md +89 -0
- package/docs/locators.md +355 -0
- package/docs/mcp.md +485 -0
- package/docs/migration-4.md +556 -0
- package/docs/mobile.md +338 -0
- package/docs/pageobjects.md +399 -0
- package/docs/parallel.md +585 -0
- package/docs/playwright.md +714 -0
- package/docs/plugins.md +866 -0
- package/docs/puppeteer.md +314 -0
- package/docs/quickstart.md +120 -0
- package/docs/react.md +70 -0
- package/docs/reports.md +483 -0
- package/docs/retry.md +274 -0
- package/docs/secrets.md +150 -0
- package/docs/sessions.md +80 -0
- package/docs/shadow.md +68 -0
- package/docs/test-structure.md +275 -0
- package/docs/timeouts.md +183 -0
- package/docs/translation.md +247 -0
- package/docs/tutorial.md +271 -0
- package/docs/typescript.md +374 -0
- package/docs/web-element.md +251 -0
- package/docs/webdriver.md +708 -0
- package/docs/within.md +55 -0
- package/lib/ai.js +3 -2
- package/lib/aria.js +260 -0
- package/lib/assertions.js +18 -0
- package/lib/codecept.js +26 -23
- package/lib/command/check.js +2 -1
- package/lib/command/dryRun.js +24 -5
- package/lib/command/generate.js +2 -0
- package/lib/command/gherkin/snippets.js +5 -4
- package/lib/command/init.js +248 -269
- package/lib/command/list.js +150 -10
- package/lib/command/query.js +218 -0
- package/lib/command/run-multiple.js +2 -0
- package/lib/command/run-workers.js +2 -0
- package/lib/command/run.js +1 -1
- package/lib/command/workers/runTests.js +10 -10
- package/lib/config.js +77 -4
- package/lib/container.js +114 -17
- package/lib/effects.js +17 -0
- package/lib/element/WebElement.js +246 -2
- package/lib/els.js +12 -6
- package/lib/globals.js +32 -19
- package/lib/heal.js +4 -3
- package/lib/helper/ApiDataFactory.js +2 -1
- package/lib/helper/Appium.js +8 -8
- package/lib/helper/FileSystem.js +3 -2
- package/lib/helper/GraphQLDataFactory.js +2 -1
- package/lib/helper/Playwright.js +228 -162
- package/lib/helper/Puppeteer.js +208 -76
- package/lib/helper/WebDriver.js +173 -68
- package/lib/helper/errors/MultipleElementsFound.js +27 -110
- package/lib/helper/errors/NonFocusedType.js +8 -0
- package/lib/helper/extras/Download.js +45 -0
- package/lib/helper/extras/PlaywrightReactVueLocator.js +45 -36
- package/lib/helper/extras/elementSelection.js +58 -0
- package/lib/helper/extras/focusCheck.js +43 -0
- package/lib/helper/extras/richTextEditor.js +178 -0
- package/lib/helper/scripts/dropFile.js +11 -0
- package/lib/history.js +3 -2
- package/lib/html.js +103 -16
- package/lib/index.js +9 -1
- package/lib/listener/config.js +6 -4
- package/lib/listener/emptyRun.js +2 -1
- package/lib/listener/globalRetry.js +32 -6
- package/lib/listener/helpers.js +4 -1
- package/lib/listener/mocha.js +2 -1
- package/lib/listener/pageobjects.js +43 -0
- package/lib/listener/result.js +3 -2
- package/lib/locator.js +126 -3
- package/lib/mocha/cli.js +14 -2
- package/lib/mocha/factory.js +7 -2
- package/lib/mocha/inject.js +1 -1
- package/lib/mocha/scenarioConfig.js +2 -1
- package/lib/mocha/ui.js +5 -6
- package/lib/parser.js +2 -2
- package/lib/pause.js +38 -4
- package/lib/plugin/aiTrace.js +453 -0
- package/lib/plugin/analyze.js +1 -1
- package/lib/plugin/auth.js +3 -3
- package/lib/plugin/browser.js +77 -0
- package/lib/plugin/expose.js +159 -0
- package/lib/plugin/heal.js +44 -1
- package/lib/plugin/pageInfo.js +53 -49
- package/lib/plugin/pause.js +131 -0
- package/lib/plugin/pauseOnFail.js +10 -34
- package/lib/plugin/retryFailedStep.js +28 -19
- package/lib/plugin/screencast.js +287 -0
- package/lib/plugin/screenshot.js +563 -0
- package/lib/plugin/screenshotOnFail.js +8 -171
- package/lib/rerun.js +2 -1
- package/lib/result.js +2 -1
- package/lib/step/base.js +3 -2
- package/lib/step/config.js +15 -2
- package/lib/step/record.js +2 -2
- package/lib/store.js +72 -3
- package/lib/translation.js +2 -1
- package/lib/utils/mask_data.js +2 -1
- package/lib/utils/pluginParser.js +151 -0
- package/lib/utils/trace.js +297 -0
- package/lib/utils.js +77 -3
- package/lib/workers.js +52 -22
- package/package.json +19 -13
- package/typings/index.d.ts +19 -5
- package/docs/webapi/amOnPage.mustache +0 -11
- package/docs/webapi/appendField.mustache +0 -11
- package/docs/webapi/attachFile.mustache +0 -12
- package/docs/webapi/blur.mustache +0 -18
- package/docs/webapi/checkOption.mustache +0 -13
- package/docs/webapi/clearCookie.mustache +0 -9
- package/docs/webapi/clearField.mustache +0 -9
- package/docs/webapi/click.mustache +0 -29
- package/docs/webapi/clickLink.mustache +0 -8
- package/docs/webapi/closeCurrentTab.mustache +0 -7
- package/docs/webapi/closeOtherTabs.mustache +0 -8
- package/docs/webapi/dontSee.mustache +0 -11
- package/docs/webapi/dontSeeCheckboxIsChecked.mustache +0 -10
- package/docs/webapi/dontSeeCookie.mustache +0 -8
- package/docs/webapi/dontSeeCurrentPathEquals.mustache +0 -10
- package/docs/webapi/dontSeeCurrentUrlEquals.mustache +0 -10
- package/docs/webapi/dontSeeElement.mustache +0 -8
- package/docs/webapi/dontSeeElementInDOM.mustache +0 -8
- package/docs/webapi/dontSeeInCurrentUrl.mustache +0 -4
- package/docs/webapi/dontSeeInField.mustache +0 -11
- package/docs/webapi/dontSeeInSource.mustache +0 -8
- package/docs/webapi/dontSeeInTitle.mustache +0 -8
- package/docs/webapi/dontSeeTraffic.mustache +0 -13
- package/docs/webapi/doubleClick.mustache +0 -13
- package/docs/webapi/downloadFile.mustache +0 -12
- package/docs/webapi/dragAndDrop.mustache +0 -9
- package/docs/webapi/dragSlider.mustache +0 -11
- package/docs/webapi/executeAsyncScript.mustache +0 -24
- package/docs/webapi/executeScript.mustache +0 -26
- package/docs/webapi/fillField.mustache +0 -16
- package/docs/webapi/flushNetworkTraffics.mustache +0 -5
- package/docs/webapi/focus.mustache +0 -13
- package/docs/webapi/forceClick.mustache +0 -28
- package/docs/webapi/forceRightClick.mustache +0 -18
- package/docs/webapi/grabAllWindowHandles.mustache +0 -7
- package/docs/webapi/grabAttributeFrom.mustache +0 -10
- package/docs/webapi/grabAttributeFromAll.mustache +0 -9
- package/docs/webapi/grabBrowserLogs.mustache +0 -9
- package/docs/webapi/grabCookie.mustache +0 -11
- package/docs/webapi/grabCssPropertyFrom.mustache +0 -11
- package/docs/webapi/grabCssPropertyFromAll.mustache +0 -10
- package/docs/webapi/grabCurrentUrl.mustache +0 -9
- package/docs/webapi/grabCurrentWindowHandle.mustache +0 -6
- package/docs/webapi/grabDataFromPerformanceTiming.mustache +0 -20
- package/docs/webapi/grabElementBoundingRect.mustache +0 -20
- package/docs/webapi/grabGeoLocation.mustache +0 -8
- package/docs/webapi/grabHTMLFrom.mustache +0 -10
- package/docs/webapi/grabHTMLFromAll.mustache +0 -9
- package/docs/webapi/grabNumberOfOpenTabs.mustache +0 -8
- package/docs/webapi/grabNumberOfVisibleElements.mustache +0 -9
- package/docs/webapi/grabPageScrollPosition.mustache +0 -8
- package/docs/webapi/grabPopupText.mustache +0 -5
- package/docs/webapi/grabRecordedNetworkTraffics.mustache +0 -10
- package/docs/webapi/grabSource.mustache +0 -8
- package/docs/webapi/grabTextFrom.mustache +0 -10
- package/docs/webapi/grabTextFromAll.mustache +0 -9
- package/docs/webapi/grabTitle.mustache +0 -8
- package/docs/webapi/grabValueFrom.mustache +0 -9
- package/docs/webapi/grabValueFromAll.mustache +0 -8
- package/docs/webapi/grabWebElement.mustache +0 -9
- package/docs/webapi/grabWebElements.mustache +0 -9
- package/docs/webapi/moveCursorTo.mustache +0 -12
- package/docs/webapi/openNewTab.mustache +0 -7
- package/docs/webapi/pressKey.mustache +0 -12
- package/docs/webapi/pressKeyDown.mustache +0 -12
- package/docs/webapi/pressKeyUp.mustache +0 -12
- package/docs/webapi/pressKeyWithKeyNormalization.mustache +0 -60
- package/docs/webapi/refreshPage.mustache +0 -6
- package/docs/webapi/resizeWindow.mustache +0 -6
- package/docs/webapi/rightClick.mustache +0 -14
- package/docs/webapi/saveElementScreenshot.mustache +0 -10
- package/docs/webapi/saveScreenshot.mustache +0 -12
- package/docs/webapi/say.mustache +0 -10
- package/docs/webapi/scrollIntoView.mustache +0 -11
- package/docs/webapi/scrollPageToBottom.mustache +0 -6
- package/docs/webapi/scrollPageToTop.mustache +0 -6
- package/docs/webapi/scrollTo.mustache +0 -12
- package/docs/webapi/see.mustache +0 -11
- package/docs/webapi/seeAttributesOnElements.mustache +0 -9
- package/docs/webapi/seeCheckboxIsChecked.mustache +0 -10
- package/docs/webapi/seeCookie.mustache +0 -8
- package/docs/webapi/seeCssPropertiesOnElements.mustache +0 -9
- package/docs/webapi/seeCurrentPathEquals.mustache +0 -10
- package/docs/webapi/seeCurrentUrlEquals.mustache +0 -11
- package/docs/webapi/seeElement.mustache +0 -8
- package/docs/webapi/seeElementInDOM.mustache +0 -8
- package/docs/webapi/seeInCurrentUrl.mustache +0 -8
- package/docs/webapi/seeInField.mustache +0 -12
- package/docs/webapi/seeInPopup.mustache +0 -8
- package/docs/webapi/seeInSource.mustache +0 -7
- package/docs/webapi/seeInTitle.mustache +0 -8
- package/docs/webapi/seeNumberOfElements.mustache +0 -11
- package/docs/webapi/seeNumberOfVisibleElements.mustache +0 -10
- package/docs/webapi/seeTextEquals.mustache +0 -9
- package/docs/webapi/seeTitleEquals.mustache +0 -8
- package/docs/webapi/seeTraffic.mustache +0 -36
- package/docs/webapi/selectOption.mustache +0 -21
- package/docs/webapi/setCookie.mustache +0 -16
- package/docs/webapi/setGeoLocation.mustache +0 -12
- package/docs/webapi/startRecordingTraffic.mustache +0 -8
- package/docs/webapi/startRecordingWebSocketMessages.mustache +0 -8
- package/docs/webapi/stopRecordingTraffic.mustache +0 -5
- package/docs/webapi/stopRecordingWebSocketMessages.mustache +0 -7
- package/docs/webapi/switchTo.mustache +0 -9
- package/docs/webapi/switchToNextTab.mustache +0 -10
- package/docs/webapi/switchToPreviousTab.mustache +0 -10
- package/docs/webapi/type.mustache +0 -21
- package/docs/webapi/uncheckOption.mustache +0 -13
- package/docs/webapi/wait.mustache +0 -8
- package/docs/webapi/waitForClickable.mustache +0 -11
- package/docs/webapi/waitForCookie.mustache +0 -9
- package/docs/webapi/waitForDetached.mustache +0 -10
- package/docs/webapi/waitForDisabled.mustache +0 -6
- package/docs/webapi/waitForElement.mustache +0 -11
- package/docs/webapi/waitForEnabled.mustache +0 -6
- package/docs/webapi/waitForFunction.mustache +0 -17
- package/docs/webapi/waitForInvisible.mustache +0 -10
- package/docs/webapi/waitForNumberOfTabs.mustache +0 -9
- package/docs/webapi/waitForText.mustache +0 -13
- package/docs/webapi/waitForValue.mustache +0 -10
- package/docs/webapi/waitForVisible.mustache +0 -10
- package/docs/webapi/waitInUrl.mustache +0 -9
- package/docs/webapi/waitNumberOfVisibleElements.mustache +0 -10
- package/docs/webapi/waitToHide.mustache +0 -10
- package/docs/webapi/waitUrlEquals.mustache +0 -10
- package/lib/helper/AI.js +0 -214
- package/lib/listener/enhancedGlobalRetry.js +0 -110
- package/lib/plugin/enhancedRetryFailedStep.js +0 -99
- package/lib/plugin/htmlReporter.js +0 -3648
- package/lib/plugin/stepByStepReport.js +0 -427
- package/lib/plugin/subtitles.js +0 -89
- package/lib/retryCoordinator.js +0 -207
- package/typings/promiseBasedTypes.d.ts +0 -9469
- package/typings/types.d.ts +0 -11402
package/docs/plugins.md
ADDED
|
@@ -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** 
|
|
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** 
|
|
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`  
|
|
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`  
|
|
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`  
|
|
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`  
|
|
541
|
+
|
|
542
|
+
## customReporter
|
|
543
|
+
|
|
544
|
+
Sample custom reporter for CodeceptJS.
|
|
545
|
+
|
|
546
|
+
### Parameters
|
|
547
|
+
|
|
548
|
+
* `config`  
|
|
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`  
|
|
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`  
|
|
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`  
|
|
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`  
|
|
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
|