codeceptjs 3.5.4 → 3.5.5

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.
@@ -201,7 +201,13 @@ module.exports = function (initPath) {
201
201
  // no extra step file for typescript (as it doesn't match TS conventions)
202
202
  const stepFile = `./steps_file.${extension}`;
203
203
  fs.writeFileSync(path.join(testsPath, stepFile), extension === 'ts' ? defaultActorTs : defaultActor);
204
- config.include.I = isTypeScript === true ? './steps_file' : stepFile;
204
+
205
+ if (isTypeScript) {
206
+ config.include = _actorTranslation('./steps_file', config.translation);
207
+ } else {
208
+ config.include = _actorTranslation(stepFile, config.translation);
209
+ }
210
+
205
211
  print(`Steps file created at ${stepFile}`);
206
212
 
207
213
  let configSource;
@@ -316,7 +322,7 @@ module.exports = function (initPath) {
316
322
  };
317
323
 
318
324
  print('Configure helpers...');
319
- inquirer.prompt(helperConfigs).then((helperResult) => {
325
+ inquirer.prompt(helperConfigs).then(async (helperResult) => {
320
326
  if (helperResult.Playwright_browser === 'electron') {
321
327
  delete helperResult.Playwright_url;
322
328
  delete helperResult.Playwright_show;
@@ -336,12 +342,12 @@ module.exports = function (initPath) {
336
342
  });
337
343
 
338
344
  print('');
339
- finish();
345
+ await finish();
340
346
  });
341
347
  });
342
348
  };
343
349
 
344
- function install(dependencies, verbose) {
350
+ function install(dependencies) {
345
351
  let command;
346
352
  let args;
347
353
 
@@ -374,9 +380,39 @@ function install(dependencies, verbose) {
374
380
  ].concat(dependencies);
375
381
  }
376
382
 
383
+ if (process.env._INIT_DRY_RUN_INSTALL) {
384
+ args.push('--dry-run');
385
+ }
386
+
377
387
  const { status } = spawn.sync(command, args, { stdio: 'inherit' });
378
388
  if (status !== 0) {
379
389
  throw new Error(`${command} ${args.join(' ')} failed`);
380
390
  }
381
391
  return true;
382
392
  }
393
+
394
+ function _actorTranslation(stepFile, translationSelected) {
395
+ let actor;
396
+
397
+ for (const translationAvailable of translations) {
398
+ if (actor) {
399
+ break;
400
+ }
401
+
402
+ if (translationSelected === translationAvailable) {
403
+ const nameOfActor = require('../../translations')[translationAvailable].I;
404
+
405
+ actor = {
406
+ [nameOfActor]: stepFile,
407
+ };
408
+ }
409
+ }
410
+
411
+ if (!actor) {
412
+ actor = {
413
+ I: stepFile,
414
+ };
415
+ }
416
+
417
+ return actor;
418
+ }
@@ -39,6 +39,10 @@ module.exports = async function (workerCount, selectedRuns, options) {
39
39
  });
40
40
 
