codeceptjs 4.0.0-beta.5 → 4.0.0-beta.6.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 (179) hide show
  1. package/README.md +0 -45
  2. package/bin/codecept.js +46 -57
  3. package/lib/actor.js +15 -11
  4. package/lib/ai.js +6 -5
  5. package/lib/assert/empty.js +9 -8
  6. package/lib/assert/equal.js +15 -17
  7. package/lib/assert/error.js +2 -2
  8. package/lib/assert/include.js +9 -11
  9. package/lib/assert/throws.js +1 -1
  10. package/lib/assert/truth.js +8 -5
  11. package/lib/assert.js +18 -18
  12. package/lib/codecept.js +66 -107
  13. package/lib/colorUtils.js +48 -50
  14. package/lib/command/check.js +32 -27
  15. package/lib/command/configMigrate.js +11 -10
  16. package/lib/command/definitions.js +16 -10
  17. package/lib/command/dryRun.js +16 -16
  18. package/lib/command/generate.js +29 -26
  19. package/lib/command/gherkin/init.js +36 -38
  20. package/lib/command/gherkin/snippets.js +14 -14
  21. package/lib/command/gherkin/steps.js +21 -18
  22. package/lib/command/info.js +8 -8
  23. package/lib/command/init.js +34 -31
  24. package/lib/command/interactive.js +11 -10
  25. package/lib/command/list.js +10 -9
  26. package/lib/command/run-multiple/chunk.js +5 -5
  27. package/lib/command/run-multiple/collection.js +5 -5
  28. package/lib/command/run-multiple/run.js +3 -3
  29. package/lib/command/run-multiple.js +16 -13
  30. package/lib/command/run-rerun.js +6 -7
  31. package/lib/command/run-workers.js +10 -24
  32. package/lib/command/run.js +8 -8
  33. package/lib/command/utils.js +20 -18
  34. package/lib/command/workers/runTests.js +117 -269
  35. package/lib/config.js +111 -49
  36. package/lib/container.js +299 -102
  37. package/lib/data/context.js +6 -5
  38. package/lib/data/dataScenarioConfig.js +1 -1
  39. package/lib/data/dataTableArgument.js +1 -1
  40. package/lib/data/table.js +1 -1
  41. package/lib/effects.js +94 -10
  42. package/lib/els.js +11 -9
  43. package/lib/event.js +11 -10
  44. package/lib/globals.js +141 -0
  45. package/lib/heal.js +12 -12
  46. package/lib/helper/AI.js +1 -1
  47. package/lib/helper/ApiDataFactory.js +16 -13
  48. package/lib/helper/FileSystem.js +32 -12
  49. package/lib/helper/GraphQL.js +1 -1
  50. package/lib/helper/GraphQLDataFactory.js +1 -1
  51. package/lib/helper/JSONResponse.js +19 -30
  52. package/lib/helper/Mochawesome.js +9 -28
  53. package/lib/helper/Playwright.js +668 -265
  54. package/lib/helper/Puppeteer.js +284 -169
  55. package/lib/helper/REST.js +29 -12
  56. package/lib/helper/WebDriver.js +191 -71
  57. package/lib/helper/errors/ConnectionRefused.js +6 -6
  58. package/lib/helper/errors/ElementAssertion.js +11 -16
  59. package/lib/helper/errors/ElementNotFound.js +5 -9
  60. package/lib/helper/errors/RemoteBrowserConnectionRefused.js +5 -5
  61. package/lib/helper/extras/Console.js +11 -11
  62. package/lib/helper/extras/PlaywrightLocator.js +110 -0
  63. package/lib/helper/extras/PlaywrightPropEngine.js +18 -18
  64. package/lib/helper/extras/PlaywrightRestartOpts.js +23 -23
  65. package/lib/helper/extras/Popup.js +1 -1
  66. package/lib/helper/extras/React.js +29 -30
  67. package/lib/helper/network/actions.js +33 -48
  68. package/lib/helper/network/utils.js +76 -83
  69. package/lib/helper/scripts/blurElement.js +6 -6
  70. package/lib/helper/scripts/focusElement.js +6 -6
  71. package/lib/helper/scripts/highlightElement.js +9 -9
  72. package/lib/helper/scripts/isElementClickable.js +34 -34
  73. package/lib/helper.js +2 -1
  74. package/lib/history.js +23 -20
  75. package/lib/hooks.js +10 -10
  76. package/lib/html.js +90 -100
  77. package/lib/index.js +48 -21
  78. package/lib/listener/config.js +8 -9
  79. package/lib/listener/emptyRun.js +6 -7
  80. package/lib/listener/exit.js +4 -3
  81. package/lib/listener/globalRetry.js +5 -5
  82. package/lib/listener/globalTimeout.js +11 -10
  83. package/lib/listener/helpers.js +33 -14
  84. package/lib/listener/mocha.js +3 -4
  85. package/lib/listener/result.js +4 -5
  86. package/lib/listener/steps.js +7 -18
  87. package/lib/listener/store.js +3 -3
  88. package/lib/locator.js +213 -192
  89. package/lib/mocha/asyncWrapper.js +108 -75
  90. package/lib/mocha/bdd.js +99 -13
  91. package/lib/mocha/cli.js +60 -27
  92. package/lib/mocha/factory.js +75 -19
  93. package/lib/mocha/featureConfig.js +1 -1
  94. package/lib/mocha/gherkin.js +57 -25
  95. package/lib/mocha/hooks.js +12 -3
  96. package/lib/mocha/index.js +13 -4
  97. package/lib/mocha/inject.js +22 -5
  98. package/lib/mocha/scenarioConfig.js +2 -2
  99. package/lib/mocha/suite.js +9 -2
  100. package/lib/mocha/test.js +10 -13
  101. package/lib/mocha/ui.js +28 -31
  102. package/lib/output.js +11 -9
  103. package/lib/parser.js +44 -44
  104. package/lib/pause.js +15 -16
  105. package/lib/plugin/analyze.js +19 -12
  106. package/lib/plugin/auth.js +20 -21
  107. package/lib/plugin/autoDelay.js +12 -8
  108. package/lib/plugin/coverage.js +12 -8
  109. package/lib/plugin/customLocator.js +3 -3
  110. package/lib/plugin/customReporter.js +3 -2
  111. package/lib/plugin/heal.js +14 -9
  112. package/lib/plugin/pageInfo.js +10 -10
  113. package/lib/plugin/pauseOnFail.js +4 -3
  114. package/lib/plugin/retryFailedStep.js +47 -5
  115. package/lib/plugin/screenshotOnFail.js +75 -37
  116. package/lib/plugin/stepByStepReport.js +14 -14
  117. package/lib/plugin/stepTimeout.js +4 -3
  118. package/lib/plugin/subtitles.js +6 -5
  119. package/lib/recorder.js +33 -23
  120. package/lib/rerun.js +69 -26
  121. package/lib/result.js +4 -4
  122. package/lib/secret.js +18 -17
  123. package/lib/session.js +95 -89
  124. package/lib/step/base.js +6 -6
  125. package/lib/step/config.js +1 -1
  126. package/lib/step/func.js +3 -3
  127. package/lib/step/helper.js +3 -3
  128. package/lib/step/meta.js +4 -4
  129. package/lib/step/record.js +11 -11
  130. package/lib/step/retry.js +3 -3
  131. package/lib/step/section.js +3 -3
  132. package/lib/step.js +7 -10
  133. package/lib/steps.js +9 -5
  134. package/lib/store.js +1 -1
  135. package/lib/timeout.js +1 -7
  136. package/lib/transform.js +8 -8
  137. package/lib/translation.js +32 -18
  138. package/lib/utils.js +68 -97
  139. package/lib/workerStorage.js +16 -17
  140. package/lib/workers.js +145 -171
  141. package/package.json +63 -57
  142. package/translations/de-DE.js +2 -2
  143. package/translations/fr-FR.js +2 -2
  144. package/translations/index.js +23 -10
  145. package/translations/it-IT.js +2 -2
  146. package/translations/ja-JP.js +2 -2
  147. package/translations/nl-NL.js +2 -2
  148. package/translations/pl-PL.js +2 -2
  149. package/translations/pt-BR.js +2 -2
  150. package/translations/ru-RU.js +2 -2
  151. package/translations/utils.js +11 -2
  152. package/translations/zh-CN.js +2 -2
  153. package/translations/zh-TW.js +2 -2
  154. package/typings/index.d.ts +7 -18
  155. package/typings/promiseBasedTypes.d.ts +3769 -5450
  156. package/typings/types.d.ts +3953 -5778
  157. package/bin/test-server.js +0 -53
  158. package/lib/element/WebElement.js +0 -327
  159. package/lib/helper/Nightmare.js +0 -1486
  160. package/lib/helper/Protractor.js +0 -1840
  161. package/lib/helper/TestCafe.js +0 -1391
  162. package/lib/helper/clientscripts/nightmare.js +0 -213
  163. package/lib/helper/extras/PlaywrightReactVueLocator.js +0 -43
  164. package/lib/helper/testcafe/testControllerHolder.js +0 -42
  165. package/lib/helper/testcafe/testcafe-utils.js +0 -61
  166. package/lib/listener/retryEnhancer.js +0 -85
  167. package/lib/plugin/allure.js +0 -15
  168. package/lib/plugin/autoLogin.js +0 -5
  169. package/lib/plugin/commentStep.js +0 -141
  170. package/lib/plugin/eachElement.js +0 -127
  171. package/lib/plugin/fakerTransform.js +0 -49
  172. package/lib/plugin/htmlReporter.js +0 -1947
  173. package/lib/plugin/retryTo.js +0 -16
  174. package/lib/plugin/selenoid.js +0 -364
  175. package/lib/plugin/standardActingHelpers.js +0 -6
  176. package/lib/plugin/tryTo.js +0 -16
  177. package/lib/plugin/wdio.js +0 -247
  178. package/lib/test-server.js +0 -323
  179. package/lib/within.js +0 -90
