codeceptjs 3.6.4 → 3.6.5-beta.1
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/bin/codecept.js +84 -63
- package/lib/assert/empty.js +19 -19
- package/lib/assert/equal.js +32 -30
- package/lib/assert/error.js +14 -14
- package/lib/assert/include.js +42 -42
- package/lib/assert/throws.js +13 -11
- package/lib/assert/truth.js +17 -18
- package/lib/command/configMigrate.js +57 -52
- package/lib/command/definitions.js +88 -88
- package/lib/command/dryRun.js +65 -63
- package/lib/command/generate.js +191 -181
- package/lib/command/info.js +39 -37
- package/lib/command/init.js +289 -286
- package/lib/command/interactive.js +32 -32
- package/lib/command/list.js +26 -26
- package/lib/command/run-multiple.js +113 -93
- package/lib/command/run-rerun.js +22 -22
- package/lib/command/run-workers.js +63 -63
- package/lib/command/run.js +24 -26
- package/lib/command/utils.js +64 -63
- package/lib/data/context.js +60 -60
- package/lib/data/dataScenarioConfig.js +47 -47
- package/lib/data/dataTableArgument.js +29 -29
- package/lib/data/table.js +26 -20
- package/lib/helper/AI.js +67 -65
- package/lib/helper/ApiDataFactory.js +72 -69
- package/lib/helper/Appium.js +409 -379
- package/lib/helper/ExpectHelper.js +214 -248
- package/lib/helper/FileSystem.js +77 -78
- package/lib/helper/GraphQL.js +44 -43
- package/lib/helper/GraphQLDataFactory.js +49 -50
- package/lib/helper/JSONResponse.js +64 -62
- package/lib/helper/Mochawesome.js +28 -28
- package/lib/helper/MockServer.js +12 -12
- package/lib/helper/Nightmare.js +664 -572
- package/lib/helper/Playwright.js +1320 -1211
- package/lib/helper/Protractor.js +663 -629
- package/lib/helper/Puppeteer.js +1232 -1124
- package/lib/helper/REST.js +87 -72
- package/lib/helper/TestCafe.js +490 -491
- package/lib/helper/WebDriver.js +1294 -1156
- package/lib/interfaces/bdd.js +38 -51
- package/lib/interfaces/featureConfig.js +19 -19
- package/lib/interfaces/gherkin.js +122 -111
- package/lib/interfaces/scenarioConfig.js +29 -29
- package/lib/listener/artifacts.js +9 -9
- package/lib/listener/config.js +24 -23
- package/lib/listener/exit.js +12 -12
- package/lib/listener/helpers.js +42 -42
- package/lib/listener/mocha.js +11 -11
- package/lib/listener/retry.js +32 -30
- package/lib/listener/steps.js +50 -51
- package/lib/listener/timeout.js +53 -53
- package/lib/plugin/allure.js +14 -14
- package/lib/plugin/autoDelay.js +29 -36
- package/lib/plugin/autoLogin.js +70 -66
- package/lib/plugin/commentStep.js +18 -18
- package/lib/plugin/coverage.js +92 -77
- package/lib/plugin/customLocator.js +20 -19
- package/lib/plugin/debugErrors.js +24 -24
- package/lib/plugin/eachElement.js +37 -37
- package/lib/plugin/fakerTransform.js +6 -6
- package/lib/plugin/heal.js +66 -63
- package/lib/plugin/pauseOnFail.js +10 -10
- package/lib/plugin/retryFailedStep.js +31 -38
- package/lib/plugin/retryTo.js +28 -28
- package/lib/plugin/screenshotOnFail.js +107 -86
- package/lib/plugin/selenoid.js +131 -117
- package/lib/plugin/standardActingHelpers.js +2 -8
- package/lib/plugin/stepByStepReport.js +102 -92
- package/lib/plugin/stepTimeout.js +23 -22
- package/lib/plugin/subtitles.js +34 -34
- package/lib/plugin/tryTo.js +39 -29
- package/lib/plugin/wdio.js +77 -72
- package/lib/template/heal.js +11 -14
- package/package.json +4 -2
- package/translations/de-DE.js +1 -1
- package/translations/fr-FR.js +1 -1
- package/translations/index.js +9 -9
- package/translations/it-IT.js +1 -1
- package/translations/ja-JP.js +1 -1
- package/translations/pl-PL.js +1 -1
- package/translations/pt-BR.js +1 -1
- package/translations/ru-RU.js +1 -1
- package/translations/zh-CN.js +1 -1
- package/translations/zh-TW.js +1 -1
- package/typings/promiseBasedTypes.d.ts +238 -0
- package/typings/types.d.ts +32 -0
package/lib/plugin/wdio.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
const debug = require('debug')('codeceptjs:plugin:wdio')
|
|
1
|
+
const debug = require('debug')('codeceptjs:plugin:wdio')
|
|
2
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')
|
|
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
8
|
|
|
9
9
|
const defaultConfig = {
|
|
10
10
|
services: [],
|
|
11
11
|
capabilities: {},
|
|
12
|
-
}
|
|
12
|
+
}
|
|
13
13
|
|
|
14
|
-
let restartsSession
|
|
14
|
+
let restartsSession
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Webdriverio services runner.
|
|
@@ -83,162 +83,167 @@ let restartsSession;
|
|
|
83
83
|
*/
|
|
84
84
|
module.exports = (config) => {
|
|
85
85
|
// Keep initial configs to pass as options to wdio services
|
|
86
|
-
const wdioOptions = { ...config }
|
|
87
|
-
const webDriver = container.helpers('WebDriver')
|
|
86
|
+
const wdioOptions = { ...config }
|
|
87
|
+
const webDriver = container.helpers('WebDriver')
|
|
88
88
|
if (webDriver) {
|
|
89
|
-
config = Object.assign(webDriver.options, config)
|
|
90
|
-
restartsSession = !!config.restart
|
|
89
|
+
config = Object.assign(webDriver.options, config)
|
|
90
|
+
restartsSession = !!config.restart
|
|
91
91
|
}
|
|
92
|
-
config = Object.assign(defaultConfig, config)
|
|
93
|
-
const seleniumInstallArgs = { ...config.seleniumInstallArgs }
|
|
94
|
-
const seleniumArgs = { ...config.seleniumArgs }
|
|
92
|
+
config = Object.assign(defaultConfig, config)
|
|
93
|
+
const seleniumInstallArgs = { ...config.seleniumInstallArgs }
|
|
94
|
+
const seleniumArgs = { ...config.seleniumArgs }
|
|
95
95
|
|
|
96
|
-
const services = []
|
|
97
|
-
const launchers = []
|
|
96
|
+
const services = []
|
|
97
|
+
const launchers = []
|
|
98
98
|
|
|
99
99
|
for (const name of config.services) {
|
|
100
|
-
const Service = safeRequire(`@wdio/${name.toLowerCase()}-service`)
|
|
100
|
+
const Service = safeRequire(`@wdio/${name.toLowerCase()}-service`)
|
|
101
101
|
if (Service) {
|
|
102
102
|
if (Service.launcher && typeof Service.launcher === 'function') {
|
|
103
|
-
const Launcher = Service.launcher
|
|
103
|
+
const Launcher = Service.launcher
|
|
104
104
|
|
|
105
105
|
const options = {
|
|
106
|
-
logPath: global.output_dir,
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
logPath: global.output_dir,
|
|
107
|
+
installArgs: seleniumInstallArgs,
|
|
108
|
+
args: seleniumArgs,
|
|
109
|
+
...wdioOptions,
|
|
110
|
+
}
|
|
111
|
+
launchers.push(new Launcher(options, [config.capabilities], config))
|
|
109
112
|
}
|
|
110
113
|
if (typeof Service === 'function') {
|
|
111
|
-
services.push(new Service(config, config.capabilities))
|
|
114
|
+
services.push(new Service(config, config.capabilities))
|
|
112
115
|
}
|
|
113
|
-
continue
|
|
116
|
+
continue
|
|
114
117
|
}
|
|
115
118
|
|
|
116
|
-
throw new Error(
|
|
119
|
+
throw new Error(
|
|
120
|
+
`Couldn't initialize service ${name} from wdio plugin config.\nIt should be available either in '@wdio/${name.toLowerCase()}-service' package`,
|
|
121
|
+
)
|
|
117
122
|
}
|
|
118
123
|
|
|
119
|
-
debug(`services ${services}, launchers ${launchers}`)
|
|
124
|
+
debug(`services ${services}, launchers ${launchers}`)
|
|
120
125
|
|
|
121
|
-
recorder.startUnlessRunning()
|
|
126
|
+
recorder.startUnlessRunning()
|
|
122
127
|
|
|
123
128
|
for (const launcher of launchers) {
|
|
124
|
-
registerLauncher(launcher)
|
|
129
|
+
registerLauncher(launcher)
|
|
125
130
|
}
|
|
126
131
|
|
|
127
132
|
for (const service of services) {
|
|
128
|
-
registerService(service)
|
|
133
|
+
registerService(service)
|
|
129
134
|
}
|
|
130
135
|
|
|
131
136
|
function registerService(service) {
|
|
132
|
-
const name = service.constructor.name
|
|
137
|
+
const name = service.constructor.name
|
|
133
138
|
if (service.beforeSession) {
|
|
134
139
|
event.dispatcher.on(event.all.before, () => {
|
|
135
140
|
recorder.add(`service ${name} all.before`, async () => {
|
|
136
|
-
await service.beforeSession(config, config.capabilities)
|
|
137
|
-
})
|
|
138
|
-
})
|
|
141
|
+
await service.beforeSession(config, config.capabilities)
|
|
142
|
+
})
|
|
143
|
+
})
|
|
139
144
|
}
|
|
140
145
|
|
|
141
146
|
if (service.afterSession) {
|
|
142
147
|
event.dispatcher.on(event.all.result, (result) => {
|
|
143
148
|
recorder.add(`service ${name} all.after`, async () => {
|
|
144
|
-
await service.afterSession(result)
|
|
145
|
-
})
|
|
146
|
-
})
|
|
149
|
+
await service.afterSession(result)
|
|
150
|
+
})
|
|
151
|
+
})
|
|
147
152
|
}
|
|
148
153
|
|
|
149
154
|
if (service.beforeSuite) {
|
|
150
155
|
event.dispatcher.on(event.suite.before, (suite) => {
|
|
151
|
-
debug(`suite started: ${suite.title}`)
|
|
152
|
-
recorder.add(`service ${name} suite.before`, () => service.beforeSuite(suite))
|
|
153
|
-
})
|
|
156
|
+
debug(`suite started: ${suite.title}`)
|
|
157
|
+
recorder.add(`service ${name} suite.before`, () => service.beforeSuite(suite))
|
|
158
|
+
})
|
|
154
159
|
}
|
|
155
160
|
|
|
156
161
|
if (service.afterSuite) {
|
|
157
162
|
event.dispatcher.on(event.suite.after, (suite) => {
|
|
158
|
-
debug(`suite finished: ${suite.title}`)
|
|
159
|
-
recorder.add(`service ${name} suite.after`, () => service.afterSuite(suite))
|
|
160
|
-
})
|
|
163
|
+
debug(`suite finished: ${suite.title}`)
|
|
164
|
+
recorder.add(`service ${name} suite.after`, () => service.afterSuite(suite))
|
|
165
|
+
})
|
|
161
166
|
}
|
|
162
167
|
|
|
163
168
|
if (service.beforeTest) {
|
|
164
169
|
event.dispatcher.on(event.test.started, async (test) => {
|
|
165
170
|
if (test.parent) {
|
|
166
|
-
test.parent.toString = () => test.parent.title
|
|
171
|
+
test.parent.toString = () => test.parent.title
|
|
167
172
|
}
|
|
168
173
|
// test.parent = test.parent ? test.parent.title : null;
|
|
169
|
-
debug(`test started: ${test.title}`)
|
|
174
|
+
debug(`test started: ${test.title}`)
|
|
170
175
|
if (webDriver) {
|
|
171
|
-
global.browser = webDriver.browser
|
|
172
|
-
global.browser.config = Object.assign(mainConfig.get('test', 1), global.browser.config)
|
|
176
|
+
global.browser = webDriver.browser
|
|
177
|
+
global.browser.config = Object.assign(mainConfig.get('test', 1), global.browser.config)
|
|
173
178
|
}
|
|
174
|
-
await service.beforeTest(test)
|
|
175
|
-
})
|
|
179
|
+
await service.beforeTest(test)
|
|
180
|
+
})
|
|
176
181
|
}
|
|
177
182
|
|
|
178
183
|
if (service.afterTest) {
|
|
179
184
|
event.dispatcher.on(event.test.finished, async (test) => {
|
|
180
|
-
debug(`test finished: ${test.title}`)
|
|
181
|
-
await service.afterTest(test)
|
|
182
|
-
})
|
|
185
|
+
debug(`test finished: ${test.title}`)
|
|
186
|
+
await service.afterTest(test)
|
|
187
|
+
})
|
|
183
188
|
}
|
|
184
189
|
|
|
185
190
|
if (restartsSession && service.before) {
|
|
186
|
-
event.dispatcher.on(event.test.started, () => service.before())
|
|
191
|
+
event.dispatcher.on(event.test.started, () => service.before())
|
|
187
192
|
}
|
|
188
193
|
|
|
189
194
|
if (restartsSession && service.after) {
|
|
190
|
-
event.dispatcher.on(event.test.finished, () => service.after())
|
|
195
|
+
event.dispatcher.on(event.test.finished, () => service.after())
|
|
191
196
|
}
|
|
192
197
|
|
|
193
198
|
if (!restartsSession && service.before) {
|
|
194
|
-
let initializedBrowser = false
|
|
199
|
+
let initializedBrowser = false
|
|
195
200
|
event.dispatcher.on(event.test.started, async () => {
|
|
196
201
|
if (!initializedBrowser) {
|
|
197
|
-
await service.before()
|
|
198
|
-
initializedBrowser = true
|
|
202
|
+
await service.before()
|
|
203
|
+
initializedBrowser = true
|
|
199
204
|
}
|
|
200
|
-
})
|
|
205
|
+
})
|
|
201
206
|
}
|
|
202
207
|
|
|
203
208
|
if (!restartsSession && service.after) {
|
|
204
|
-
event.dispatcher.on(event.all.result, result => service.after(result))
|
|
209
|
+
event.dispatcher.on(event.all.result, (result) => service.after(result))
|
|
205
210
|
}
|
|
206
211
|
}
|
|
207
212
|
|
|
208
213
|
function registerLauncher(launcher) {
|
|
209
|
-
const name = launcher.constructor.name
|
|
214
|
+
const name = launcher.constructor.name
|
|
210
215
|
if (launcher.onPrepare) {
|
|
211
216
|
event.dispatcher.on(event.all.before, () => {
|
|
212
217
|
recorder.add(`launcher ${name} start`, async () => {
|
|
213
218
|
// browserstack-service expects capabilities as array
|
|
214
219
|
if (launcher.constructor.name === 'BrowserstackLauncherService') {
|
|
215
|
-
await launcher.onPrepare(config, [config.capabilities])
|
|
220
|
+
await launcher.onPrepare(config, [config.capabilities])
|
|
216
221
|
} else {
|
|
217
|
-
await launcher.onPrepare(config, config.capabilities)
|
|
222
|
+
await launcher.onPrepare(config, config.capabilities)
|
|
218
223
|
}
|
|
219
|
-
output.debug(`Started ${name}`)
|
|
220
|
-
})
|
|
221
|
-
})
|
|
224
|
+
output.debug(`Started ${name}`)
|
|
225
|
+
})
|
|
226
|
+
})
|
|
222
227
|
}
|
|
223
228
|
|
|
224
229
|
if (launcher.onComplete) {
|
|
225
230
|
event.dispatcher.on(event.all.after, () => {
|
|
226
231
|
recorder.add(`launcher ${name} start`, async () => {
|
|
227
|
-
await launcher.onComplete(process.exitCode, config, config.capabilities)
|
|
228
|
-
output.debug(`Stopped ${name}`)
|
|
229
|
-
})
|
|
230
|
-
})
|
|
232
|
+
await launcher.onComplete(process.exitCode, config, config.capabilities)
|
|
233
|
+
output.debug(`Stopped ${name}`)
|
|
234
|
+
})
|
|
235
|
+
})
|
|
231
236
|
}
|
|
232
237
|
}
|
|
233
|
-
}
|
|
238
|
+
}
|
|
234
239
|
|
|
235
240
|
function safeRequire(name) {
|
|
236
241
|
try {
|
|
237
|
-
return require(name)
|
|
242
|
+
return require(name)
|
|
238
243
|
} catch (e) {
|
|
239
244
|
if (!e.message.match(`Cannot find module '${name}'`)) {
|
|
240
|
-
throw new Error(`Couldn't initialise "${name}".\n${e.stack}`)
|
|
245
|
+
throw new Error(`Couldn't initialise "${name}".\n${e.stack}`)
|
|
241
246
|
}
|
|
242
|
-
return null
|
|
247
|
+
return null
|
|
243
248
|
}
|
|
244
249
|
}
|
package/lib/template/heal.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const { heal, ai } = require('codeceptjs')
|
|
1
|
+
const { heal, ai } = require('codeceptjs')
|
|
2
2
|
|
|
3
3
|
heal.addRecipe('ai', {
|
|
4
4
|
priority: 10,
|
|
@@ -16,24 +16,21 @@ heal.addRecipe('ai', {
|
|
|
16
16
|
'doubleClick',
|
|
17
17
|
],
|
|
18
18
|
fn: async (args) => {
|
|
19
|
-
return ai.healFailedStep(args)
|
|
19
|
+
return ai.healFailedStep(args)
|
|
20
20
|
},
|
|
21
|
-
})
|
|
21
|
+
})
|
|
22
22
|
|
|
23
23
|
heal.addRecipe('clickAndType', {
|
|
24
24
|
priority: 1,
|
|
25
|
-
steps: [
|
|
26
|
-
'fillField',
|
|
27
|
-
'appendField',
|
|
28
|
-
],
|
|
25
|
+
steps: ['fillField', 'appendField'],
|
|
29
26
|
fn: async ({ step }) => {
|
|
30
|
-
const locator = step.args[0]
|
|
31
|
-
const text = step.args[1]
|
|
27
|
+
const locator = step.args[0]
|
|
28
|
+
const text = step.args[1]
|
|
32
29
|
|
|
33
30
|
return ({ I }) => {
|
|
34
|
-
I.click(locator)
|
|
35
|
-
I.wait(1)
|
|
36
|
-
I.type(text)
|
|
37
|
-
}
|
|
31
|
+
I.click(locator)
|
|
32
|
+
I.wait(1) // to open modal or something
|
|
33
|
+
I.type(text)
|
|
34
|
+
}
|
|
38
35
|
},
|
|
39
|
-
})
|
|
36
|
+
})
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeceptjs",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.5-beta.1",
|
|
4
4
|
"description": "Supercharged End 2 End Testing Framework for NodeJS",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"acceptance",
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"json-server:graphql": "node test/data/graphql/index.js",
|
|
40
40
|
"lint": "eslint bin/ examples/ lib/ test/ translations/ runok.js",
|
|
41
41
|
"lint-fix": "eslint bin/ examples/ lib/ test/ translations/ runok.js --fix",
|
|
42
|
+
"prettier": "prettier --config prettier.config.js --write bin/**/*.js lib/**/*.js test/**/*.js translations/**/*.js runok.js",
|
|
42
43
|
"docs": "./runok.js docs",
|
|
43
44
|
"test:unit": "mocha test/unit --recursive --timeout 10000",
|
|
44
45
|
"test:runner": "mocha test/runner --recursive --timeout 10000",
|
|
@@ -149,6 +150,7 @@
|
|
|
149
150
|
"jsdoc-typeof-plugin": "1.0.0",
|
|
150
151
|
"json-server": "0.10.1",
|
|
151
152
|
"playwright": "1.44.1",
|
|
153
|
+
"prettier": "^3.3.2",
|
|
152
154
|
"puppeteer": "22.10.0",
|
|
153
155
|
"qrcode-terminal": "0.12.0",
|
|
154
156
|
"rosie": "2.1.1",
|
|
@@ -179,4 +181,4 @@
|
|
|
179
181
|
"strict": false
|
|
180
182
|
}
|
|
181
183
|
}
|
|
182
|
-
}
|
|
184
|
+
}
|
package/translations/de-DE.js
CHANGED
package/translations/fr-FR.js
CHANGED
package/translations/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
exports['de-DE'] = require('./de-DE')
|
|
2
|
-
exports['it-IT'] = require('./it-IT')
|
|
3
|
-
exports['fr-FR'] = require('./fr-FR')
|
|
4
|
-
exports['ja-JP'] = require('./ja-JP')
|
|
5
|
-
exports['pl-PL'] = require('./pl-PL')
|
|
6
|
-
exports['pt-BR'] = require('./pt-BR')
|
|
7
|
-
exports['ru-RU'] = require('./ru-RU')
|
|
8
|
-
exports['zh-CN'] = require('./zh-CN')
|
|
9
|
-
exports['zh-TW'] = require('./zh-TW')
|
|
1
|
+
exports['de-DE'] = require('./de-DE')
|
|
2
|
+
exports['it-IT'] = require('./it-IT')
|
|
3
|
+
exports['fr-FR'] = require('./fr-FR')
|
|
4
|
+
exports['ja-JP'] = require('./ja-JP')
|
|
5
|
+
exports['pl-PL'] = require('./pl-PL')
|
|
6
|
+
exports['pt-BR'] = require('./pt-BR')
|
|
7
|
+
exports['ru-RU'] = require('./ru-RU')
|
|
8
|
+
exports['zh-CN'] = require('./zh-CN')
|
|
9
|
+
exports['zh-TW'] = require('./zh-TW')
|
package/translations/it-IT.js
CHANGED
package/translations/ja-JP.js
CHANGED
package/translations/pl-PL.js
CHANGED
package/translations/pt-BR.js
CHANGED
package/translations/ru-RU.js
CHANGED
package/translations/zh-CN.js
CHANGED
package/translations/zh-TW.js
CHANGED