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.
- package/README.md +0 -45
- package/bin/codecept.js +46 -57
- package/lib/actor.js +15 -11
- package/lib/ai.js +6 -5
- package/lib/assert/empty.js +9 -8
- package/lib/assert/equal.js +15 -17
- package/lib/assert/error.js +2 -2
- package/lib/assert/include.js +9 -11
- package/lib/assert/throws.js +1 -1
- package/lib/assert/truth.js +8 -5
- package/lib/assert.js +18 -18
- package/lib/codecept.js +66 -107
- package/lib/colorUtils.js +48 -50
- package/lib/command/check.js +32 -27
- package/lib/command/configMigrate.js +11 -10
- package/lib/command/definitions.js +16 -10
- package/lib/command/dryRun.js +16 -16
- package/lib/command/generate.js +29 -26
- package/lib/command/gherkin/init.js +36 -38
- package/lib/command/gherkin/snippets.js +14 -14
- package/lib/command/gherkin/steps.js +21 -18
- package/lib/command/info.js +8 -8
- package/lib/command/init.js +34 -31
- package/lib/command/interactive.js +11 -10
- package/lib/command/list.js +10 -9
- package/lib/command/run-multiple/chunk.js +5 -5
- package/lib/command/run-multiple/collection.js +5 -5
- package/lib/command/run-multiple/run.js +3 -3
- package/lib/command/run-multiple.js +16 -13
- package/lib/command/run-rerun.js +6 -7
- package/lib/command/run-workers.js +10 -24
- package/lib/command/run.js +8 -8
- package/lib/command/utils.js +20 -18
- package/lib/command/workers/runTests.js +117 -269
- package/lib/config.js +111 -49
- package/lib/container.js +299 -102
- package/lib/data/context.js +6 -5
- package/lib/data/dataScenarioConfig.js +1 -1
- package/lib/data/dataTableArgument.js +1 -1
- package/lib/data/table.js +1 -1
- package/lib/effects.js +94 -10
- package/lib/els.js +11 -9
- package/lib/event.js +11 -10
- package/lib/globals.js +141 -0
- package/lib/heal.js +12 -12
- package/lib/helper/AI.js +1 -1
- package/lib/helper/ApiDataFactory.js +16 -13
- package/lib/helper/FileSystem.js +32 -12
- package/lib/helper/GraphQL.js +1 -1
- package/lib/helper/GraphQLDataFactory.js +1 -1
- package/lib/helper/JSONResponse.js +19 -30
- package/lib/helper/Mochawesome.js +9 -28
- package/lib/helper/Playwright.js +668 -265
- package/lib/helper/Puppeteer.js +284 -169
- package/lib/helper/REST.js +29 -12
- package/lib/helper/WebDriver.js +191 -71
- package/lib/helper/errors/ConnectionRefused.js +6 -6
- package/lib/helper/errors/ElementAssertion.js +11 -16
- package/lib/helper/errors/ElementNotFound.js +5 -9
- package/lib/helper/errors/RemoteBrowserConnectionRefused.js +5 -5
- package/lib/helper/extras/Console.js +11 -11
- package/lib/helper/extras/PlaywrightLocator.js +110 -0
- package/lib/helper/extras/PlaywrightPropEngine.js +18 -18
- package/lib/helper/extras/PlaywrightRestartOpts.js +23 -23
- package/lib/helper/extras/Popup.js +1 -1
- package/lib/helper/extras/React.js +29 -30
- package/lib/helper/network/actions.js +33 -48
- package/lib/helper/network/utils.js +76 -83
- package/lib/helper/scripts/blurElement.js +6 -6
- package/lib/helper/scripts/focusElement.js +6 -6
- package/lib/helper/scripts/highlightElement.js +9 -9
- package/lib/helper/scripts/isElementClickable.js +34 -34
- package/lib/helper.js +2 -1
- package/lib/history.js +23 -20
- package/lib/hooks.js +10 -10
- package/lib/html.js +90 -100
- package/lib/index.js +48 -21
- package/lib/listener/config.js +8 -9
- package/lib/listener/emptyRun.js +6 -7
- package/lib/listener/exit.js +4 -3
- package/lib/listener/globalRetry.js +5 -5
- package/lib/listener/globalTimeout.js +11 -10
- package/lib/listener/helpers.js +33 -14
- package/lib/listener/mocha.js +3 -4
- package/lib/listener/result.js +4 -5
- package/lib/listener/steps.js +7 -18
- package/lib/listener/store.js +3 -3
- package/lib/locator.js +213 -192
- package/lib/mocha/asyncWrapper.js +108 -75
- package/lib/mocha/bdd.js +99 -13
- package/lib/mocha/cli.js +60 -27
- package/lib/mocha/factory.js +75 -19
- package/lib/mocha/featureConfig.js +1 -1
- package/lib/mocha/gherkin.js +57 -25
- package/lib/mocha/hooks.js +12 -3
- package/lib/mocha/index.js +13 -4
- package/lib/mocha/inject.js +22 -5
- package/lib/mocha/scenarioConfig.js +2 -2
- package/lib/mocha/suite.js +9 -2
- package/lib/mocha/test.js +10 -13
- package/lib/mocha/ui.js +28 -31
- package/lib/output.js +11 -9
- package/lib/parser.js +44 -44
- package/lib/pause.js +15 -16
- package/lib/plugin/analyze.js +19 -12
- package/lib/plugin/auth.js +20 -21
- package/lib/plugin/autoDelay.js +12 -8
- package/lib/plugin/coverage.js +12 -8
- package/lib/plugin/customLocator.js +3 -3
- package/lib/plugin/customReporter.js +3 -2
- package/lib/plugin/heal.js +14 -9
- package/lib/plugin/pageInfo.js +10 -10
- package/lib/plugin/pauseOnFail.js +4 -3
- package/lib/plugin/retryFailedStep.js +47 -5
- package/lib/plugin/screenshotOnFail.js +75 -37
- package/lib/plugin/stepByStepReport.js +14 -14
- package/lib/plugin/stepTimeout.js +4 -3
- package/lib/plugin/subtitles.js +6 -5
- package/lib/recorder.js +33 -23
- package/lib/rerun.js +69 -26
- package/lib/result.js +4 -4
- package/lib/secret.js +18 -17
- package/lib/session.js +95 -89
- package/lib/step/base.js +6 -6
- package/lib/step/config.js +1 -1
- package/lib/step/func.js +3 -3
- package/lib/step/helper.js +3 -3
- package/lib/step/meta.js +4 -4
- package/lib/step/record.js +11 -11
- package/lib/step/retry.js +3 -3
- package/lib/step/section.js +3 -3
- package/lib/step.js +7 -10
- package/lib/steps.js +9 -5
- package/lib/store.js +1 -1
- package/lib/timeout.js +1 -7
- package/lib/transform.js +8 -8
- package/lib/translation.js +32 -18
- package/lib/utils.js +68 -97
- package/lib/workerStorage.js +16 -17
- package/lib/workers.js +145 -171
- package/package.json +63 -57
- package/translations/de-DE.js +2 -2
- package/translations/fr-FR.js +2 -2
- package/translations/index.js +23 -10
- package/translations/it-IT.js +2 -2
- package/translations/ja-JP.js +2 -2
- package/translations/nl-NL.js +2 -2
- package/translations/pl-PL.js +2 -2
- package/translations/pt-BR.js +2 -2
- package/translations/ru-RU.js +2 -2
- package/translations/utils.js +11 -2
- package/translations/zh-CN.js +2 -2
- package/translations/zh-TW.js +2 -2
- package/typings/index.d.ts +7 -18
- package/typings/promiseBasedTypes.d.ts +3769 -5450
- package/typings/types.d.ts +3953 -5778
- package/bin/test-server.js +0 -53
- package/lib/element/WebElement.js +0 -327
- package/lib/helper/Nightmare.js +0 -1486
- package/lib/helper/Protractor.js +0 -1840
- package/lib/helper/TestCafe.js +0 -1391
- package/lib/helper/clientscripts/nightmare.js +0 -213
- package/lib/helper/extras/PlaywrightReactVueLocator.js +0 -43
- package/lib/helper/testcafe/testControllerHolder.js +0 -42
- package/lib/helper/testcafe/testcafe-utils.js +0 -61
- package/lib/listener/retryEnhancer.js +0 -85
- package/lib/plugin/allure.js +0 -15
- package/lib/plugin/autoLogin.js +0 -5
- package/lib/plugin/commentStep.js +0 -141
- package/lib/plugin/eachElement.js +0 -127
- package/lib/plugin/fakerTransform.js +0 -49
- package/lib/plugin/htmlReporter.js +0 -1947
- package/lib/plugin/retryTo.js +0 -16
- package/lib/plugin/selenoid.js +0 -364
- package/lib/plugin/standardActingHelpers.js +0 -6
- package/lib/plugin/tryTo.js +0 -16
- package/lib/plugin/wdio.js +0 -247
- package/lib/test-server.js +0 -323
- package/lib/within.js +0 -90
package/lib/plugin/retryTo.js
DELETED
|
@@ -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
|
-
}
|
package/lib/plugin/selenoid.js
DELETED
|
@@ -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
|
package/lib/plugin/tryTo.js
DELETED
|
@@ -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
|
-
}
|
package/lib/plugin/wdio.js
DELETED
|
@@ -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
|
-
}
|