41
41
  try {
42
+ if (options.verbose) {
43
+ const getInfo = require('./info');
44
+ await getInfo();
45
+ }
42
46
  await workers.bootstrapAll();
43
47
  await workers.run();
44
48
  } catch (err) {
@@ -28,6 +28,12 @@ module.exports = async function (test, options) {
28
28
  codecept.init(testRoot);
29
29
  await codecept.bootstrap();
30
30
  codecept.loadTests(test);
31
+
32
+ if (options.verbose) {
33
+ const getInfo = require('./info');
34
+ await getInfo();
35
+ }
36
+
31
37
  await codecept.run();
32
38
  } catch (err) {
33
39
  printError(err);
@@ -117,6 +117,43 @@ const vendorPrefix = {
117
117
  * }
118
118
  * ```
119
119
  *
120
+ * Example Android App using Appiumv2 on BrowserStack:
121
+ *
122
+ * ```js
123
+ * {
124
+ * helpers: {
125
+ * Appium: {
126
+ * appiumV2: true,
127
+ * host: "hub-cloud.browserstack.com",
128
+ * port: 4444,
129
+ * user: process.env.BROWSERSTACK_USER,
130
+ * key: process.env.BROWSERSTACK_KEY,
131
+ * app: `bs://c700ce60cf1gjhgjh3ae8ed9770ghjg5a55b8e022f13c5827cg`,
132
+ * browser: '',
133
+ * desiredCapabilities: {
134
+ * 'appPackage': data.packageName,
135
+ * 'deviceName': process.env.DEVICE || 'Google Pixel 3',
136
+ * 'platformName': process.env.PLATFORM || 'android',
137
+ * 'platformVersion': process.env.OS_VERSION || '10.0',
138
+ * 'automationName': process.env.ENGINE || 'UIAutomator2',
139
+ * 'newCommandTimeout': 300000,
140
+ * 'androidDeviceReadyTimeout': 300000,
141
+ * 'androidInstallTimeout': 90000,
142
+ * 'appWaitDuration': 300000,
143
+ * 'autoGrantPermissions': true,
144
+ * 'gpsEnabled': true,
145
+ * 'isHeadless': false,
146
+ * 'noReset': false,
147
+ * 'noSign': true,
148
+ * 'bstack:options' : {
149
+ * "appiumVersion" : "2.0.1",
150
+ * },
151
+ * }
152
+ * }
153
+ * }
154
+ * }
155
+ * ```
156
+ *
120
157
  * Additional configuration params can be used from <https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md>
121
158
  *
122
159
  * ## Access From Helpers
@@ -234,7 +271,9 @@ class Appium extends Webdriver {
234
271
  const _convertedCaps = {};
235
272
  for (const [key, value] of Object.entries(capabilities)) {
236
273
  if (!key.startsWith(vendorPrefix.appium)) {
237
- _convertedCaps[`${vendorPrefix.appium}:${key}`] = value;
274
+ if (key !== 'platformName') {
275
+ _convertedCaps[`${vendorPrefix.appium}:${key}`] = value;
276
+ }
238
277
  } else {
239
278
  _convertedCaps[`${key}`] = value;
240
279
  }
@@ -482,6 +482,7 @@ class Playwright extends Helper {
482
482
  contextOptions.httpCredentials = this.options.basicAuth;
483
483
  this.isAuthenticated = true;
484
484
  }
485
+ if (this.options.bypassCSP) contextOptions.bypassCSP = this.options.bypassCSP;
485
486
  if (this.options.recordVideo) contextOptions.recordVideo = this.options.recordVideo;
486
487
  if (this.storageState) contextOptions.storageState = this.storageState;
487
488
  if (this.options.userAgent) contextOptions.userAgent = this.options.userAgent;
@@ -849,8 +850,8 @@ class Playwright extends Helper {
849
850
  await this.switchTo(null);
850
851
  return frame.reduce((p, frameLocator) => p.then(() => this.switchTo(frameLocator)), Promise.resolve());
851
852
  }
852
- await this.switchTo(locator);
853
- this.withinLocator = new Locator(locator);
853
+ await this.switchTo(frame);
854
+ this.withinLocator = new Locator(frame);
854
855
  return;
855
856
  }
856
857
 
@@ -2551,14 +2552,17 @@ class Playwright extends Helper {
2551
2552
 
2552
2553
  // iframe by selector
2553
2554
  const els = await this._locate(locator);
2554
- // assertElementExists(els, locator);
2555
+ if (!els[0]) {
2556
+ throw new Error(`Element ${JSON.stringify(locator)} was not found by text|CSS|XPath`);
2557
+ }
2555
2558
 
2556
2559
  // get content of the first iframe
2557
- if ((locator.frame && locator.frame === 'iframe') || locator.toLowerCase() === 'iframe') {
2560
+ locator = new Locator(locator, 'css');
2561
+ if ((locator.frame && locator.frame === 'iframe') || locator.value.toLowerCase() === 'iframe') {
2558
2562
  contentFrame = await this.page.frames()[1];
2559
2563
  // get content of the iframe using its name
2560
- } else if (locator.toLowerCase().includes('name=')) {
2561
- const frameName = locator.split('=')[1].replace(/"/g, '').replaceAll(/]/g, '');
2564
+ } else if (locator.value.toLowerCase().includes('name=')) {
2565
+ const frameName = locator.value.split('=')[1].replace(/"/g, '').replaceAll(/]/g, '');
2562
2566
  contentFrame = await this.page.frame(frameName);
2563
2567
  }
2564
2568
 
@@ -2566,7 +2570,7 @@ class Playwright extends Helper {
2566
2570
  this.context = contentFrame;
2567
2571
  this.contextLocator = null;
2568
2572
  } else {
2569
- this.context = els[0];
2573
+ this.context = this.page.frame(this.page.frames()[1].name());
2570
2574
  this.contextLocator = locator;
2571
2575
  }
2572
2576
  }
@@ -3514,7 +3518,10 @@ async function elementSelected(element) {
3514
3518
 
3515
3519
  function isFrameLocator(locator) {
3516
3520
  locator = new Locator(locator);
3517
- if (locator.isFrame()) return locator.value;
3521
+ if (locator.isFrame()) {
3522
+ const _locator = new Locator(locator.value);
3523
+ return _locator.value;
3524
+ }
3518
3525
  return false;
3519
3526
  }
3520
3527
 
@@ -604,8 +604,8 @@ class Puppeteer extends Helper {
604
604
  return this.switchTo(null)
605
605
  .then(() => frame.reduce((p, frameLocator) => p.then(() => this.switchTo(frameLocator)), Promise.resolve()));
606
606
  }
607
- await this.switchTo(locator);
608
- this.withinLocator = new Locator(locator);
607
+ await this.switchTo(frame);
608
+ this.withinLocator = new Locator(frame);
609
609
  return;
610
610
  }
611
611
 
@@ -2011,7 +2011,7 @@ class Puppeteer extends Helper {
2011
2011
  assertElementExists(els, locator);
2012
2012
 
2013
2013
  return this.waitForFunction(isElementClickable, [els[0]], waitTimeout).catch(async (e) => {
2014
- if (/failed: timeout/i.test(e.message)) {
2014
+ if (/Waiting failed/i.test(e.message) || /failed: timeout/i.test(e.message)) {
2015
2015
  throw new Error(`element ${new Locator(locator).toString()} still not clickable after ${waitTimeout || this.options.waitForTimeout / 1000} sec`);
2016
2016
  } else {
2017
2017
  throw e;
@@ -2115,7 +2115,7 @@ class Puppeteer extends Helper {
2115
2115
  return currUrl.indexOf(urlPart) > -1;
2116
2116
  }, { timeout: waitTimeout }, urlPart).catch(async (e) => {
2117
2117
  const currUrl = await this._getPageUrl(); // Required because the waitForFunction can't return data.
2118
- if (/failed: timeout/i.test(e.message)) {
2118
+ if (/Waiting failed:/i.test(e.message) || /failed: timeout/i.test(e.message)) {
2119
2119
  throw new Error(`expected url to include ${urlPart}, but found ${currUrl}`);
2120
2120
  } else {
2121
2121
  throw e;
@@ -2139,7 +2139,7 @@ class Puppeteer extends Helper {
2139
2139
  return currUrl.indexOf(urlPart) > -1;
2140
2140
  }, { timeout: waitTimeout }, urlPart).catch(async (e) => {
2141
2141
  const currUrl = await this._getPageUrl(); // Required because the waitForFunction can't return data.
2142
- if (/failed: timeout/i.test(e.message)) {
2142
+ if (/Waiting failed/i.test(e.message) || /failed: timeout/i.test(e.message)) {
2143
2143
  throw new Error(`expected url to be ${urlPart}, but found ${currUrl}`);
2144
2144
  } else {
2145
2145
  throw e;
@@ -2348,6 +2348,10 @@ async function findElements(matcher, locator) {
2348
2348
  if (locator.react) return findReact(matcher.executionContext(), locator);
2349
2349
  locator = new Locator(locator, 'css');
2350
2350
  if (!locator.isXPath()) return matcher.$$(locator.simplify());
2351
+ // puppeteer version < 19.4.0 is no longer supported. This one is backward support.
2352
+ if (puppeteer.default?.defaultBrowserRevision) {
2353
+ return matcher.$$(`xpath/${locator.value}`);
2354
+ }
2351
2355
  return matcher.$x(locator.value);
2352
2356
  }
2353
2357
 
@@ -2602,7 +2606,10 @@ async function elementSelected(element) {
2602
2606
 
2603
2607
  function isFrameLocator(locator) {
2604
2608
  locator = new Locator(locator);
2605
- if (locator.isFrame()) return locator.value;
2609
+ if (locator.isFrame()) {
2610
+ const _locator = new Locator(locator);
2611
+ return _locator.value;
2612
+ }
2606
2613
  return false;
2607
2614
  }
2608
2615
 
package/lib/pause.js CHANGED
@@ -22,6 +22,7 @@ const aiAssistant = new AiAssistant();
22
22
 
23
23
  /**
24
24
  * Pauses test execution and starts interactive shell
25
+ * @param {Object<string, *>} [passedObject]
25
26
  */
26
27
  const pause = function (passedObject = {}) {
27
28
  if (store.dryRun) return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeceptjs",
3
- "version": "3.5.4",
3
+ "version": "3.5.5",
4
4
  "description": "Supercharged End 2 End Testing Framework for NodeJS",
5
5
  "keywords": [
6
6
  "acceptance",
@@ -59,93 +59,93 @@
59
59
  "prepare": "husky install"
60
60
  },
61
61
  "dependencies": {
62
- "@codeceptjs/configure": "^0.10.0",
63
- "@codeceptjs/helper": "^2.0.1",
64
- "@cucumber/cucumber-expressions": "^16",
65
- "@cucumber/gherkin": "^26",
66
- "@cucumber/messages": "^22.0.0",
67
- "@xmldom/xmldom": "^0.8.10",
68
- "acorn": "^8.10.0",
69
- "arrify": "^2.0.1",
70
- "axios": "^1.3.3",
71
- "chai": "^4.3.6",
72
- "chai-deep-match": "^1.2.1",
73
- "chalk": "^4.1.2",
74
- "commander": "^11.0.0",
75
- "cross-spawn": "^7.0.3",
76
- "css-to-xpath": "^0.1.0",
77
- "envinfo": "^7.8.1",
78
- "escape-string-regexp": "^4.0.0",
79
- "figures": "^3.2.0",
80
- "fn-args": "^4.0.0",
81
- "fs-extra": "^8.1.0",
82
- "glob": "^6.0.1",
83
- "html-minifier": "^4.0.0",
84
- "inquirer": "^6.5.2",
85
- "joi": "^17.6.0",
86
- "js-beautify": "^1.14.0",
87
- "lodash.clonedeep": "^4.5.0",
88
- "lodash.merge": "^4.6.2",
89
- "mkdirp": "^1.0.4",
90
- "mocha": "^10.2.0",
91
- "ms": "^2.1.3",
92
- "openai": "^3.2.1",
93
- "ora-classic": "^5.4.2",
94
- "parse-function": "^5.6.4",
95
- "parse5": "^7.1.2",
96
- "promise-retry": "^1.1.1",
97
- "resq": "^1.10.2",
98
- "sprintf-js": "^1.1.1",
99
- "uuid": "^9.0"
62
+ "@codeceptjs/configure": "0.10.0",
63
+ "@codeceptjs/helper": "2.0.1",
64
+ "@cucumber/cucumber-expressions": "16",
65
+ "@cucumber/gherkin": "26",
66
+ "@cucumber/messages": "22.0.0",
67
+ "@xmldom/xmldom": "0.8.10",
68
+ "acorn": "8.10.0",
69
+ "arrify": "2.0.1",
70
+ "axios": "1.3.3",
71
+ "chai": "4.3.6",
72
+ "chai-deep-match": "1.2.1",
73
+ "chalk": "4.1.2",
74
+ "commander": "11.0.0",
75
+ "cross-spawn": "7.0.3",
76
+ "css-to-xpath": "0.1.0",
77
+ "envinfo": "7.8.1",
78
+ "escape-string-regexp": "4.0.0",
79
+ "figures": "3.2.0",
80
+ "fn-args": "4.0.0",
81
+ "fs-extra": "8.1.0",
82
+ "glob": "6.0.1",
83
+ "html-minifier": "4.0.0",
84
+ "inquirer": "6.5.2",
85
+ "joi": "17.6.0",
86
+ "js-beautify": "1.14.0",
87
+ "lodash.clonedeep": "4.5.0",
88
+ "lodash.merge": "4.6.2",
89
+ "mkdirp": "1.0.4",
90
+ "mocha": "10.2.0",
91
+ "ms": "2.1.3",
92
+ "openai": "3.2.1",
93
+ "ora-classic": "5.4.2",
94
+ "parse-function": "5.6.4",
95
+ "parse5": "7.1.2",
96
+ "promise-retry": "1.1.1",
97
+ "resq": "1.10.2",
98
+ "sprintf-js": "1.1.1",
99
+ "uuid": "9.0"
100
100
  },
101
101
  "devDependencies": {
102
- "@codeceptjs/detox-helper": "^1.0.2",
103
- "@codeceptjs/mock-request": "^0.3.1",
104
- "@faker-js/faker": "^7.6.0",
105
- "@pollyjs/adapter-puppeteer": "^6.0.5",
106
- "@pollyjs/core": "^5.1.0",
107
- "@types/inquirer": "^9.0.3",
108
- "@types/node": "^20.4.4",
109
- "@wdio/sauce-service": "^8.3.8",
110
- "@wdio/selenium-standalone-service": "^8.3.2",
111
- "@wdio/utils": "^8.3.0",
102
+ "@codeceptjs/detox-helper": "1.0.2",
103
+ "@codeceptjs/mock-request": "0.3.1",
104
+ "@faker-js/faker": "7.6.0",
105
+ "@pollyjs/adapter-puppeteer": "6.0.5",
106
+ "@pollyjs/core": "5.1.0",
107
+ "@types/inquirer": "9.0.3",
108
+ "@types/node": "20.4.4",
109
+ "@wdio/sauce-service": "8.3.8",
110
+ "@wdio/selenium-standalone-service": "8.3.2",
111
+ "@wdio/utils": "8.3.0",
112
112
  "apollo-server-express": "2.25.3",
113
- "chai-as-promised": "^7.1.1",
114
- "chai-subset": "^1.6.0",
115
- "contributor-faces": "^1.0.3",
116
- "documentation": "^12.3.0",
117
- "dtslint": "^4.1.6",
118
- "electron": "^26.1.0",
119
- "eslint": "^8.45.0",
120
- "eslint-config-airbnb-base": "^15.0.0",
121
- "eslint-plugin-import": "^2.25.4",
122
- "eslint-plugin-mocha": "^6.3.0",
123
- "expect": "^29.6.2",
124
- "express": "^4.17.2",
125
- "graphql": "^14.6.0",
126
- "husky": "^8.0.1",
127
- "inquirer-test": "^2.0.1",
128
- "jsdoc": "^3.6.10",
129
- "jsdoc-typeof-plugin": "^1.0.0",
130
- "json-server": "^0.10.1",
131
- "playwright": "^1.35.1",
132
- "puppeteer": "^10.4.0",
133
- "qrcode-terminal": "^0.12.0",
134
- "rosie": "^2.1.0",
135
- "runok": "^0.9.2",
136
- "sinon": "^15.2.0",
137
- "sinon-chai": "^3.7.0",
138
- "testcafe": "^3.0.1",
139
- "ts-morph": "^3.1.3",
140
- "ts-node": "^10.9.1",
141
- "tsd-jsdoc": "^2.5.0",
142
- "typedoc": "^0.24.8",
143
- "typedoc-plugin-markdown": "^3.13.4",
144
- "typescript": "^5.1.6",
145
- "wdio-docker-service": "^1.5.0",
146
- "webdriverio": "^8.3.8",
147
- "xml2js": "^0.6.0",
148
- "xmldom": "^0.6.0",
113
+ "chai-as-promised": "7.1.1",
114
+ "chai-subset": "1.6.0",
115
+ "contributor-faces": "1.0.3",
116
+ "documentation": "12.3.0",
117
+ "dtslint": "4.1.6",
118
+ "electron": "26.1.0",
119
+ "eslint": "8.45.0",
120
+ "eslint-config-airbnb-base": "15.0.0",
121
+ "eslint-plugin-import": "2.25.4",
122
+ "eslint-plugin-mocha": "6.3.0",
123
+ "expect": "29.6.2",
124
+ "express": "4.17.2",
125
+ "graphql": "14.6.0",
126
+ "husky": "8.0.1",
127
+ "inquirer-test": "2.0.1",
128
+ "jsdoc": "3.6.10",
129
+ "jsdoc-typeof-plugin": "1.0.0",
130
+ "json-server": "0.10.1",
131
+ "playwright": "1.35.1",
132
+ "puppeteer": "21.1.1",
133
+ "qrcode-terminal": "0.12.0",
134
+ "rosie": "2.1.0",
135
+ "runok": "0.9.2",
136
+ "sinon": "15.2.0",
137
+ "sinon-chai": "3.7.0",
138
+ "testcafe": "3.0.1",
139
+ "ts-morph": "19.0.0",
140
+ "ts-node": "10.9.1",
141
+ "tsd-jsdoc": "2.5.0",
142
+ "typedoc": "0.24.8",
143
+ "typedoc-plugin-markdown": "3.13.4",
144
+ "typescript": "5.1.6",
145
+ "wdio-docker-service": "1.5.0",
146
+ "webdriverio": "8.3.8",
147
+ "xml2js": "0.6.0",
148
+ "xmldom": "0.6.0",
149
149
  "xpath": "0.0.33"
150
150
  },
151
151
  "engines": {
@@ -2071,6 +2071,8 @@ declare namespace CodeceptJS {
2071
2071
  * ```
2072
2072
  * @param fn - function to be executed in browser context.
2073
2073
  * @param args - to be passed to function.
2074
+ * @returns script return value
2075
+ *
2074
2076
  * ⚠️ returns a _promise_ which is synchronized internally by recorder
2075
2077
  *
2076
2078
  *
@@ -2100,6 +2102,8 @@ declare namespace CodeceptJS {
2100
2102
  * ```
2101
2103
  * @param fn - function to be executed in browser context.
2102
2104
  * @param args - to be passed to function.
2105
+ * @returns script return value
2106
+ *
2103
2107
  * ⚠️ returns a _promise_ which is synchronized internally by recorder
2104
2108
  *
2105
2109
  *
@@ -5564,6 +5568,8 @@ declare namespace CodeceptJS {
5564
5568
  * ```
5565
5569
  * @param fn - function to be executed in browser context.
5566
5570
  * @param args - to be passed to function.
5571
+ * @returns script return value
5572
+ *
5567
5573
  * ⚠️ returns a _promise_ which is synchronized internally by recorder
5568
5574
  */
5569
5575
  executeScript(fn: string | ((...params: any[]) => any), ...args: any[]): Promise<any>;
@@ -5590,6 +5596,8 @@ declare namespace CodeceptJS {
5590
5596
  * ```
5591
5597
  * @param fn - function to be executed in browser context.
5592
5598
  * @param args - to be passed to function.
5599
+ * @returns script return value
5600
+ *
5593
5601
  * ⚠️ returns a _promise_ which is synchronized internally by recorder
5594
5602
  */
5595
5603
  executeAsyncScript(fn: string | ((...params: any[]) => any), ...args: any[]): Promise<any>;
@@ -7314,6 +7322,8 @@ declare namespace CodeceptJS {
7314
7322
  * ```
7315
7323
  * @param fn - function to be executed in browser context.
7316
7324
  * @param args - to be passed to function.
7325
+ * @returns script return value
7326
+ *
7317
7327
  * ⚠️ returns a _promise_ which is synchronized internally by recorder
7318
7328
  *
7319
7329
  *
@@ -7343,6 +7353,8 @@ declare namespace CodeceptJS {
7343
7353
  * ```
7344
7354
  * @param fn - function to be executed in browser context.
7345
7355
  * @param args - to be passed to function.
7356
+ * @returns script return value
7357
+ *
7346
7358
  * ⚠️ returns a _promise_ which is synchronized internally by recorder
7347
7359
  *
7348
7360
  *
@@ -8596,6 +8608,8 @@ declare namespace CodeceptJS {
8596
8608
  * ```
8597
8609
  * @param fn - function to be executed in browser context.
8598
8610
  * @param args - to be passed to function.
8611
+ * @returns script return value
8612
+ *
8599
8613
  * ⚠️ returns a _promise_ which is synchronized internally by recorder
8600
8614
  *
8601
8615
  *
@@ -10076,6 +10090,8 @@ declare namespace CodeceptJS {
10076
10090
  * ```
10077
10091
  * @param fn - function to be executed in browser context.
10078
10092
  * @param args - to be passed to function.
10093
+ * @returns script return value
10094
+ *
10079
10095
  * ⚠️ returns a _promise_ which is synchronized internally by recorder
10080
10096
  *
10081
10097
  *
@@ -10106,6 +10122,8 @@ declare namespace CodeceptJS {
10106
10122
  * ```
10107
10123
  * @param fn - function to be executed in browser context.
10108
10124
  * @param args - to be passed to function.
10125
+ * @returns script return value
10126
+ *
10109
10127
  * ⚠️ returns a _promise_ which is synchronized internally by recorder
10110
10128
  */
10111
10129
  executeAsyncScript(fn: string | ((...params: any[]) => any), ...args: any[]): Promise<any>;