codeceptjs 3.3.5-beta.6 → 3.3.6

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 (160) hide show
  1. package/CHANGELOG.md +69 -2
  2. package/bin/codecept.js +40 -3
  3. package/docs/basics.md +24 -1
  4. package/docs/build/Appium.js +41 -22
  5. package/docs/build/FileSystem.js +1 -1
  6. package/docs/build/Nightmare.js +106 -57
  7. package/docs/build/Playwright.js +187 -111
  8. package/docs/build/Protractor.js +132 -70
  9. package/docs/build/Puppeteer.js +143 -76
  10. package/docs/build/REST.js +2 -2
  11. package/docs/build/TestCafe.js +107 -57
  12. package/docs/build/WebDriver.js +162 -89
  13. package/docs/changelog.md +107 -2
  14. package/docs/commands.md +5 -3
  15. package/docs/community-helpers.md +7 -4
  16. package/docs/configuration.md +5 -5
  17. package/docs/examples.md +39 -48
  18. package/docs/helpers/Appium.md +25 -23
  19. package/docs/helpers/FileSystem.md +1 -1
  20. package/docs/helpers/Nightmare.md +57 -57
  21. package/docs/helpers/Playwright.md +76 -75
  22. package/docs/helpers/Puppeteer.md +76 -85
  23. package/docs/helpers/REST.md +1 -1
  24. package/docs/helpers/TestCafe.md +57 -57
  25. package/docs/helpers/WebDriver.md +84 -97
  26. package/docs/quickstart.md +1 -1
  27. package/docs/reports.md +1 -1
  28. package/docs/secrets.md +1 -1
  29. package/docs/typescript.md +9 -69
  30. package/docs/webapi/appendField.mustache +1 -1
  31. package/docs/webapi/attachFile.mustache +3 -3
  32. package/docs/webapi/checkOption.mustache +1 -1
  33. package/docs/webapi/clearCookie.mustache +1 -1
  34. package/docs/webapi/clearField.mustache +1 -1
  35. package/docs/webapi/click.mustache +1 -1
  36. package/docs/webapi/clickLink.mustache +1 -1
  37. package/docs/webapi/closeCurrentTab.mustache +1 -1
  38. package/docs/webapi/closeOtherTabs.mustache +1 -1
  39. package/docs/webapi/dontSee.mustache +1 -1
  40. package/docs/webapi/dontSeeCheckboxIsChecked.mustache +1 -1
  41. package/docs/webapi/dontSeeCookie.mustache +1 -1
  42. package/docs/webapi/dontSeeCurrentUrlEquals.mustache +1 -1
  43. package/docs/webapi/dontSeeElement.mustache +1 -1
  44. package/docs/webapi/dontSeeElementInDOM.mustache +1 -1
  45. package/docs/webapi/dontSeeInCurrentUrl.mustache +1 -1
  46. package/docs/webapi/dontSeeInField.mustache +1 -1
  47. package/docs/webapi/dontSeeInSource.mustache +1 -1
  48. package/docs/webapi/dontSeeInTitle.mustache +1 -1
  49. package/docs/webapi/doubleClick.mustache +1 -1
  50. package/docs/webapi/downloadFile.mustache +1 -1
  51. package/docs/webapi/dragAndDrop.mustache +1 -1
  52. package/docs/webapi/dragSlider.mustache +1 -1
  53. package/docs/webapi/executeAsyncScript.mustache +1 -1
  54. package/docs/webapi/executeScript.mustache +1 -1
  55. package/docs/webapi/fillField.mustache +1 -1
  56. package/docs/webapi/forceClick.mustache +1 -1
  57. package/docs/webapi/forceRightClick.mustache +1 -1
  58. package/docs/webapi/moveCursorTo.mustache +1 -1
  59. package/docs/webapi/openNewTab.mustache +1 -1
  60. package/docs/webapi/pressKey.mustache +1 -1
  61. package/docs/webapi/pressKeyDown.mustache +1 -1
  62. package/docs/webapi/pressKeyUp.mustache +1 -1
  63. package/docs/webapi/pressKeyWithKeyNormalization.mustache +1 -1
  64. package/docs/webapi/refreshPage.mustache +1 -1
  65. package/docs/webapi/resizeWindow.mustache +1 -1
  66. package/docs/webapi/rightClick.mustache +1 -1
  67. package/docs/webapi/saveElementScreenshot.mustache +2 -2
  68. package/docs/webapi/saveScreenshot.mustache +2 -2
  69. package/docs/webapi/say.mustache +1 -1
  70. package/docs/webapi/scrollIntoView.mustache +1 -1
  71. package/docs/webapi/scrollPageToBottom.mustache +1 -1
  72. package/docs/webapi/scrollPageToTop.mustache +1 -1
  73. package/docs/webapi/scrollTo.mustache +1 -1
  74. package/docs/webapi/see.mustache +1 -1
  75. package/docs/webapi/seeAttributesOnElements.mustache +1 -1
  76. package/docs/webapi/seeCheckboxIsChecked.mustache +1 -1
  77. package/docs/webapi/seeCookie.mustache +1 -1
  78. package/docs/webapi/seeCssPropertiesOnElements.mustache +1 -1
  79. package/docs/webapi/seeCurrentUrlEquals.mustache +1 -1
  80. package/docs/webapi/seeElement.mustache +1 -1
  81. package/docs/webapi/seeElementInDOM.mustache +1 -1
  82. package/docs/webapi/seeInCurrentUrl.mustache +1 -1
  83. package/docs/webapi/seeInField.mustache +1 -1
  84. package/docs/webapi/seeInPopup.mustache +1 -1
  85. package/docs/webapi/seeInSource.mustache +1 -1
  86. package/docs/webapi/seeInTitle.mustache +1 -1
  87. package/docs/webapi/seeNumberOfElements.mustache +1 -1
  88. package/docs/webapi/seeNumberOfVisibleElements.mustache +1 -1
  89. package/docs/webapi/seeTextEquals.mustache +1 -1
  90. package/docs/webapi/seeTitleEquals.mustache +1 -1
  91. package/docs/webapi/selectOption.mustache +1 -1
  92. package/docs/webapi/setCookie.mustache +1 -1
  93. package/docs/webapi/setGeoLocation.mustache +1 -1
  94. package/docs/webapi/switchTo.mustache +1 -1
  95. package/docs/webapi/switchToNextTab.mustache +1 -1
  96. package/docs/webapi/switchToPreviousTab.mustache +1 -1
  97. package/docs/webapi/type.mustache +1 -1
  98. package/docs/webapi/uncheckOption.mustache +1 -1
  99. package/docs/webapi/wait.mustache +1 -1
  100. package/docs/webapi/waitForClickable.mustache +1 -1
  101. package/docs/webapi/waitForDetached.mustache +1 -1
  102. package/docs/webapi/waitForElement.mustache +1 -1
  103. package/docs/webapi/waitForEnabled.mustache +1 -1
  104. package/docs/webapi/waitForFunction.mustache +1 -1
  105. package/docs/webapi/waitForInvisible.mustache +1 -1
  106. package/docs/webapi/waitForText.mustache +1 -1
  107. package/docs/webapi/waitForValue.mustache +1 -1
  108. package/docs/webapi/waitForVisible.mustache +1 -1
  109. package/docs/webapi/waitInUrl.mustache +1 -1
  110. package/docs/webapi/waitNumberOfVisibleElements.mustache +1 -1
  111. package/docs/webapi/waitToHide.mustache +1 -1
  112. package/docs/webapi/waitUrlEquals.mustache +1 -1
  113. package/lib/command/configMigrate.js +1 -1
  114. package/lib/command/dryRun.js +2 -1
  115. package/lib/command/generate.js +35 -18
  116. package/lib/command/run-rerun.js +38 -0
  117. package/lib/command/utils.js +13 -3
  118. package/lib/config.js +2 -2
  119. package/lib/data/context.js +7 -0
  120. package/lib/helper/Appium.js +6 -4
  121. package/lib/helper/FileSystem.js +1 -1
  122. package/lib/helper/Nightmare.js +1 -1
  123. package/lib/helper/Playwright.js +48 -38
  124. package/lib/helper/Protractor.js +1 -1
  125. package/lib/helper/REST.js +2 -2
  126. package/lib/helper/TestCafe.js +1 -1
  127. package/lib/helper/WebDriver.js +7 -7
  128. package/lib/plugin/wdio.js +11 -2
  129. package/lib/utils.js +3 -0
  130. package/package.json +2 -2
  131. package/typings/index.d.ts +46 -46
  132. package/typings/types.d.ts +497 -443
  133. package/docs/wiki/.git/FETCH_HEAD +0 -1
  134. package/docs/wiki/.git/HEAD +0 -1
  135. package/docs/wiki/.git/ORIG_HEAD +0 -1
  136. package/docs/wiki/.git/config +0 -11
  137. package/docs/wiki/.git/description +0 -1
  138. package/docs/wiki/.git/hooks/applypatch-msg.sample +0 -15
  139. package/docs/wiki/.git/hooks/commit-msg.sample +0 -24
  140. package/docs/wiki/.git/hooks/fsmonitor-watchman.sample +0 -173
  141. package/docs/wiki/.git/hooks/post-update.sample +0 -8
  142. package/docs/wiki/.git/hooks/pre-applypatch.sample +0 -14
  143. package/docs/wiki/.git/hooks/pre-commit.sample +0 -49
  144. package/docs/wiki/.git/hooks/pre-merge-commit.sample +0 -13
  145. package/docs/wiki/.git/hooks/pre-push.sample +0 -53
  146. package/docs/wiki/.git/hooks/pre-rebase.sample +0 -169
  147. package/docs/wiki/.git/hooks/pre-receive.sample +0 -24
  148. package/docs/wiki/.git/hooks/prepare-commit-msg.sample +0 -42
  149. package/docs/wiki/.git/hooks/push-to-checkout.sample +0 -78
  150. package/docs/wiki/.git/hooks/update.sample +0 -128
  151. package/docs/wiki/.git/index +0 -0
  152. package/docs/wiki/.git/info/exclude +0 -6
  153. package/docs/wiki/.git/logs/HEAD +0 -1
  154. package/docs/wiki/.git/logs/refs/heads/master +0 -1
  155. package/docs/wiki/.git/logs/refs/remotes/origin/HEAD +0 -1
  156. package/docs/wiki/.git/objects/pack/pack-5938044f9d30daf1c195fda4dec1d54850933935.idx +0 -0
  157. package/docs/wiki/.git/objects/pack/pack-5938044f9d30daf1c195fda4dec1d54850933935.pack +0 -0
  158. package/docs/wiki/.git/packed-refs +0 -2
  159. package/docs/wiki/.git/refs/heads/master +0 -1
  160. package/docs/wiki/.git/refs/remotes/origin/HEAD +0 -1