@@ -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
- }
@@ -1,364 +0,0 @@
1
- const util = require('util')
2
- const path = require('path')
3
- const fs = require('fs')
4
- const axios = require('axios').default
5
- const exec = util.promisify(require('child_process').exec)
6
- const { clearString, deepMerge } = require('../utils')
7
- const { container, event, recorder, output } = require('../index')
8
-
9
- const defaultBrowserConfig = {
10
- chrome: {
11
- default: 'latest',
12
- versions: {
13
- latest: {
14
- image: 'selenoid/chrome:latest',
15
- port: '4444',
16
- path: '/',
17
- },
18
- },
19
- },
20
- firefox: {
21
- default: 'latest',
22
- versions: {
23
- latest: {
24
- image: 'selenoid/firefox:latest',
25
- port: '4444',
26
- path: '/wd/hub',
27
- },
28
- },
29
- },
30
- }
31
-
32
- const dockerCreateScriptArr = [
33
- 'docker create --rm --name $name$',
34
- '-p $port$:4444',
35
- '-v /var/run/docker.sock:/var/run/docker.sock',
36
- `-v ${global.codecept_dir}/:/etc/selenoid/:ro`,
37
- `-v ${global.output_dir}/video/:/opt/selenoid/video/`,
38
- `-v ${global.output_dir}/logs/:/opt/selenoid/logs/`,
39
- `-e OVERRIDE_VIDEO_OUTPUT_DIR=${global.output_dir}/video/`,
40
- '$additionalParams$',
41
- 'aerokube/selenoid:latest-release -log-output-dir /opt/selenoid/logs',
42
- ]
43
-
44
- const dockerImageCheckScript = ['docker images', "--filter reference='selenoid/video-recorder'", "--filter reference='selenoid/chrome:latest'", "--filter reference='selenoid/firefox:latest'"].join(' ')
45
-
46
- let dockerCreateScript = dockerCreateScriptArr.join(' ')
47
- let dockerStartScript = 'docker start $name$'
48
- let dockerStopScript = 'docker stop $name$'
49
- let seleniumUrl = 'http://localhost:$port$'
50
-
51
- const supportedHelpers = ['WebDriver']
52
- const SELENOID_START_TIMEOUT = 2000
53
- const SELENOID_STOP_TIMEOUT = 10000
54
- const wait = time =>
55
- new Promise(res => {
56
- setTimeout(() => {
57
- // @ts-ignore
58
- res()
59
- }, time)
60
- })
61
-
62
- /**
63
- * [Selenoid](https://aerokube.com/selenoid/) plugin automatically starts browsers and video recording.
64
- * Works with WebDriver helper.
65
- *
66
- * ### Prerequisite
67
- *
68
- * This plugin **requires Docker** to be installed.
69
- *
70
- * > If you have issues starting Selenoid with this plugin consider using the official [Configuration Manager](https://aerokube.com/cm/latest/) tool from Selenoid
71
- *
72
- * ### Usage
73
- *
74
- * Selenoid plugin can be started in two ways:
75
- *
76
- * 1. **Automatic** - this plugin will create and manage selenoid container for you.
77
- * 2. **Manual** - you create the conatainer and configure it with a plugin (recommended).
78
- *
79
- * #### Automatic
80
- *
81
- * If you are new to Selenoid and you want plug and play setup use automatic mode.
82
- *
83
- * Add plugin configuration in `codecept.conf.js`:
84
- *
85
- * ```js
86
- * plugins: {
87
- * selenoid: {
88
- * enabled: true,
89
- * deletePassed: true,
90
- * autoCreate: true,
91
- * autoStart: true,
92
- * sessionTimeout: '30m',
93
- * enableVideo: true,
94
- * enableLog: true,
95
- * },
96
- * }
97
- * ```
98
- *
99
- * When `autoCreate` is enabled it will pull the [latest Selenoid from DockerHub](https://hub.docker.com/u/selenoid) and start Selenoid automatically.
100
- * It will also create `browsers.json` file required by Selenoid.
101
- *
102
- * In automatic mode the latest version of browser will be used for tests. It is recommended to specify exact version of each browser inside `browsers.json` file.
103
- *
104
- * > **If you are using Windows machine or if `autoCreate` does not work properly, create container manually**
105
- *
106
- * #### Manual
107
- *
108
- * While this plugin can create containers for you for better control it is recommended to create and launch containers manually.
109
- * This is especially useful for Continous Integration server as you can configure scaling for Selenoid containers.
110
- *
111
- * > Use [Selenoid Configuration Manager](https://aerokube.com/cm/latest/) to create and start containers semi-automatically.
112
- *
113
- * 1. Create `browsers.json` file in the same directory `codecept.conf.js` is located
114
- * [Refer to Selenoid documentation](https://aerokube.com/selenoid/latest/#_prepare_configuration) to know more about browsers.json.
115
- *
116
- * *Sample browsers.json*
117
- *
118
- * ```js
119
- * {
120
- * "chrome": {
121
- * "default": "latest",
122
- * "versions": {
123
- * "latest": {
124
- * "image": "selenoid/chrome:latest",
125
- * "port": "4444",
126
- * "path": "/"
127
- * }
128
- * }
129
- * }
130
- * }
131
- * ```
132
- *
133
- * > It is recommended to use specific versions of browsers in `browsers.json` instead of latest. This will prevent tests fail when browsers will be updated.
134
- *
135
- * **⚠ At first launch selenoid plugin takes extra time to download all Docker images before tests starts**.
136
- *
137
- * 2. Create Selenoid container
138
- *
139
- * Run the following command to create a container. To know more [refer here](https://aerokube.com/selenoid/latest/#_option_2_start_selenoid_container)
140
- *
141
- *
142
- * ```bash
143
- * docker create \
144
- * --name selenoid \
145
- * -p 4444:4444 \
146
- * -v /var/run/docker.sock:/var/run/docker.sock \
147
- * -v `pwd`/:/etc/selenoid/:ro \
148
- * -v `pwd`/output/video/:/opt/selenoid/video/ \
149
- * -e OVERRIDE_VIDEO_OUTPUT_DIR=`pwd`/output/video/ \
150
- * aerokube/selenoid:latest-release
151
- * ```
152
- *
153
- * ### Video Recording
154
- *
155
- * This plugin allows to record and save video per each executed tests.
156
- *
157
- * When `enableVideo` is `true` this plugin saves video in `output/videos` directory with each test by name
158
- * To save space videos for all succesful tests are deleted. This can be changed by `deletePassed` option.
159
- *
160
- * When `allure` plugin is enabled a video is attached to report automatically.
161
- *
162
- * ### Options:
163
- *
164
- * | Param | Description |
165
- * |--|--|
166
- * | name | Name of the container (default : selenoid) |
167
- * | port | Port of selenium server (default : 4444) |
168
- * | autoCreate | Will automatically create container (Linux only) (default : true)|
169
- * | autoStart | If disabled start the container manually before running tests (default : true)|
170
- * | enableVideo | Enable video recording and use `video` folder of output (default: false) |
171
- * | enableLog | Enable log recording and use `logs` folder of output (default: false) |
172
- * | deletePassed | Delete video and logs of passed tests (default : true)|
173
- * | additionalParams | example: `additionalParams: '--env TEST=test'` [Refer here](https://docs.docker.com/engine/reference/commandline/create/) to know more |
174
- *
175
- */
176
-
177
- const selenoid = config => {
178
- const helpers = container.helpers()
179
- let helperName
180
-
181
- for (const name of supportedHelpers) {
182
- if (Object.keys(helpers).indexOf(name) > -1) {
183
- helperName = name
184
- }
185
- }
186
-
187
- if (!helperName) {
188
- output.print(`Selenoid plugin supported only for: ${supportedHelpers.toString()}`)
189
- return // no helpers for Selenoid
190
- }
191
-
192
- const { autoStart, name = 'selenoid', deletePassed = true, additionalParams = '', autoCreate = true, port = 4444 } = config
193
- const passedTests = []
194
-
195
- recorder.startUnlessRunning()
196
- replaceScriptConfig({ name, additionalParams, port })
197
-
198
- if (autoStart) {
199
- event.dispatcher.on(event.all.before, () => {
200
- recorder.add('Starting selenoid', () => {
201
- output.debug('Staring Selenoid... ')
202
- return createAndStart(autoCreate)
203
- .then(() => output.debug('Selenoid started'))
204
- .catch(err => {
205
- throw new Error(err.stack)
206
- })
207
- })
208
- })
209
-
210
- event.dispatcher.on(event.all.after, () => {
211
- recorder.add('Stopping selenoid', () => {
212
- output.debug('Stopping Selenoid...')
213
- return wait(SELENOID_STOP_TIMEOUT)
214
- .then(() => deletePassedTests(passedTests))
215
- .then(stopSelenoid)
216
- .then(() => output.debug('Selenoid stopped'))
217
- .catch(err => {
218
- throw new Error(err.stack)
219
- })
220
- })
221
- })
222
- }
223
-
224
- event.dispatcher.on(event.all.before, () => {
225
- switch (helperName) {
226
- case 'WebDriver':
227
- setOptionsForWebdriver(config)
228
- break
229
- }
230
- })
231
-
232
- event.dispatcher.on(event.test.before, test => {
233
- switch (helperName) {
234
- case 'WebDriver':
235
- setTestConfigForWebdriver(test)
236
- break
237
- }
238
- })
239
-
240
- if (config.enableVideo) {
241
- event.dispatcher.on(event.test.passed, test => {
242
- if (deletePassed) {
243
- passedTests.push(test.title)
244
- } else {
245
- test.artifacts.video = videoSaved(test)
246
- }
247
- })
248
-
249
- event.dispatcher.on(event.test.failed, test => {
250
- test.artifacts.video = videoSaved(test)
251
- })
252
- }
253
- }
254
-
255
- module.exports = selenoid
256
-
257
- function videoSaved(test) {
258
- const fileName = `${clearString(test.title)}.mp4`
259
- const videoFile = path.join(global.output_dir, 'video', fileName)
260
- output.debug(`Video has been saved to file://${videoFile}`)
261
- const allureReporter = container.plugins('allure')
262
- if (allureReporter) {
263
- allureReporter.addAttachment('Video', fs.readFileSync(videoFile), 'video/mp4')
264
- }
265
- return videoFile
266
- }
267
-
268
- const createSelenoidConfig = () => {
269
- const configPath = path.join(global.codecept_dir, 'browsers.json')
270
- return new Promise((res, rej) => {
271
- try {
272
- if (fs.existsSync(configPath)) {
273
- res(true)
274
- } else {
275
- const data = new Uint8Array(Buffer.from(JSON.stringify(defaultBrowserConfig)))
276
- fs.writeFileSync(configPath, data)
277
- res(true)
278
- }
279
- } catch (err) {
280
- rej(err.stack)
281
- }
282
- })
283
- }
284
-
285
- const createSelenoid = () => exec(dockerCreateScript)
286
-
287
- const startSelenoid = () => exec(dockerStartScript)
288
-
289
- const stopSelenoid = () => exec(dockerStopScript)
290
-
291
- const checkDockerImage = () => exec(dockerImageCheckScript)
292
-
293
- const pullImage = async () => {
294
- const { stdout } = await checkDockerImage()
295
- const pulls = []
296
- let resultPromise
297
-
298
- output.print('Pulling in Selenoid containers. This may take a while when running the first time...')
299
-
300
- console.time('Pulled containers')
301
- if (!stdout.includes('selenoid/video-recorder')) {
302
- output.debug('Pulling selenoid/video-recorder...')
303
- resultPromise = exec('docker pull selenoid/video-recorder:latest-release').then(() => output.debug('Pulled in selenoid/video-recorder'))
304
- pulls.push(resultPromise)
305
- }
306
- if (!stdout.includes('selenoid/chrome')) {
307
- output.debug('Pulling selenoid/chrome...')
308
- resultPromise = exec('docker pull selenoid/chrome:latest').then(() => output.debug('Pulled in selenoid/video-recorder'))
309
- pulls.push(resultPromise)
310
- }
311
- if (!stdout.includes('selenoid/firefox')) {
312
- output.debug('Pulling selenoid/firefox...')
313
- resultPromise = exec('docker pull selenoid/firefox:latest').then(() => output.debug('Pulled in selenoid/chrome'))
314
- pulls.push(resultPromise)
315
- }
316
-
317
- return Promise.all(pulls).then(() => {
318
- console.timeEnd('Pulled containers')
319
- })
320
- }
321
-
322
- function createAndStart(autoCreate) {
323
- const selenoidCreated = autoCreate ? createSelenoidConfig().then(createSelenoid).then(pullImage) : Promise.resolve()
324
- return selenoidCreated.then(startSelenoid).then(() => wait(SELENOID_START_TIMEOUT))
325
- }
326
-
327
- function deletePassedTests(passedTests) {
328
- const deleteVideoPromiseList = passedTests.map(clearString).map(test => axios.delete(`${seleniumUrl}/video/${test}.mp4`))
329
- const deleteLogPromiseList = passedTests.map(clearString).map(test => axios.delete(`${seleniumUrl}/logs/${test}.log`))
330
-
331
- return Promise.all(deleteVideoPromiseList.concat(deleteLogPromiseList))
332
- .then(() => output.debug('Deleted videos and logs for all passed tests'))
333
- .catch(err => output.error(`Error while deleting video and log files ${err.stack}`))
334
- }
335
-
336
- function setOptionsForWebdriver(config) {
337
- const WebDriver = container.helpers('WebDriver')
338
- WebDriver._setConfig(
339
- deepMerge(WebDriver.options, {
340
- capabilities: { 'selenoid:options': config },
341
- }),
342
- )
343
- }
344
-
345
- function setTestConfigForWebdriver(test) {
346
- const WebDriver = container.helpers('WebDriver')
347
- const fileName = clearString(test.title)
348
- const { options } = WebDriver
349
- recorder.add('setting selenoid capabilities', () => {
350
- options.capabilities['selenoid:options'].name = test.title
351
- options.capabilities['selenoid:options'].videoName = `${fileName}.mp4`
352
- options.capabilities['selenoid:options'].logName = `${fileName}.log`
353
- WebDriver._setConfig(options)
354
- })
355
- }
356
-
357
- function replaceScriptConfig(config) {
358
- for (const key of Object.keys(config)) {
359
- dockerCreateScript = dockerCreateScript.replace(new RegExp(`\\$${key}\\$`, 'g'), config[key])
360
- }
361
- dockerStartScript = dockerStartScript.replace('$name$', config.name)
362
- dockerStopScript = dockerStopScript.replace('$name$', config.name)
363
- seleniumUrl = seleniumUrl.replace('$port$', config.port)
364
- }
@@ -1,6 +0,0 @@
1
- const Container = require('../container')
2
- // due to using this in internal tooling we won't post deprecation warning
3
- // but please switch to Container.STANDARD_ACTING_HELPERS
4
- const standardActingHelpers = Container.STANDARD_ACTING_HELPERS
5
-
6
- module.exports = standardActingHelpers
@@ -1,16 +0,0 @@
1
- const { tryTo } = 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: 'tryTo' has been moved to the 'codeceptjs/effects' module. Disable tryTo plugin to remove this warning.`)
10
-
11
- if (config.registerGlobal) {
12
- global.tryTo = tryTo
13
- }
14
-
15
- return tryTo
16
- }
@@ -1,247 +0,0 @@
1
- const debug = require('debug')('codeceptjs:plugin:wdio')
2
-
3
- const container = require('../container')
4
- const mainConfig = require('../config')
5
- const recorder = require('../recorder')
6
- const event = require('../event')
7
- const output = require('../output')
8
-
9
- const defaultConfig = {
10
- services: [],
11
- capabilities: {},
12
- }
13
-
14
- let restartsSession
15
-
16
- /**
17
- * Webdriverio services runner.
18
- *
19
- * This plugin allows to run webdriverio services like:
20
- *
21
- * * selenium-standalone
22
- * * sauce
23
- * * testingbot
24
- * * browserstack
25
- * * appium
26
- *
27
- * A complete list of all available services can be found on [webdriverio website](https://webdriver.io).
28
- *
29
- * #### Setup
30
- *
31
- * 1. Install a webdriverio service
32
- * 2. Enable `wdio` plugin in config
33
- * 3. Add service name to `services` array inside wdio plugin config.
34
- *
35
- * See examples below:
36
- *
37
- * #### Selenium Standalone Service
38
- *
39
- * Install ` @wdio/selenium-standalone-service` package, as [described here](https://webdriver.io/docs/selenium-standalone-service.html).
40
- * It is important to make sure it is compatible with current webdriverio version.
41
- *
42
- * Enable `wdio` plugin in plugins list and add `selenium-standalone` service:
43
- *
44
- * ```js
45
- * plugins: {
46
- * wdio: {
47
- * enabled: true,
48
- * services: ['selenium-standalone']
49
- * // additional config for service can be passed here
50
- * }
51
- * }
52
- * ```
53
- *
54
- *
55
- * #### Sauce Service
56
- *
57
- * Install `@wdio/sauce-service` package, as [described here](https://webdriver.io/docs/sauce-service.html).
58
- * It is important to make sure it is compatible with current webdriverio version.
59
- *
60
- * Enable `wdio` plugin in plugins list and add `sauce` service:
61
- *
62
- * ```js
63
- * plugins: {
64
- * wdio: {
65
- * enabled: true,
66
- * services: ['sauce'],
67
- * user: ... ,// saucelabs username
68
- * key: ... // saucelabs api key
69
- * // additional config, from sauce service
70
- * }
71
- * }
72
- * ```
73
- *
74
- * ---
75
- *
76
- * In the same manner additional services from webdriverio can be installed, enabled, and configured.
77
- *
78
- * #### Configuration
79
- *
80
- * * `services` - list of enabled services
81
- * * ... - additional configuration passed into services.
82
- *
83
- */
84
- module.exports = config => {
85
- // Keep initial configs to pass as options to wdio services
86
- const wdioOptions = { ...config }
87
- const webDriver = container.helpers('WebDriver')
88
- if (webDriver) {
89
- config = Object.assign(webDriver.options, config)
90
- restartsSession = !!config.restart
91
- }
92
- config = Object.assign(defaultConfig, config)
93
- const seleniumInstallArgs = { ...config.seleniumInstallArgs }
94
- const seleniumArgs = { ...config.seleniumArgs }
95
-
96
- const services = []
97
- const launchers = []
98
-
99
- for (const name of config.services) {
100
- const Service = safeRequire(`@wdio/${name.toLowerCase()}-service`)
101
- if (Service) {
102
- if (Service.launcher && typeof Service.launcher === 'function') {
103
- const Launcher = Service.launcher
104
-
105
- const options = {
106
- logPath: global.output_dir,
107
- installArgs: seleniumInstallArgs,
108
- args: seleniumArgs,
109
- ...wdioOptions,
110
- }
111
- launchers.push(new Launcher(options, [config.capabilities], config))
112
- }
113
- if (typeof Service === 'function') {
114
- services.push(new Service(config, config.capabilities))
115
- }
116
- continue
117
- }
118
-
119
- throw new Error(`Couldn't initialize service ${name} from wdio plugin config.\nIt should be available either in '@wdio/${name.toLowerCase()}-service' package`)
120
- }
121
-
122
- debug(`services ${services}, launchers ${launchers}`)
123
-
124
- recorder.startUnlessRunning()
125
-
126
- for (const launcher of launchers) {
127
- registerLauncher(launcher)
128
- }
129
-
130
- for (const service of services) {
131
- registerService(service)
132
- }
133
-
134
- function registerService(service) {
135
- const name = service.constructor.name
136
- if (service.beforeSession) {
137
- event.dispatcher.on(event.all.before, () => {
138
- recorder.add(`service ${name} all.before`, async () => {
139
- await service.beforeSession(config, config.capabilities)
140
- })
141
- })
142
- }
143
-
144
- if (service.afterSession) {
145
- event.dispatcher.on(event.all.result, result => {
146
- recorder.add(`service ${name} all.after`, async () => {
147
- await service.afterSession(result)
148
- })
149
- })
150
- }
151
-
152
- if (service.beforeSuite) {
153
- event.dispatcher.on(event.suite.before, suite => {
154
- debug(`suite started: ${suite.title}`)
155
- recorder.add(`service ${name} suite.before`, () => service.beforeSuite(suite))
156
- })
157
- }
158
-
159
- if (service.afterSuite) {
160
- event.dispatcher.on(event.suite.after, suite => {
161
- debug(`suite finished: ${suite.title}`)
162
- recorder.add(`service ${name} suite.after`, () => service.afterSuite(suite))
163
- })
164
- }
165
-
166
- if (service.beforeTest) {
167
- event.dispatcher.on(event.test.started, async test => {
168
- if (test.parent) {
169
- test.parent.toString = () => test.parent.title
170
- }
171
- // test.parent = test.parent ? test.parent.title : null;
172
- debug(`test started: ${test.title}`)
173
- if (webDriver) {
174
- global.browser = webDriver.browser
175
- global.browser.config = Object.assign(mainConfig.get('test', 1), global.browser.config)
176
- }
177
- await service.beforeTest(test)
178
- })
179
- }
180
-
181
- if (service.afterTest) {
182
- event.dispatcher.on(event.test.finished, async test => {
183
- debug(`test finished: ${test.title}`)
184
- await service.afterTest(test)
185
- })
186
- }
187
-
188
- if (restartsSession && service.before) {
189
- event.dispatcher.on(event.test.started, () => service.before())
190
- }
191
-
192
- if (restartsSession && service.after) {
193
- event.dispatcher.on(event.test.finished, () => service.after())
194
- }
195
-
196
- if (!restartsSession && service.before) {
197
- let initializedBrowser = false
198
- event.dispatcher.on(event.test.started, async () => {
199
- if (!initializedBrowser) {
200
- await service.before()
201
- initializedBrowser = true
202
- }
203
- })
204
- }
205
-
206
- if (!restartsSession && service.after) {
207
- event.dispatcher.on(event.all.result, result => service.after(result))
208
- }
209
- }
210
-
211
- function registerLauncher(launcher) {
212
- const name = launcher.constructor.name
213
- if (launcher.onPrepare) {
214
- event.dispatcher.on(event.all.before, () => {
215
- recorder.add(`launcher ${name} start`, async () => {
216
- // browserstack-service expects capabilities as array
217
- if (launcher.constructor.name === 'BrowserstackLauncherService') {
218
- await launcher.onPrepare(config, [config.capabilities])
219
- } else {
220
- await launcher.onPrepare(config, config.capabilities)
221
- }
222
- output.debug(`Started ${name}`)
223
- })
224
- })
225
- }
226
-
227
- if (launcher.onComplete) {
228
- event.dispatcher.on(event.all.after, () => {
229
- recorder.add(`launcher ${name} start`, async () => {
230
- await launcher.onComplete(process.exitCode, config, config.capabilities)
231
- output.debug(`Stopped ${name}`)
232
- })
233
- })
234
- }
235
- }
236
- }
237
-
238
- function safeRequire(name) {
239
- try {
240
- return require(name)
241
- } catch (e) {
242
- if (!e.message.match(`Cannot find module '${name}'`)) {
243
- throw new Error(`Couldn't initialise "${name}".\n${e.stack}`)
244
- }
245
- return null
246
- }
247
- }