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
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import event from '../event.js'
|
|
2
|
-
import output from '../output.js'
|
|
3
|
-
import Config from '../config.js'
|
|
4
|
-
import { isNotSet } from '../utils.js'
|
|
5
|
-
|
|
6
|
-
const hooks = ['Before', 'After', 'BeforeSuite', 'AfterSuite']
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Priority levels for retry mechanisms (higher number = higher priority)
|
|
10
|
-
* This ensures consistent behavior when multiple retry mechanisms are active
|
|
11
|
-
*/
|
|
12
|
-
const RETRY_PRIORITIES = {
|
|
13
|
-
MANUAL_STEP: 100, // I.retry() or step.retry() - highest priority
|
|
14
|
-
STEP_PLUGIN: 50, // retryFailedStep plugin
|
|
15
|
-
SCENARIO_CONFIG: 30, // Global scenario retry config
|
|
16
|
-
FEATURE_CONFIG: 20, // Global feature retry config
|
|
17
|
-
HOOK_CONFIG: 10, // Hook retry config - lowest priority
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Enhanced global retry mechanism that coordinates with other retry types
|
|
22
|
-
*/
|
|
23
|
-
export default function () {
|
|
24
|
-
event.dispatcher.on(event.suite.before, suite => {
|
|
25
|
-
let retryConfig = Config.get('retry')
|
|
26
|
-
if (!retryConfig) return
|
|
27
|
-
|
|
28
|
-
if (Number.isInteger(+retryConfig)) {
|
|
29
|
-
// is number - apply as feature-level retry
|
|
30
|
-
const retryNum = +retryConfig
|
|
31
|
-
output.log(`[Global Retry] Feature retries: ${retryNum}`)
|
|
32
|
-
|
|
33
|
-
// Only set if not already set by higher priority mechanism
|
|
34
|
-
if (isNotSet(suite.retries())) {
|
|
35
|
-
suite.retries(retryNum)
|
|
36
|
-
suite.opts.retryPriority = RETRY_PRIORITIES.FEATURE_CONFIG
|
|
37
|
-
}
|
|
38
|
-
return
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
if (!Array.isArray(retryConfig)) {
|
|
42
|
-
retryConfig = [retryConfig]
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
for (const config of retryConfig) {
|
|
46
|
-
if (config.grep) {
|
|
47
|
-
if (!suite.title.includes(config.grep)) continue
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Handle hook retries with priority awareness
|
|
51
|
-
hooks
|
|
52
|
-
.filter(hook => !!config[hook])
|
|
53
|
-
.forEach(hook => {
|
|
54
|
-
const retryKey = `retry${hook}`
|
|
55
|
-
if (isNotSet(suite.opts[retryKey])) {
|
|
56
|
-
suite.opts[retryKey] = config[hook]
|
|
57
|
-
suite.opts[`${retryKey}Priority`] = RETRY_PRIORITIES.HOOK_CONFIG
|
|
58
|
-
}
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
// Handle feature-level retries
|
|
62
|
-
if (config.Feature) {
|
|
63
|
-
if (isNotSet(suite.retries()) || (suite.opts.retryPriority || 0) <= RETRY_PRIORITIES.FEATURE_CONFIG) {
|
|
64
|
-
suite.retries(config.Feature)
|
|
65
|
-
suite.opts.retryPriority = RETRY_PRIORITIES.FEATURE_CONFIG
|
|
66
|
-
output.log(`[Global Retry] Feature retries: ${config.Feature}`)
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
event.dispatcher.on(event.test.before, test => {
|
|
73
|
-
let retryConfig = Config.get('retry')
|
|
74
|
-
if (!retryConfig) return
|
|
75
|
-
|
|
76
|
-
if (Number.isInteger(+retryConfig)) {
|
|
77
|
-
// Only set if not already set by higher priority mechanism
|
|
78
|
-
if (test.retries() === -1) {
|
|
79
|
-
test.retries(retryConfig)
|
|
80
|
-
test.opts.retryPriority = RETRY_PRIORITIES.SCENARIO_CONFIG
|
|
81
|
-
output.log(`[Global Retry] Scenario retries: ${retryConfig}`)
|
|
82
|
-
}
|
|
83
|
-
return
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
if (!Array.isArray(retryConfig)) {
|
|
87
|
-
retryConfig = [retryConfig]
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
retryConfig = retryConfig.filter(config => !!config.Scenario)
|
|
91
|
-
|
|
92
|
-
for (const config of retryConfig) {
|
|
93
|
-
if (config.grep) {
|
|
94
|
-
if (!test.fullTitle().includes(config.grep)) continue
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (config.Scenario) {
|
|
98
|
-
// Respect priority system
|
|
99
|
-
if (test.retries() === -1 || (test.opts.retryPriority || 0) <= RETRY_PRIORITIES.SCENARIO_CONFIG) {
|
|
100
|
-
test.retries(config.Scenario)
|
|
101
|
-
test.opts.retryPriority = RETRY_PRIORITIES.SCENARIO_CONFIG
|
|
102
|
-
output.log(`[Global Retry] Scenario retries: ${config.Scenario}`)
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
})
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Export priority constants for use by other retry mechanisms
|
|
110
|
-
export { RETRY_PRIORITIES }
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import event from '../event.js'
|
|
2
|
-
import recorder from '../recorder.js'
|
|
3
|
-
import store from '../store.js'
|
|
4
|
-
import output from '../output.js'
|
|
5
|
-
import { RETRY_PRIORITIES } from '../retryCoordinator.js'
|
|
6
|
-
|
|
7
|
-
const defaultConfig = {
|
|
8
|
-
retries: 3,
|
|
9
|
-
defaultIgnoredSteps: ['amOnPage', 'wait*', 'send*', 'execute*', 'run*', 'have*'],
|
|
10
|
-
factor: 1.5,
|
|
11
|
-
ignoredSteps: [],
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Enhanced retryFailedStep plugin that coordinates with other retry mechanisms
|
|
16
|
-
*
|
|
17
|
-
* This plugin provides step-level retries and coordinates with global retry settings
|
|
18
|
-
* to avoid conflicts and provide predictable behavior.
|
|
19
|
-
*/
|
|
20
|
-
export default config => {
|
|
21
|
-
config = Object.assign({}, defaultConfig, config)
|
|
22
|
-
config.ignoredSteps = config.ignoredSteps.concat(config.defaultIgnoredSteps)
|
|
23
|
-
const customWhen = config.when
|
|
24
|
-
|
|
25
|
-
let enableRetry = false
|
|
26
|
-
|
|
27
|
-
const when = err => {
|
|
28
|
-
if (!enableRetry) return false
|
|
29
|
-
if (store.debugMode) return false
|
|
30
|
-
if (!store.autoRetries) return false
|
|
31
|
-
if (customWhen) return customWhen(err)
|
|
32
|
-
return true
|
|
33
|
-
}
|
|
34
|
-
config.when = when
|
|
35
|
-
|
|
36
|
-
event.dispatcher.on(event.step.started, step => {
|
|
37
|
-
// if a step is ignored - return
|
|
38
|
-
for (const ignored of config.ignoredSteps) {
|
|
39
|
-
if (step.name === ignored) return
|
|
40
|
-
if (ignored instanceof RegExp) {
|
|
41
|
-
if (step.name.match(ignored)) return
|
|
42
|
-
} else if (ignored.indexOf('*') && step.name.startsWith(ignored.slice(0, -1))) return
|
|
43
|
-
}
|
|
44
|
-
enableRetry = true // enable retry for a step
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
event.dispatcher.on(event.step.finished, () => {
|
|
48
|
-
enableRetry = false
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
event.dispatcher.on(event.test.before, test => {
|
|
52
|
-
// pass disableRetryFailedStep is a preferred way to disable retries
|
|
53
|
-
// test.disableRetryFailedStep is used for backward compatibility
|
|
54
|
-
if (test.opts.disableRetryFailedStep || test.disableRetryFailedStep) {
|
|
55
|
-
store.autoRetries = false
|
|
56
|
-
output.log(`[Step Retry] Disabled for test: ${test.title}`)
|
|
57
|
-
return // disable retry when a test is not active
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Check if step retries should be disabled due to higher priority scenario retries
|
|
61
|
-
const scenarioRetries = test.retries()
|
|
62
|
-
const stepRetryPriority = RETRY_PRIORITIES.STEP_PLUGIN
|
|
63
|
-
const scenarioPriority = test.opts.retryPriority || 0
|
|
64
|
-
|
|
65
|
-
if (scenarioRetries > 0 && config.deferToScenarioRetries !== false) {
|
|
66
|
-
// Scenario retries are configured with higher or equal priority
|
|
67
|
-
// Option 1: Disable step retries (conservative approach)
|
|
68
|
-
store.autoRetries = false
|
|
69
|
-
output.log(`[Step Retry] Deferred to scenario retries (${scenarioRetries} retries)`)
|
|
70
|
-
return
|
|
71
|
-
|
|
72
|
-
// Option 2: Reduce step retries to avoid excessive total retries
|
|
73
|
-
// const reducedStepRetries = Math.max(1, Math.floor(config.retries / scenarioRetries))
|
|
74
|
-
// config.retries = reducedStepRetries
|
|
75
|
-
// output.log(`[Step Retry] Reduced to ${reducedStepRetries} retries due to scenario retries (${scenarioRetries})`)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// this option is used to set the retries inside _before() block of helpers
|
|
79
|
-
store.autoRetries = true
|
|
80
|
-
test.opts.conditionalRetries = config.retries
|
|
81
|
-
test.opts.stepRetryPriority = stepRetryPriority
|
|
82
|
-
|
|
83
|
-
recorder.retry(config)
|
|
84
|
-
|
|
85
|
-
output.log(`[Step Retry] Enabled with ${config.retries} retries for test: ${test.title}`)
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
// Add coordination info for debugging
|
|
89
|
-
event.dispatcher.on(event.test.finished, test => {
|
|
90
|
-
if (test.state === 'passed' && test.opts.conditionalRetries && store.autoRetries) {
|
|
91
|
-
const stepRetries = test.opts.conditionalRetries || 0
|
|
92
|
-
const scenarioRetries = test.retries() || 0
|
|
93
|
-
|
|
94
|
-
if (stepRetries > 0 && scenarioRetries > 0) {
|
|
95
|
-
output.log(`[Retry Coordination] Test used both step retries (${stepRetries}) and scenario retries (${scenarioRetries})`)
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
})
|
|
99
|
-
}
|