codeceptjs 3.7.6-beta.4 → 4.0.0-beta.10.esm-aria

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 (191) hide show
  1. package/README.md +1 -3
  2. package/bin/codecept.js +51 -53
  3. package/bin/test-server.js +14 -3
  4. package/docs/webapi/click.mustache +5 -1
  5. package/lib/actor.js +15 -11
  6. package/lib/ai.js +72 -107
  7. package/lib/assert/empty.js +9 -8
  8. package/lib/assert/equal.js +15 -17
  9. package/lib/assert/error.js +2 -2
  10. package/lib/assert/include.js +9 -11
  11. package/lib/assert/throws.js +1 -1
  12. package/lib/assert/truth.js +8 -5
  13. package/lib/assert.js +18 -18
  14. package/lib/codecept.js +102 -75
  15. package/lib/colorUtils.js +48 -50
  16. package/lib/command/check.js +32 -27
  17. package/lib/command/configMigrate.js +11 -10
  18. package/lib/command/definitions.js +16 -10
  19. package/lib/command/dryRun.js +16 -16
  20. package/lib/command/generate.js +62 -27
  21. package/lib/command/gherkin/init.js +36 -38
  22. package/lib/command/gherkin/snippets.js +14 -14
  23. package/lib/command/gherkin/steps.js +21 -18
  24. package/lib/command/info.js +8 -8
  25. package/lib/command/init.js +36 -29
  26. package/lib/command/interactive.js +11 -10
  27. package/lib/command/list.js +10 -9
  28. package/lib/command/run-multiple/chunk.js +5 -5
  29. package/lib/command/run-multiple/collection.js +5 -5
  30. package/lib/command/run-multiple/run.js +3 -3
  31. package/lib/command/run-multiple.js +16 -13
  32. package/lib/command/run-rerun.js +6 -7
  33. package/lib/command/run-workers.js +24 -9
  34. package/lib/command/run.js +23 -8
  35. package/lib/command/utils.js +20 -18
  36. package/lib/command/workers/runTests.js +197 -114
  37. package/lib/config.js +124 -51
  38. package/lib/container.js +438 -87
  39. package/lib/data/context.js +6 -5
  40. package/lib/data/dataScenarioConfig.js +1 -1
  41. package/lib/data/dataTableArgument.js +1 -1
  42. package/lib/data/table.js +1 -1
  43. package/lib/effects.js +94 -10
  44. package/lib/element/WebElement.js +2 -2
  45. package/lib/els.js +11 -9
  46. package/lib/event.js +11 -10
  47. package/lib/globals.js +141 -0
  48. package/lib/heal.js +12 -12
  49. package/lib/helper/AI.js +11 -11
  50. package/lib/helper/ApiDataFactory.js +50 -19
  51. package/lib/helper/Appium.js +19 -27
  52. package/lib/helper/FileSystem.js +32 -12
  53. package/lib/helper/GraphQL.js +3 -3
  54. package/lib/helper/GraphQLDataFactory.js +4 -4
  55. package/lib/helper/JSONResponse.js +25 -29
  56. package/lib/helper/Mochawesome.js +7 -4
  57. package/lib/helper/Playwright.js +902 -164
  58. package/lib/helper/Puppeteer.js +383 -76
  59. package/lib/helper/REST.js +29 -12
  60. package/lib/helper/WebDriver.js +268 -61
  61. package/lib/helper/clientscripts/PollyWebDriverExt.js +1 -1
  62. package/lib/helper/errors/ConnectionRefused.js +6 -6
  63. package/lib/helper/errors/ElementAssertion.js +11 -16
  64. package/lib/helper/errors/ElementNotFound.js +5 -9
  65. package/lib/helper/errors/RemoteBrowserConnectionRefused.js +5 -5
  66. package/lib/helper/extras/Console.js +11 -11
  67. package/lib/helper/extras/PlaywrightLocator.js +110 -0
  68. package/lib/helper/extras/PlaywrightPropEngine.js +18 -18
  69. package/lib/helper/extras/PlaywrightReactVueLocator.js +18 -9
  70. package/lib/helper/extras/PlaywrightRestartOpts.js +34 -23
  71. package/lib/helper/extras/Popup.js +1 -1
  72. package/lib/helper/extras/React.js +29 -30
  73. package/lib/helper/network/actions.js +29 -44
  74. package/lib/helper/network/utils.js +76 -83
  75. package/lib/helper/scripts/blurElement.js +6 -6
  76. package/lib/helper/scripts/focusElement.js +6 -6
  77. package/lib/helper/scripts/highlightElement.js +9 -9
  78. package/lib/helper/scripts/isElementClickable.js +34 -34
  79. package/lib/helper.js +2 -1
  80. package/lib/history.js +23 -20
  81. package/lib/hooks.js +10 -10
  82. package/lib/html.js +90 -100
  83. package/lib/index.js +48 -21
  84. package/lib/listener/config.js +19 -12
  85. package/lib/listener/emptyRun.js +6 -7
  86. package/lib/listener/enhancedGlobalRetry.js +6 -6
  87. package/lib/listener/exit.js +4 -3
  88. package/lib/listener/globalRetry.js +5 -5
  89. package/lib/listener/globalTimeout.js +30 -14
  90. package/lib/listener/helpers.js +39 -14
  91. package/lib/listener/mocha.js +3 -4
  92. package/lib/listener/result.js +4 -5
  93. package/lib/listener/retryEnhancer.js +3 -3
  94. package/lib/listener/steps.js +8 -7
  95. package/lib/listener/store.js +3 -3
  96. package/lib/locator.js +213 -192
  97. package/lib/mocha/asyncWrapper.js +105 -62
  98. package/lib/mocha/bdd.js +99 -13
  99. package/lib/mocha/cli.js +59 -26
  100. package/lib/mocha/factory.js +78 -19
  101. package/lib/mocha/featureConfig.js +1 -1
  102. package/lib/mocha/gherkin.js +56 -24
  103. package/lib/mocha/hooks.js +12 -3
  104. package/lib/mocha/index.js +13 -4
  105. package/lib/mocha/inject.js +22 -5
  106. package/lib/mocha/scenarioConfig.js +2 -2
  107. package/lib/mocha/suite.js +9 -2
  108. package/lib/mocha/test.js +10 -7
  109. package/lib/mocha/ui.js +28 -18
  110. package/lib/output.js +10 -8
  111. package/lib/parser.js +44 -44
  112. package/lib/pause.js +15 -16
  113. package/lib/plugin/analyze.js +19 -12
  114. package/lib/plugin/auth.js +20 -21
  115. package/lib/plugin/autoDelay.js +12 -8
  116. package/lib/plugin/coverage.js +28 -11
  117. package/lib/plugin/customLocator.js +3 -3
  118. package/lib/plugin/customReporter.js +3 -2
  119. package/lib/plugin/enhancedRetryFailedStep.js +6 -6
  120. package/lib/plugin/heal.js +14 -9
  121. package/lib/plugin/htmlReporter.js +724 -99
  122. package/lib/plugin/pageInfo.js +10 -10
  123. package/lib/plugin/pauseOnFail.js +4 -3
  124. package/lib/plugin/retryFailedStep.js +48 -5
  125. package/lib/plugin/screenshotOnFail.js +75 -37
  126. package/lib/plugin/stepByStepReport.js +14 -14
  127. package/lib/plugin/stepTimeout.js +4 -3
  128. package/lib/plugin/subtitles.js +6 -5
  129. package/lib/recorder.js +33 -14
  130. package/lib/rerun.js +69 -26
  131. package/lib/result.js +4 -4
  132. package/lib/retryCoordinator.js +2 -2
  133. package/lib/secret.js +18 -17
  134. package/lib/session.js +95 -89
  135. package/lib/step/base.js +7 -7
  136. package/lib/step/comment.js +2 -2
  137. package/lib/step/config.js +1 -1
  138. package/lib/step/func.js +3 -3
  139. package/lib/step/helper.js +3 -3
  140. package/lib/step/meta.js +5 -5
  141. package/lib/step/record.js +11 -11
  142. package/lib/step/retry.js +3 -3
  143. package/lib/step/section.js +3 -3
  144. package/lib/step.js +7 -10
  145. package/lib/steps.js +9 -5
  146. package/lib/store.js +1 -1
  147. package/lib/template/heal.js +1 -1
  148. package/lib/template/prompts/generatePageObject.js +31 -0
  149. package/lib/template/prompts/healStep.js +13 -0
  150. package/lib/template/prompts/writeStep.js +9 -0
  151. package/lib/test-server.js +17 -6
  152. package/lib/timeout.js +1 -7
  153. package/lib/transform.js +8 -8
  154. package/lib/translation.js +32 -18
  155. package/lib/utils/mask_data.js +4 -10
  156. package/lib/utils.js +66 -64
  157. package/lib/workerStorage.js +17 -17
  158. package/lib/workers.js +214 -84
  159. package/package.json +41 -37
  160. package/translations/de-DE.js +2 -2
  161. package/translations/fr-FR.js +2 -2
  162. package/translations/index.js +23 -10
  163. package/translations/it-IT.js +2 -2
  164. package/translations/ja-JP.js +2 -2
  165. package/translations/nl-NL.js +2 -2
  166. package/translations/pl-PL.js +2 -2
  167. package/translations/pt-BR.js +2 -2
  168. package/translations/ru-RU.js +2 -2
  169. package/translations/utils.js +4 -3
  170. package/translations/zh-CN.js +2 -2
  171. package/translations/zh-TW.js +2 -2
  172. package/typings/index.d.ts +5 -3
  173. package/typings/promiseBasedTypes.d.ts +4 -0
  174. package/typings/types.d.ts +4 -0
  175. package/lib/helper/Nightmare.js +0 -1486
  176. package/lib/helper/Protractor.js +0 -1840
  177. package/lib/helper/TestCafe.js +0 -1391
  178. package/lib/helper/clientscripts/nightmare.js +0 -213
  179. package/lib/helper/testcafe/testControllerHolder.js +0 -42
  180. package/lib/helper/testcafe/testcafe-utils.js +0 -61
  181. package/lib/plugin/allure.js +0 -15
  182. package/lib/plugin/autoLogin.js +0 -5
  183. package/lib/plugin/commentStep.js +0 -141
  184. package/lib/plugin/eachElement.js +0 -127
  185. package/lib/plugin/fakerTransform.js +0 -49
  186. package/lib/plugin/retryTo.js +0 -16
  187. package/lib/plugin/selenoid.js +0 -364
  188. package/lib/plugin/standardActingHelpers.js +0 -6
  189. package/lib/plugin/tryTo.js +0 -16
  190. package/lib/plugin/wdio.js +0 -247
  191. package/lib/within.js +0 -90