@@ -44,11 +44,11 @@ let version;
44
44
  * @prop {string} browser browser in which to perform testing.
45
45
  * @prop {string} [basicAuth] - (optional) the basic authentication to pass to base url. Example: {username: 'username', password: 'password'}
46
46
  * @prop {string} [host=localhost] - WebDriver host to connect.
47
- * @prop {string} [port=4444] - WebDriver port to connect.
47
+ * @prop {number} [port=4444] - WebDriver port to connect.
48
48
  * @prop {string} [protocol=http] - protocol for WebDriver server.
49
49
  * @prop {string} [path=/wd/hub] - path to WebDriver server,
50
50
  * @prop {boolean} [restart=true] - restart browser between tests.
51
- * @prop {boolean} [smartWait=false] - **enables [SmartWait](http://codecept.io/acceptance/#smartwait)**; wait for additional milliseconds for element to appear. Enable for 5 secs: "smartWait": 5000.
51
+ * @prop {boolean|number} [smartWait=false] - **enables [SmartWait](http://codecept.io/acceptance/#smartwait)**; wait for additional milliseconds for element to appear. Enable for 5 secs: "smartWait": 5000.
52
52
  * @prop {boolean} [disableScreenshots=false] - don't save screenshots on failure.
53
53
  * @prop {boolean} [fullPageScreenshots=false] (optional - make full page screenshots on failure.
54
54
  * @prop {boolean} [uniqueScreenshotNames=false] - option to prevent screenshot override if you have scenarios with the same name in different suites.
@@ -916,7 +916,7 @@ class WebDriver extends Helper {
916
916
  * {{ react }}
917
917
  */
918
918
  async click(locator, context = null) {
919
- const clickMethod = this.browser.isMobile && this.browser.capabilities.platformName !== 'android' ? 'touchClick' : 'elementClick';
919
+ const clickMethod = this.browser.isMobile && !this.browser.isW3C ? 'touchClick' : 'elementClick';
920
920
  const locateFn = prepareLocateFn.call(this, context);
921
921
 
922
922
  const res = await findClickable.call(this, locator, locateFn);
@@ -1126,7 +1126,7 @@ class WebDriver extends Helper {
1126
1126
  * Appium: not tested
1127
1127
  */
1128
1128
  async checkOption(field, context = null) {
1129
- const clickMethod = this.browser.isMobile && this.browser.capabilities.platformName !== 'android' ? 'touchClick' : 'elementClick';
1129
+ const clickMethod = this.browser.isMobile && !this.browser.isW3C ? 'touchClick' : 'elementClick';
1130
1130
  const locateFn = prepareLocateFn.call(this, context);
1131
1131
 
1132
1132
  const res = await findCheckable.call(this, field, locateFn);
@@ -1145,7 +1145,7 @@ class WebDriver extends Helper {
1145
1145
  * Appium: not tested
1146
1146
  */
1147
1147
  async uncheckOption(field, context = null) {
1148
- const clickMethod = this.browser.isMobile && this.browser.capabilities.platformName !== 'android' ? 'touchClick' : 'elementClick';
1148
+ const clickMethod = this.browser.isMobile && !this.browser.isW3C ? 'touchClick' : 'elementClick';
1149
1149
  const locateFn = prepareLocateFn.call(this, context);
1150
1150
 
1151
1151
  const res = await findCheckable.call(this, field, locateFn);
@@ -1632,7 +1632,7 @@ class WebDriver extends Helper {
1632
1632
  assertElementExists(res);
1633
1633
  const elem = usingFirstElement(res);
1634
1634
  const elementId = getElementId(elem);
1635
- if (this.browser.isMobile && this.browser.capabilities.platformName !== 'android') return this.browser.touchScroll(offsetX, offsetY, elementId);
1635
+ if (this.browser.isMobile && !this.browser.isW3C) return this.browser.touchScroll(offsetX, offsetY, elementId);
1636
1636
  const location = await elem.getLocation();
1637
1637
  assertElementExists(location, 'Failed to receive', 'location');
1638
1638
  /* eslint-disable prefer-arrow-callback */
@@ -1640,7 +1640,7 @@ class WebDriver extends Helper {
1640
1640
  /* eslint-enable */
1641
1641
  }
1642
1642
 
1643
- if (this.browser.isMobile && this.browser.capabilities.platformName !== 'android') return this.browser.touchScroll(locator, offsetX, offsetY);
1643
+ if (this.browser.isMobile && !this.browser.isW3C) return this.browser.touchScroll(locator, offsetX, offsetY);
1644
1644
 
1645
1645
  /* eslint-disable prefer-arrow-callback, comma-dangle */
1646
1646
  return this.browser.execute(function (x, y) { return window.scrollTo(x, y); }, offsetX, offsetY);
@@ -85,6 +85,8 @@ let restartsSession;
85
85
  *
86
86
  */
87
87
  module.exports = (config) => {
88
+ // Keep initial configs to pass as options to wdio services
89
+ const wdioOptions = { ...config };
88
90
  const webDriver = container.helpers('WebDriver');
89
91
  if (webDriver) {
90
92
  config = Object.assign(webDriver.options, config);
@@ -108,7 +110,9 @@ module.exports = (config) => {
108
110
  if (version.indexOf('5') === 0) {
109
111
  launchers.push(new Launcher(config));
110
112
  } else {
111
- const options = { logPath: global.output_dir, installArgs: seleniumInstallArgs, args: seleniumArgs };
113
+ const options = {
114
+ logPath: global.output_dir, installArgs: seleniumInstallArgs, args: seleniumArgs, ...wdioOptions,
115
+ };
112
116
  launchers.push(new Launcher(options, [config.capabilities], config));
113
117
  }
114
118
  }
@@ -215,7 +219,12 @@ module.exports = (config) => {
215
219
  if (launcher.onPrepare) {
216
220
  event.dispatcher.on(event.all.before, () => {
217
221
  recorder.add(`launcher ${name} start`, async () => {
218
- await launcher.onPrepare(config, config.capabilities);
222
+ // browserstack-service expects capabilities as array
223
+ if (launcher.constructor.name === 'BrowserstackLauncherService') {
224
+ await launcher.onPrepare(config, [config.capabilities]);
225
+ } else {
226
+ await launcher.onPrepare(config, config.capabilities);
227
+ }
219
228
  output.debug(`Started ${name}`);
220
229
  });
221
230
  });
package/lib/utils.js CHANGED
@@ -132,6 +132,9 @@ module.exports.clearString = function (str) {
132
132
  if (!str) return '';
133
133
  /* Replace forbidden symbols in string
134
134
  */
135
+ if (str.endsWith('.')) {
136
+ str = str.slice(0, -1);
137
+ }
135
138
  return str
136
139
  .replace(/ /g, '_')
137
140
  .replace(/"/g, "'")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeceptjs",
3
- "version": "3.3.5-beta.6",
3
+ "version": "3.3.6",
4
4
  "description": "Supercharged End 2 End Testing Framework for NodeJS",
5
5
  "keywords": [
6
6
  "acceptance",
@@ -87,6 +87,7 @@
87
87
  "requireg": "^0.2.2",
88
88
  "resq": "^1.10.2",
89
89
  "sprintf-js": "^1.1.1",
90
+ "semver": "^6.3.0",
90
91
  "uuid": "^8.3.2"
91
92
  },
92
93
  "devDependencies": {
@@ -127,7 +128,6 @@
127
128
  "qrcode-terminal": "^0.12.0",
128
129
  "rosie": "^1.6.0",
129
130
  "runok": "^0.9.2",
130
- "semver": "^6.3.0",
131
131
  "sinon": "^9.2.4",
132
132
  "sinon-chai": "^3.7.0",
133
133
  "testcafe": "^1.18.3",
@@ -32,20 +32,20 @@ declare namespace CodeceptJS {
32
32
  * ```
33
33
  */
34
34
  tests: string;
35
- /**
36
- * Where to store failure screenshots, artifacts, etc
37
- *
35
+ /**
36
+ * Where to store failure screenshots, artifacts, etc
37
+ *
38
38
  * ```js
39
39
  * output: './output'
40
40
  * ```
41
41
  */
42
42
  output: string;
43
- /**
43
+ /**
44
44
  * Pattern to filter tests by name.
45
45
  * This option is useful if you plan to use multiple configs for different environments.
46
- *
46
+ *
47
47
  * To execute only tests with @firefox tag
48
- *
48
+ *
49
49
  * ```js
50
50
  * grep: '@firefox'
51
51
  * ```
@@ -64,11 +64,11 @@ declare namespace CodeceptJS {
64
64
  * ```
65
65
  */
66
66
  helpers?: {
67
- /**
68
- * Run web tests controlling browsers via Playwright engine.
67
+ /**
68
+ * Run web tests controlling browsers via Playwright engine.
69
+ *
70
+ * https://codecept.io/helpers/playwright
69
71
  *
70
- * https://codecept.io/helpers/playwright
71
- *
72
72
  * Available commands:
73
73
  * ```js
74
74
  * I.amOnPage('/');
@@ -77,11 +77,11 @@ declare namespace CodeceptJS {
77
77
  * ```
78
78
  */
79
79
  Playwright?: PlaywrightConfig;
80
- /**
81
- * Run web tests controlling browsers via Puppeteer engine.
82
- *
83
- * https://codecept.io/helpers/puppeteer
84
- *
80
+ /**
81
+ * Run web tests controlling browsers via Puppeteer engine.
82
+ *
83
+ * https://codecept.io/helpers/puppeteer
84
+ *
85
85
  * Available commands:
86
86
  * ```js
87
87
  * I.amOnPage('/');
@@ -91,24 +91,24 @@ declare namespace CodeceptJS {
91
91
  */
92
92
  Puppeteer?: PuppeteerConfig;
93
93
 
94
- /**
95
- * Run web tests controlling browsers via WebDriver engine.
96
- *
94
+ /**
95
+ * Run web tests controlling browsers via WebDriver engine.
96
+ *
97
97
  * Available commands:
98
98
  * ```js
99
99
  * I.amOnPage('/');
100
100
  * I.click('Open');
101
101
  * I.see('Welcome');
102
102
  * ```
103
- *
104
- * https://codecept.io/helpers/webdriver
103
+ *
104
+ * https://codecept.io/helpers/webdriver
105
105
  */
106
106
  WebDriver?: WebDriverConfig;
107
- /**
108
- * Execute REST API requests for API testing or to assist web testing.
109
- *
110
- * https://codecept.io/helpers/REST
111
- *
107
+ /**
108
+ * Execute REST API requests for API testing or to assist web testing.
109
+ *
110
+ * https://codecept.io/helpers/REST
111
+ *
112
112
  * Available commands:
113
113
  * ```js
114
114
  * I.sendGetRequest('/');
@@ -116,30 +116,30 @@ declare namespace CodeceptJS {
116
116
  */
117
117
  REST?: RESTConfig;
118
118
 
119
- /**
119
+ /**
120
120
  * Use JSON assertions for API testing.
121
121
  * Can be paired with REST or GraphQL helpers.
122
- *
123
- * https://codecept.io/helpers/JSONResponse
124
- *
122
+ *
123
+ * https://codecept.io/helpers/JSONResponse
124
+ *
125
125
  * Available commands:
126
126
  * ```js
127
127
  * I.seeResponseContainsJson({ user: { email: 'jon@doe.com' } });
128
128
  * ```
129
129
  */
130
- JSONResponse?: any;
130
+ JSONResponse?: any;
131
131
 
132
132
  [key: string]: any;
133
133
  },
134
- /**
135
- * Enable CodeceptJS plugins.
136
- *
134
+ /**
135
+ * Enable CodeceptJS plugins.
136
+ *
137
137
  * https://codecept.io/plugins/
138
- *
138
+ *
139
139
  * Plugins listen to test events and extend functionality of CodeceptJS.
140
- *
140
+ *
141
141
  * Example:
142
- *
142
+ *
143
143
  * ```js
144
144
  * plugins: {
145
145
  * autoDelay: {
@@ -195,7 +195,7 @@ declare namespace CodeceptJS {
195
195
  mocha?: any;
196
196
  /**
197
197
  * [Execute code before](https://codecept.io/bootstrap/) tests are run.
198
- *
198
+ *
199
199
  * Can be either JS module file or async function:
200
200
  *
201
201
  * ```js
@@ -206,10 +206,10 @@ declare namespace CodeceptJS {
206
206
  * bootstrap: 'bootstrap.js',
207
207
  * ```
208
208
  */
209
- bootstrap?: () => Promise<void> | boolean | string;
209
+ bootstrap?: (() => Promise<void>) | boolean | string;
210
210
  /**
211
- * [Execute code after tests](https://codecept.io/bootstrap/) finished.
212
- *
211
+ * [Execute code after tests](https://codecept.io/bootstrap/) finished.
212
+ *
213
213
  * Can be either JS module file or async function:
214
214
  *
215
215
  * ```js
@@ -220,16 +220,16 @@ declare namespace CodeceptJS {
220
220
  * teardown: 'teardown.js',
221
221
  * ```
222
222
  */
223
- teardown?: () => Promise<void> | boolean | string;
223
+ teardown?: (() => Promise<void>) | boolean | string;
224
224
  /**
225
225
  * [Execute code before launching tests in parallel mode](https://codecept.io/bootstrap/#bootstrapall-teardownall)
226
- *
226
+ *
227
227
  */
228
- bootstrapAll?: () => Promise<void> | boolean | string;
228
+ bootstrapAll?: (() => Promise<void>) | boolean | string;
229
229
  /**
230
230
  * [Execute JS code after finishing tests in parallel mode](https://codecept.io/bootstrap/#bootstrapall-teardownall)
231
231
  */
232
- teardownAll?: () => Promise<void> | boolean | string;
232
+ teardownAll?: (() => Promise<void>) | boolean | string;
233
233
  /** Enable [localized test commands](https://codecept.io/translation/) */
234
234
  translation?: string;
235
235
  /**
@@ -243,8 +243,8 @@ declare namespace CodeceptJS {
243
243
  require?: Array<string>;
244
244
 
245
245
  /**
246
- * Enable [BDD features](https://codecept.io/bdd/#configuration).
247
- *
246
+ * Enable [BDD features](https://codecept.io/bdd/#configuration).
247
+ *
248
248
  * Sample configuration:
249
249
  * ```js
250
250
  * gherkin: {