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,213 +0,0 @@
1
- if (!window.codeceptjs) {
2
- /**
3
- * @alias CodeceptJS.browserCodecept
4
- * @namespace
5
- */
6
- const codeceptjs = {};
7
-
8
- /**
9
- * all found elements are stored here for reuse
10
- * @inner
11
- * @type {Node[]}
12
- */
13
- codeceptjs.elements = [];
14
-
15
- /**
16
- * global context changer
17
- * @inner
18
- * @type {?Node}
19
- */
20
- codeceptjs.within = null;
21
-
22
- // save
23
- const storeElement = function (el) {
24
- if (!el) return;
25
- return codeceptjs.elements.push(el) - 1; // return index
26
- };
27
-
28
- const storeElements = function (els) {
29
- return els.map(el => storeElement(el));
30
- };
31
-
32
- /**
33
- * finders
34
- * @param {number} id
35
- * @return {Node}
36
- */
37
- codeceptjs.fetchElement = function (id) {
38
- if (!this.elements[id]) throw new Error(`Element (${id}) is not accessible`);
39
- return this.elements[id];
40
- };
41
-
42
- /**
43
- * @param {string} by
44
- * @param {CodeceptJS.ILocator} locator
45
- * @param {*} [contextEl]
46
- * @return {number[]}
47
- */
48
- codeceptjs.findAndStoreElements = function (by, locator, contextEl) {
49
- return storeElements(this.findElements(by, locator, contextEl));
50
- };
51
-
52
- /**
53
- * @param {string} by
54
- * @param {CodeceptJS.ILocator} locator
55
- * @param {*} [contextEl]
56
- * @return {number | undefined}
57
- */
58
- codeceptjs.findAndStoreElement = function (by, locator, contextEl) {
59
- return storeElement(this.findElement(by, locator, contextEl));
60
- };
61
-
62
- /**
63
- * @param {string} by
64
- * @param {CodeceptJS.ILocator} locator
65
- */
66
- codeceptjs.setWithin = function (by, locator) {
67
- this.within = this.findElement(by, locator);
68
- };
69
-
70
- /**
71
- * @param {string} by
72
- * @param {CodeceptJS.ILocator} locator
73
- * @param {*} [contextEl]
74
- * @return {Node[]}
75
- */
76
- codeceptjs.findElements = function (by, locator, contextEl) {
77
- let context;
78
- if (typeof contextEl !== 'number') {
79
- context = this.within || document;
80
- } else {
81
- context = this.fetchElement(contextEl);
82
- }
83
-
84
- if (by === 'name') {
85
- by = 'css';
86
- locator = `*[name="${locator}"]`;
87
- }
88
- if (by === 'id') {
89
- by = 'css';
90
- locator = `#${locator}`;
91
- }
92
-
93
- if (by === 'css') {
94
- const found = context.querySelectorAll(locator);
95
- const res = [];
96
- for (let i = 0; i < found.length; i++) {
97
- res.push(found[i]);
98
- }
99
- return res;
100
- }
101
-
102
- if (by === 'xpath') {
103
- const found = document.evaluate(locator, context, null, 5, null);
104
- const res = [];
105
- let current = null;
106
- while (current = found.iterateNext()) {
107
- res.push(current);
108
- }
109
- return res;
110
- }
111
-
112
- if (by === 'frame') {
113
- if (!Array.isArray(locator)) locator = [locator];
114
- return [locator.reduce((parent, child) => parent.querySelector(child).contentDocument, window.document).querySelector('body')];
115
- }
116
- return [];
117
- };
118
-
119
- /**
120
- * @param {string} by
121
- * @param {CodeceptJS.ILocator} locator
122
- * @param {*} [context]
123
- * @return {?Node}
124
- */
125
- codeceptjs.findElement = function (by, locator, context) {
126
- return this.findElements(by, locator, context)[0] || null;
127
- };
128
-
129
- // actions
130
- /**
131
- * @param {number} el
132
- * @return {boolean}
133
- */
134
- codeceptjs.clickEl = function (el) {
135
- if (document.activeElement instanceof HTMLElement) {
136
- document.activeElement.blur();
137
- }
138
- const event = document.createEvent('MouseEvent');
139
- event.initEvent('click', true, true);
140
- return this.fetchElement(el).dispatchEvent(event);
141
- };
142
-
143
- /** @param {number} el */
144
- codeceptjs.doubleClickEl = function (el) {
145
- if (document.activeElement instanceof HTMLElement) {
146
- document.activeElement.blur();
147
- }
148
- const event = document.createEvent('MouseEvent');
149
- event.initEvent('dblclick', true, true);
150
- this.fetchElement(el).dispatchEvent(event);
151
- };
152
-
153
- /**
154
- * @param {number} el
155
- * @param {number | undefined} x
156
- * @param {number | undefined} y
157
- */
158
- codeceptjs.hoverEl = function (el, x, y) {
159
- if (document.activeElement instanceof HTMLElement) {
160
- document.activeElement.blur();
161
- }
162
-
163
- const event = new MouseEvent('mouseover', {
164
- bubbles: true,
165
- cancelable: true,
166
- screenX: x,
167
- screenY: y,
168
- clientX: x,
169
- clientY: y,
170
- });
171
-
172
- this.fetchElement(el).dispatchEvent(event);
173
- };
174
-
175
- /** @param {number} el */
176
- codeceptjs.rightClickEl = function (el) {
177
- const event = new MouseEvent('contextmenu', {
178
- bubbles: true,
179
- cancelable: true,
180
- view: window,
181
- buttons: 2,
182
- });
183
-
184
- this.fetchElement(el).dispatchEvent(event);
185
- };
186
-
187
- /**
188
- * @param {number} el
189
- * @return {boolean | undefined}
190
- */
191
- codeceptjs.checkEl = function (el) {
192
- const element = this.fetchElement(el);
193
- const event = document.createEvent('HTMLEvents');
194
- if (element.checked) return;
195
- element.checked = true;
196
- event.initEvent('change', true, true);
197
- return element.dispatchEvent(event);
198
- };
199
-
200
- /**
201
- * @param {number} el
202
- * @return {boolean}
203
- */
204
- codeceptjs.unCheckEl = function (el) {
205
- const element = this.fetchElement(el);
206
- const event = document.createEvent('HTMLEvents');
207
- element.checked = false;
208
- event.initEvent('change', true, true);
209
- return element.dispatchEvent(event);
210
- };
211
-
212
- window.codeceptjs = codeceptjs;
213
- }
@@ -1,42 +0,0 @@
1
- const testControllerHolder = {
2
-
3
- testController: undefined,
4
- captureResolver: undefined,
5
- getResolver: undefined,
6
-
7
- capture(t) {
8
- testControllerHolder.testController = t;
9
-
10
- if (testControllerHolder.getResolver) {
11
- // @ts-ignore
12
- testControllerHolder.getResolver(t);
13
- }
14
-
15
- return new Promise((resolve) => {
16
- // @ts-ignore
17
- testControllerHolder.captureResolver = resolve;
18
- });
19
- },
20
-
21
- free() {
22
- testControllerHolder.testController = undefined;
23
-
24
- if (testControllerHolder.captureResolver) {
25
- // @ts-ignore
26
- testControllerHolder.captureResolver();
27
- }
28
- },
29
-
30
- get() {
31
- return new Promise((resolve) => {
32
- if (testControllerHolder.testController) {
33
- resolve(testControllerHolder.testController);
34
- } else {
35
- // @ts-ignore
36
- testControllerHolder.getResolver = resolve;
37
- }
38
- });
39
- },
40
- };
41
-
42
- module.exports = testControllerHolder;
@@ -1,61 +0,0 @@
1
- const { ClientFunction } = require('testcafe')
2
-
3
- const assert = require('assert')
4
- const fs = require('fs')
5
- const path = require('path')
6
- const { getParamNames } = require('../../utils')
7
-
8
- const createTestFile = () => {
9
- assert(global.output_dir, 'global.output_dir must be set')
10
-
11
- const testFile = path.join(global.output_dir, `${Date.now()}_test.js`)
12
- const testControllerHolderDir = __dirname.replace(/\\/g, '/')
13
-
14
- fs.writeFileSync(
15
- testFile,
16
- `import testControllerHolder from "${testControllerHolderDir}/testControllerHolder.js";\n\n
17
- fixture("fixture")\n
18
- test\n
19
- ("test", testControllerHolder.capture)`,
20
- )
21
-
22
- return testFile
23
- }
24
-
25
- // TODO Better error mapping (actual, expected)
26
- const mapError = testcafeError => {
27
- // console.log('TODO map error better', JSON.stringify(testcafeError, null, 2));
28
- if (testcafeError.errMsg) {
29
- throw new Error(testcafeError.errMsg)
30
- }
31
- const errorInfo = `${testcafeError.callsite ? JSON.stringify(testcafeError.callsite) : ''} ${testcafeError.apiFnChain || JSON.stringify(testcafeError)}`
32
- throw new Error(`TestCafe Error: ${errorInfo}`)
33
- }
34
-
35
- function createClientFunction(func, args) {
36
- if (!args || !args.length) {
37
- return ClientFunction(func)
38
- }
39
- const paramNames = getParamNames(func)
40
- const dependencies = {}
41
- paramNames.forEach((param, i) => (dependencies[param] = args[i]))
42
-
43
- return ClientFunction(getFuncBody(func), { dependencies })
44
- }
45
-
46
- function getFuncBody(func) {
47
- let fnStr = func.toString()
48
- const arrowIndex = fnStr.indexOf('=>')
49
- if (arrowIndex >= 0) {
50
- fnStr = fnStr.slice(arrowIndex + 2)
51
-
52
- return eval(`() => ${fnStr}`)
53
- }
54
- // TODO: support general functions
55
- }
56
-
57
- module.exports = {
58
- createTestFile,
59
- mapError,
60
- createClientFunction,
61
- }
@@ -1,15 +0,0 @@
1
- module.exports = () => {
2
- console.log('Allure plugin was moved to @codeceptjs/allure-legacy. Please install it and update your config')
3
- console.log()
4
- console.log('npm install @codeceptjs/allure-legacy --save-dev')
5
- console.log()
6
- console.log('Then update your config to use it:')
7
- console.log()
8
- console.log('plugins: {')
9
- console.log(' allure: {')
10
- console.log(' enabled: true,')
11
- console.log(" require: '@codeceptjs/allure-legacy',")
12
- console.log(' }')
13
- console.log('}')
14
- console.log()
15
- }
@@ -1,5 +0,0 @@
1
- const auth = require('./auth')
2
-
3
- console.log('autoLogin plugin was renamed to auth plugin. Please update your config.')
4
-
5
- module.exports = auth
@@ -1,141 +0,0 @@
1
- const event = require('../event')
2
- const recorder = require('../recorder')
3
- const { MetaStep } = require('../step')
4
-
5
- let currentCommentStep
6
-
7
- const defaultGlobalName = '__'
8
-
9
- /**
10
- * This plugin is **deprecated**, use `Section` instead.
11
- *
12
- * Add descriptive nested steps for your tests:
13
- *
14
- * ```js
15
- * Scenario('project update test', async (I) => {
16
- * __`Given`;
17
- * const projectId = await I.have('project');
18
- *
19
- * __`When`;
20
- * projectPage.update(projectId, { title: 'new title' });
21
- *
22
- * __`Then`;
23
- * projectPage.open(projectId);
24
- * I.see('new title', 'h1');
25
- * })
26
- * ```
27
- * Steps prefixed with `__` will be printed as nested steps in `--steps` output:
28
- *
29
- * ```
30
- * Given
31
- * I have "project"
32
- * When
33
- * projectPage update
34
- * Then
35
- * projectPage open
36
- * I see "new title", "h1"
37
- * ```
38
- *
39
- * Also those steps will be exported to allure reports.
40
- *
41
- * This plugin can be used
42
- *
43
- * ### Config
44
- *
45
- * * `enabled` - (default: false) enable a plugin
46
- * * `registerGlobal` - (default: false) register `__` template literal function globally. You can override function global name by providing a name as a value.
47
- *
48
- * ### Examples
49
- *
50
- * Registering `__` globally:
51
- *
52
- * ```js
53
- * plugins: {
54
- * commentStep: {
55
- * enabled: true,
56
- * registerGlobal: true
57
- * }
58
- * }
59
- * ```
60
- *
61
- * Registering `Step` globally:
62
- * ```js
63
- * plugins: {
64
- * commentStep: {
65
- * enabled: true,
66
- * registerGlobal: 'Step'
67
- * }
68
- * }
69
- * ```
70
- *
71
- * Using only local function names:
72
- * ```js
73
- * plugins: {
74
- * commentStep: {
75
- * enabled: true
76
- * }
77
- * }
78
- * ```
79
- * Then inside a test import a comment function from a plugin.
80
- * For instance, you can prepare Given/When/Then functions to use them inside tests:
81
- *
82
- * ```js
83
- * // inside a test
84
- * const step = codeceptjs.container.plugins('commentStep');
85
- *
86
- * const Given = () => step`Given`;
87
- * const When = () => step`When`;
88
- * const Then = () => step`Then`;
89
- * ```
90
- *
91
- * Scenario('project update test', async (I) => {
92
- * Given();
93
- * const projectId = await I.have('project');
94
- *
95
- * When();
96
- * projectPage.update(projectId, { title: 'new title' });
97
- *
98
- * Then();
99
- * projectPage.open(projectId);
100
- * I.see('new title', 'h1');
101
- * });
102
- * ```
103
- */
104
- module.exports = function (config) {
105
- console.log('commentStep is deprecated, disable it and use Section instead')
106
- console.log('const { Section: __ } = require("codeceptjs/steps")')
107
-
108
- event.dispatcher.on(event.test.started, () => {
109
- currentCommentStep = null
110
- })
111
-
112
- event.dispatcher.on(event.step.started, step => {
113
- if (currentCommentStep) {
114
- const metaStep = getRootMetaStep(step)
115
-
116
- if (metaStep !== currentCommentStep) {
117
- metaStep.metaStep = currentCommentStep
118
- }
119
- }
120
- })
121
-
122
- if (config.registerGlobal) {
123
- if (config.registerGlobal === true) {
124
- config.registerGlobal = defaultGlobalName
125
- }
126
- global[config.registerGlobal] = setCommentString
127
- }
128
-
129
- return setCommentString
130
- }
131
-
132
- function getRootMetaStep(step) {
133
- if (step.metaStep) return getRootMetaStep(step.metaStep)
134
- return step
135
- }
136
-
137
- function setCommentString(string) {
138
- recorder.add('set comment metastep', () => {
139
- currentCommentStep = new MetaStep(String.raw(string), '')
140
- })
141
- }
@@ -1,127 +0,0 @@
1
- const output = require('../output')
2
- const store = require('../store')
3
- const recorder = require('../recorder')
4
- const container = require('../container')
5
- const event = require('../event')
6
- const Step = require('../step')
7
- const { isAsyncFunction } = require('../utils')
8
-
9
- const defaultConfig = {
10
- registerGlobal: true,
11
- }
12
-
13
- /**
14
- * Provides `eachElement` global function to iterate over found elements to perform actions on them.
15
- *
16
- * `eachElement` takes following args:
17
- * * `purpose` - the goal of an action. A comment text that will be displayed in output.
18
- * * `locator` - a CSS/XPath locator to match elements
19
- * * `fn(element, index)` - **asynchronous** function which will be executed for each matched element.
20
- *
21
- * Example of usage:
22
- *
23
- * ```js
24
- * // this example works with Playwright and Puppeteer helper
25
- * await eachElement('click all checkboxes', 'form input[type=checkbox]', async (el) => {
26
- * await el.click();
27
- * });
28
- * ```
29
- * Click odd elements:
30
- *
31
- * ```js
32
- * // this example works with Playwright and Puppeteer helper
33
- * await eachElement('click odd buttons', '.button-select', async (el, index) => {
34
- * if (index % 2) await el.click();
35
- * });
36
- * ```
37
- *
38
- * Check all elements for visibility:
39
- *
40
- * ```js
41
- * // this example works with Playwright and Puppeteer helper
42
- * const assert = require('assert');
43
- * await eachElement('check all items are visible', '.item', async (el) => {
44
- * assert(await el.isVisible());
45
- * });
46
- * ```
47
- * This method works with WebDriver, Playwright, Puppeteer, Appium helpers.
48
- *
49
- * Function parameter `el` represents a matched element.
50
- * Depending on a helper API of `el` can be different. Refer to API of corresponding browser testing engine for a complete API list:
51
- *
52
- * * [Playwright ElementHandle](https://playwright.dev/docs/api/class-elementhandle)
53
- * * [Puppeteer](https://pptr.dev/#?product=Puppeteer&show=api-class-elementhandle)
54
- * * [webdriverio element](https://webdriver.io/docs/api)
55
- *
56
- * #### Configuration
57
- *
58
- * * `registerGlobal` - to register `eachElement` function globally, true by default
59
- *
60
- * If `registerGlobal` is false you can use eachElement from the plugin:
61
- *
62
- * ```js
63
- * const eachElement = codeceptjs.container.plugins('eachElement');
64
- * ```
65
- *
66
- * @param {string} purpose
67
- * @param {CodeceptJS.LocatorOrString} locator
68
- * @param {Function} fn
69
- * @return {Promise<*> | undefined}
70
- */
71
- function eachElement(purpose, locator, fn) {
72
- if (store.dryRun) return
73
- const helpers = Object.values(container.helpers())
74
-
75
- const helper = helpers.filter(h => !!h._locate)[0]
76
-
77
- if (!helper) {
78
- throw new Error('No helper enabled with _locate method with returns a list of elements.')
79
- }
80
-
81
- if (!isAsyncFunction(fn)) {
82
- throw new Error('Async function should be passed into each element')
83
- }
84
-
85
- const step = new Step(helper, `${purpose || 'each element'} within "${locator}"`)
86
- step.helperMethod = '_locate'
87
- // eachElement('select all users', 'locator', async (el) => {
88
- event.dispatcher.emit(event.step.before, step)
89
-
90
- return recorder.add('register each element wrapper', async () => {
91
- event.emit(event.step.started, step)
92
- const els = await helper._locate(locator)
93
- output.debug(`Found ${els.length} elements for each elements to iterate`)
94
-
95
- const errs = []
96
- let i = 0
97
- for (const el of els) {
98
- try {
99
- await fn(el, i)
100
- } catch (err) {
101
- output.error(`eachElement: failed operation on element #${i} ${el}`)
102
- errs.push(err)
103
- }
104
- i++
105
- }
106
-
107
- if (errs.length) {
108
- event.dispatcher.emit(event.step.after, step)
109
- event.emit(event.step.failed, step, errs[0])
110
- event.emit(event.step.finished, step)
111
- throw errs[0]
112
- }
113
-
114
- event.dispatcher.emit(event.step.after, step)
115
- event.emit(event.step.passed, step, null)
116
- event.emit(event.step.finished, step)
117
- })
118
- }
119
-
120
- module.exports = function (config) {
121
- config = Object.assign(defaultConfig, config)
122
-
123
- if (config.registerGlobal) {
124
- global.eachElement = eachElement
125
- }
126
- return eachElement
127
- }
@@ -1,49 +0,0 @@
1
- const { faker } = require('@faker-js/faker')
2
- const transform = require('../transform')
3
-
4
- /**
5
- * Use the `@faker-js/faker` package to generate fake data inside examples on your gherkin tests
6
- *
7
- * #### Usage
8
- *
9
- * To start please install `@faker-js/faker` package
10
- *
11
- * ```
12
- * npm install -D @faker-js/faker
13
- * ```
14
- *
15
- * ```
16
- * yarn add -D @faker-js/faker
17
- * ```
18
- *
19
- * Add this plugin to config file:
20
- *
21
- * ```js
22
- * plugins: {
23
- * fakerTransform: {
24
- * enabled: true
25
- * }
26
- * }
27
- * ```
28
- *
29
- * Add the faker API using a mustache string format inside examples tables in your gherkin scenario outline
30
- *
31
- * ```feature
32
- * Scenario Outline: ...
33
- * Given ...
34
- * When ...
35
- * Then ...
36
- * Examples:
37
- * | productName | customer | email | anythingMore |
38
- * | {{commerce.product}} | Dr. {{name.findName}} | {{internet.email}} | staticData |
39
- * ```
40
- *
41
- */
42
- module.exports = function (config) {
43
- transform.addTransformerBeforeAll('gherkin.examples', value => {
44
- if (typeof value === 'string' && value.length > 0) {
45
- return faker.helpers.fake(value)
46
- }
47
- return value
48
- })
49
- }
@@ -1,16 +0,0 @@
1
- const { retryTo } = require('../effects')
2
-
3
- const defaultConfig = {
4
- registerGlobal: true,
5
- }
6
-
7
- module.exports = function (config) {
8
- config = Object.assign(defaultConfig, config)
9
- console.log(`Deprecation Warning: 'retryTo' has been moved to the 'codeceptjs/effects' module. Disable retryTo plugin to remove this warning.`)
10
-
11
- if (config.registerGlobal) {
12
- global.retryTo = retryTo
13
- }
14
-
15
- return retryTo
16
- }