@@ -1,14 +1,13 @@
1
- const fs = require('fs')
2
- const path = require('path')
3
- const { fileExists } = require('../utils')
4
- const CommentStep = require('../step/comment')
5
- const Section = require('../step/section')
6
- const container = require('../container')
7
- const store = require('../store')
8
- const event = require('../event')
9
- const recorder = require('../recorder')
10
- const { debug } = require('../output')
11
- const { isAsyncFunction } = require('../utils')
1
+ import fs from 'fs'
2
+ import path from 'path'
3
+ import { fileExists, isAsyncFunction } from '../utils.js'
4
+ import CommentStep from '../step/comment.js'
5
+ import Section from '../step/section.js'
6
+ import container from '../container.js'
7
+ import store from '../store.js'
8
+ import event from '../event.js'
9
+ import recorder from '../recorder.js'
10
+ import output from '../output.js'
12
11
 
13
12
  const defaultUser = {
14
13
  fetch: I => I.grabCookie(),
@@ -253,7 +252,7 @@ const defaultConfig = {
253
252
  *
254
253
  *
255
254
  */
256
- module.exports = function (config) {
255
+ export default function (config) {
257
256
  config = Object.assign(defaultConfig, config)
258
257
  Object.keys(config.users).map(
259
258
  u =>
@@ -292,12 +291,12 @@ module.exports = function (config) {
292
291
 
293
292
  if (isPlaywrightSession() && test?.opts?.cookies) {
294
293
  if (test.opts.user == name) {
295
- debug(`Cookies already loaded for ${name}`)
294
+ output.debug(`Cookies already loaded for ${name}`)
296
295
 
297
296
  alreadyLoggedIn(name)
298
297
  return
299
298
  } else {
300
- debug(`Cookies already loaded for ${test.opts.user}, but not for ${name}`)
299
+ output.debug(`Cookies already loaded for ${test.opts.user}, but not for ${name}`)
301
300
  await I.deleteCookie()
302
301
  }
303
302
  }
@@ -317,11 +316,11 @@ module.exports = function (config) {
317
316
  section.end()
318
317
  const cookies = await userSession.fetch(I)
319
318
  if (!cookies) {
320
- debug("Cannot save user session with empty cookies from auto login's fetch method")
319
+ output.debug("Cannot save user session with empty cookies from auto login's fetch method")
321
320
  return
322
321
  }
323
322
  if (config.saveToFile) {
324
- debug(`Saved user session into file for ${name}`)
323
+ output.debug(`Saved user session into file for ${name}`)
325
324
  fs.writeFileSync(path.join(global.output_dir, `${name}_session.json`), JSON.stringify(cookies))
326
325
  }
327
326
  store[`${name}_session`] = cookies
@@ -339,13 +338,13 @@ module.exports = function (config) {
339
338
  }
340
339
  section.end()
341
340
  recorder.session.catch(err => {
342
- debug(`Failed auto login for ${name} due to ${err}`)
343
- debug('Logging in again')
341
+ output.debug(`Failed auto login for ${name} due to ${err}`)
342
+ output.debug('Logging in again')
344
343
  recorder.session.start('auto login')
345
344
  return loginAndSave()
346
345
  .then(() => {
347
346
  recorder.add(() => recorder.session.restore('auto login'))
348
- recorder.catch(() => debug('continue'))
347
+ recorder.catch(() => output.debug('continue'))
349
348
  })
350
349
  .catch(err => {
351
350
  recorder.session.restore('auto login')
@@ -365,7 +364,7 @@ module.exports = function (config) {
365
364
  const suite = store.currentSuite
366
365
  if (!suite) return
367
366
 
368
- debug(`enabling auth as ${name} for each test of suite ${suite.title}`)
367
+ output.debug(`enabling auth as ${name} for each test of suite ${suite.title}`)
369
368
 
370
369
  // we are setting test opts so they can be picked up by Playwright if it starts browser for this test
371
370
  suite.eachTest(test => {
@@ -420,7 +419,7 @@ function loadCookiesFromFile(config) {
420
419
  } catch (err) {
421
420
  throw new Error(`Could not load session from ${fileName}\n${err}`)
422
421
  }
423
- debug(`Loaded user session for ${name}`)
422
+ output.debug(`Loaded user session for ${name}`)
424
423
  }
425
424
  }
426
425
 
@@ -1,8 +1,12 @@
1
- const Container = require('../container')
2
- const store = require('../store')
3
- const recorder = require('../recorder')
4
- const event = require('../event')
5
- const { log } = require('../output')
1
+ import Container from '../container.js'
2
+
3
+ import store from '../store.js'
4
+
5
+ import recorder from '../recorder.js'
6
+
7
+ import event from '../event.js'
8
+
9
+ import output from '../output.js'
6
10
  const standardActingHelpers = Container.STANDARD_ACTING_HELPERS
7
11
 
8
12
  const methodsToDelay = ['click', 'fillField', 'checkOption', 'pressKey', 'doubleClick', 'rightClick']
@@ -51,7 +55,7 @@ const defaultConfig = {
51
55
  * * `delayAfter`: put a delay after a command. 200ms by default
52
56
  *
53
57
  */
54
- module.exports = function (config) {
58
+ export default function (config) {
55
59
  const affectedHelpers = [...standardActingHelpers, 'REST']
56
60
  const helpers = Container.helpers()
57
61
  let helper
@@ -71,7 +75,7 @@ module.exports = function (config) {
71
75
 
72
76
  recorder.add('auto-delay', async () => {
73
77
  if (store.debugMode) return // no need to delay in debug
74
- log(`Delaying for ${config.delayBefore}ms`)
78
+ output.log(`Delaying for ${config.delayBefore}ms`)
75
79
  return new Promise(resolve => {
76
80
  setTimeout(resolve, config.delayBefore)
77
81
  })
@@ -83,7 +87,7 @@ module.exports = function (config) {
83
87
 
84
88
  recorder.add('auto-delay', async () => {
85
89
  if (store.debugMode) return // no need to delay in debug
86
- log(`Delaying for ${config.delayAfter}ms`)
90
+ output.log(`Delaying for ${config.delayAfter}ms`)
87
91
  return new Promise(resolve => {
88
92
  setTimeout(resolve, config.delayAfter)
89
93
  })
@@ -1,10 +1,14 @@
1
- const debugModule = require('debug')
2
- const { CoverageReport } = require('monocart-coverage-reports')
3
- const Container = require('../container')
4
- const recorder = require('../recorder')
5
- const event = require('../event')
6
- const output = require('../output')
7
- const { deepMerge } = require('../utils')
1
+ import debugModule from 'debug'
2
+ import { CoverageReport } from 'monocart-coverage-reports'
3
+ import Container from '../container.js'
4
+
5
+ import recorder from '../recorder.js'
6
+
7
+ import event from '../event.js'
8
+
9
+ import output from '../output.js'
10
+
11
+ import { deepMerge } from '../utils.js'
8
12
 
9
13
  const defaultConfig = {
10
14
  name: 'CodeceptJS Coverage Report',
@@ -113,7 +117,7 @@ const v8CoverageHelpers = {
113
117
  * * `sourcePath`: option to resolve a custom path.
114
118
  *
115
119
  */
116
- module.exports = function (config) {
120
+ export default function (config) {
117
121
  config = deepMerge(defaultConfig, config)
118
122
 
119
123
  if (config.debug) config.logging = 'debug'
@@ -145,9 +149,22 @@ module.exports = function (config) {
145
149
  const coverageReport = new CoverageReport(coverageOptions)
146
150
  coverageReport.cleanCache()
147
151
 
148
- event.dispatcher.on(event.all.after, async () => {
149
- output.print(`writing ${coverageOptions.outputDir}`)
150
- await coverageReport.generate()
152
+ event.dispatcher.on(event.all.after, () => {
153
+ // Add coverage generation to recorder to ensure it completes before process exit
154
+ recorder.add(
155
+ 'generate coverage report',
156
+ async () => {
157
+ try {
158
+ output.print(`writing ${coverageOptions.outputDir}`)
159
+ await coverageReport.generate()
160
+ } catch (error) {
161
+ output.print(`Failed to generate coverage report: ${error.message}`)
162
+ // Don't throw - coverage failure shouldn't fail tests
163
+ }
164
+ },
165
+ true,
166
+ false,
167
+ )
151
168
  })
152
169
 
153
170
  // we're going to try to "start" coverage before each step because this is
@@ -1,5 +1,5 @@
1
- const Locator = require('../locator')
2
- const { xpathLocator } = require('../utils')
1
+ import Locator from '../locator.js'
2
+ import { xpathLocator } from '../utils.js'
3
3
 
4
4
  const defaultConfig = {
5
5
  prefix: '$',
@@ -111,7 +111,7 @@ const defaultConfig = {
111
111
  * I.click('=sign-up'); // matches => [data-qa=sign-up],[data-test=sign-up]
112
112
  * ```
113
113
  */
114
- module.exports = config => {
114
+ export default function (config) {
115
115
  config = { ...defaultConfig, ...config }
116
116
 
117
117
  Locator.addFilter((value, locatorObj) => {
@@ -1,9 +1,10 @@
1
- const event = require('../event')
1
+ import event from '../event.js'
2
+
2
3
 
3
4
  /**
4
5
  * Sample custom reporter for CodeceptJS.
5
6
  */
6
- module.exports = function (config) {
7
+ export default function (config) {
7
8
  event.dispatcher.on(event.hook.finished, hook => {
8
9
  if (config.onHookFinished) {
9
10
  config.onHookFinished(hook)
@@ -1,8 +1,8 @@
1
- const event = require('../event')
2
- const recorder = require('../recorder')
3
- const store = require('../store')
4
- const output = require('../output')
5
- const { RETRY_PRIORITIES } = require('../retryCoordinator')
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
6
 
7
7
  const defaultConfig = {
8
8
  retries: 3,
@@ -17,7 +17,7 @@ const defaultConfig = {
17
17
  * This plugin provides step-level retries and coordinates with global retry settings
18
18
  * to avoid conflicts and provide predictable behavior.
19
19
  */
20
- module.exports = config => {
20
+ export default config => {
21
21
  config = Object.assign({}, defaultConfig, config)
22
22
  config.ignoredSteps = config.ignoredSteps.concat(config.defaultIgnoredSteps)
23
23
  const customWhen = config.when
@@ -1,11 +1,16 @@
1
- const debug = require('debug')('codeceptjs:heal')
2
- const colors = require('chalk')
3
- const recorder = require('../recorder')
4
- const event = require('../event')
5
- const output = require('../output')
6
- const heal = require('../heal')
7
- const store = require('../store')
8
- const container = require('../container')
1
+ import debugFactory from 'debug'
2
+ const debug = debugFactory('codeceptjs:heal')
3
+ import colors from 'chalk'
4
+ import recorder from '../recorder.js'
5
+
6
+ import event from '../event.js'
7
+
8
+ import output from '../output.js'
9
+
10
+ import healModule from '../heal.js'
11
+ const heal = healModule.default || healModule
12
+ import store from '../store.js'
13
+
9
14
 
10
15
  const defaultConfig = {
11
16
  healLimit: 2,
@@ -29,7 +34,7 @@ const defaultConfig = {
29
34
  * * `healLimit` - how many steps can be healed in a single test (default: 2)
30
35
  *
31
36
  */
32
- module.exports = function (config = {}) {
37
+ export default function (config = {}) {
33
38
  if (store.debugMode && !process.env.DEBUG) {
34
39
  event.dispatcher.on(event.test.failed, () => {
35
40
  output.plugin('heal', 'Healing is disabled in --debug mode, use DEBUG="codeceptjs:heal" to enable it in debug mode')