Skip to content

Commit 6d996b7

Browse files
VorobeykoDavertMikMykhailo BodnarchukArhellGuria
authored
Update by master 2 (#2459)
* updated docs * release 2.6.5 * Fix valid data output (w3) (#2399) * add alt for image UI page (fix w3 validator) (#2403) * docs: fix typo in commands.md (#2405) * remove unnecessary select placeholder from basics.md (#2407) * fix display combination in changelog (#2409) * add description to images (#2412) * Fix android native locator support for appium helper (#2429) * Update mobile.md * Fix android native locator support for appium helper * update the expected result for windows platform especially the absolute path case because in windows, path.resolve returns driver letter * chore: jsdoc color param optional in `I.say` (#2443) * update github links after repository migration (#2447) * Fixed waitNumberOfVisibleElements for Webdriver (#2418) * fix waitNumberOfVisibleElements waitNumberOfVisibleElements returns false everytime as it does not filter the visible element count * fix waitNumberOfVisibleElements waitNumberOfVisibleElements returns false everytime as it does not filter for visible elements * Issue 2434 (handle .indexOf error) (#2436) * Makes suggested changes to have Chromium install * fixes #2434 * fix playwright too Co-authored-by: George Griffiths <[email protected]> * Puppeteer handle page error (#2435) * Makes suggested changes to have Chromium install * handle page crash * handle undefined page * dont open new tab on crash * remove old try catch Co-authored-by: George Griffiths <[email protected]> * Feat: Skip feature (#2427) * Makes suggested changes to have Chromium install * feat: implement skip of features * Add unit tests, docs and type defs * Apply suggestions from code review Co-authored-by: George Griffiths <[email protected]> Co-authored-by: Michael Bodnarchuk <[email protected]> * Release 2.6.6 (#2450) * updated docs * fixed tests & updated linter * updated changelog * fixed mocks Co-authored-by: Davert <[email protected]> Co-authored-by: Mykhailo Bodnarchuk <[email protected]> Co-authored-by: Ihor Sychevskyi <[email protected]> Co-authored-by: Aleksei Gurianov <[email protected]> Co-authored-by: Tanakiat Srisaranyakul <[email protected]> Co-authored-by: Bartosz Wojtkowiak <[email protected]> Co-authored-by: Vijay Venkatesh <[email protected]> Co-authored-by: George Griffiths <[email protected]> Co-authored-by: George Griffiths <[email protected]> Co-authored-by: Michael Bodnarchuk <[email protected]>
1 parent 8fc4323 commit 6d996b7

23 files changed

+321
-169
lines changed

CHANGELOG.md

+14
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,20 @@ tryTo(() => I.click('Accept', '.cookies'));
8787
* Added `test.skipped` event to run-workers, fixing allure reports with skipped tests in workers #2391. Fix #2387 by @koushikmohan1996
8888
* [Playwright] Fixed calling `waitFor*` methods with custom locators #2314. Fix #2389 by @Georgegriff
8989

90+
## 2.6.6
91+
92+
* Puppeteer 4.0 support. Important: MockRequest helper won't work with Puppeter > 3.3
93+
* Added `xFeature` and `Feature.skip` to skip all tests in a suite. By @Georgegriff
94+
* [Appium] Fixed #2428 Android native locator support by @idxn
95+
* [WebDriver] Fixed `waitNumberOfVisibleElements` to actually filter visible elements. By @ilangv
96+
* [Puppeteer] Fixed handling error which is not an Error object. Fixes `cannot read property indexOf of undefined` error. Fix #2436 by @Georgegriff
97+
* [Puppeteer] Print error on page crash by @Georgegriff
98+
99+
## 2.6.5
100+
101+
* Added `test.skipped` event to run-workers, fixing allure reports with skipped tests in workers #2391. Fix #2387 by @koushikmohan1996
102+
* [Playwright] Fixed calling `waitFor*` methods with custom locators #2314. Fix #2389 by @Georgegriff
103+
90104
## 2.6.4
91105

92106
* [Playwright] **Playwright 1.0 support** by @Georgegriff.

docs/basics.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ Tests are written in a synchronous way. This improves the readability and mainta
297297
While writing tests you should not think about promises, and instead should focus on the test scenario.
298298

299299
However, behind the scenes **all actions are wrapped in promises**, inside of the `I` object.
300-
[Global promise](https://github.com/Codeception/CodeceptJS/blob/master/lib/recorder.js) chain is initialized before each test and all `I.*` calls will be appended to it, as well as setup and teardown.
300+
[Global promise](https://github.com/codecept-js/CodeceptJS/blob/master/lib/recorder.js) chain is initialized before each test and all `I.*` calls will be appended to it, as well as setup and teardown.
301301

302302
> 📺 [Learn how CodeceptJS](https://www.youtube.com/watch?v=MDLLpHAwy_s) works with promises by watching video on YouTube
303303
@@ -617,7 +617,7 @@ AfterSuite((I) => {
617617
});
618618
```
619619

620-
[Here are some ideas](https://github.com/Codeception/CodeceptJS/pull/231#issuecomment-249554933) on where to use BeforeSuite hooks.
620+
[Here are some ideas](https://github.com/codecept-js/CodeceptJS/pull/231#issuecomment-249554933) on where to use BeforeSuite hooks.
621621

622622
## Within
623623

@@ -798,7 +798,11 @@ Also, you can use `within` inside a session, but you can't call session from ins
798798
Like in Mocha you can use `x` and `only` to skip tests or to run a single test.
799799
800800
* `xScenario` - skips current test
801+
* `Scenario.skip` - skips current test
801802
* `Scenario.only` - executes only the current test
803+
* `xFeature` - skips current suite <Badge text="Since 2.6.6" type="warning"/>
804+
* `Feature.skip` - skips the current suite <Badge text="Since 2.6.6" type="warning"/>
805+
802806
803807
## Todo Test <Badge text="Since 2.4" type="warning"/>
804808

docs/books.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ editLink: false
77
---
88

99
# Books & Posts
10-
> Add your own books or posts to our [Wiki Page](https://github.com/Codeception/CodeceptJS/wiki/Books-&-Posts)
10+
> Add your own books or posts to our [Wiki Page](https://github.com/codecept-js/CodeceptJS/wiki/Books-&-Posts)
1111
### [Practical End 2 End Testing with CodeceptJS](https://leanpub.com/codeceptjs/)
1212

1313
A book by **Paul Vincent Beigang**
@@ -34,4 +34,4 @@ A list of good educational posts about CodeceptJS
3434
* [Customizing CodeceptJS Skeleton](https://medium.com/@successivetech/codeceptjs-skeleton-9ba86d3b45ec)
3535
* [Running End to End tests as Google Cloud Functions](https://hackernoon.com/running-end-to-end-tests-as-google-cloud-functions-f5e34ffc3984)
3636
* [End-To-End Testing With CodeceptJS](https://www.monterail.com/blog/end-to-end-testing-with-codeceptjs) by Piotr Michalski
37-
* [Getting started with CodeceptJS and Selenium WebDriver](https://medium.com/@garrettvorce/getting-started-with-selenium-and-codeceptjs-c0698e8df677)
37+
* [Getting started with CodeceptJS and Selenium WebDriver](https://medium.com/@garrettvorce/getting-started-with-selenium-and-codeceptjs-c0698e8df677)

docs/changelog.md

+120-111
Large diffs are not rendered by default.

docs/community-helpers.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ editLink: false
55
---
66

77
# Community Helpers
8-
> Share your helpers at our [Wiki Page](https://github.com/Codeception/CodeceptJS/wiki/Community-Helpers)
8+
> Share your helpers at our [Wiki Page](https://github.com/codecept-js/CodeceptJS/wiki/Community-Helpers)
99
1010
Here is the list of helpers created by our community.
1111
Please **add your own** by editing this page.
@@ -47,4 +47,4 @@ Please **add your own** by editing this page.
4747

4848
## Other
4949

50-
* [eslint-plugin-codeceptjs](https://www.npmjs.com/package/eslint-plugin-codeceptjs) Eslint rules for CodeceptJS.
50+
* [eslint-plugin-codeceptjs](https://www.npmjs.com/package/eslint-plugin-codeceptjs) Eslint rules for CodeceptJS.

docs/custom-helpers.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ helpers: {
3636
}
3737
```
3838

39-
Helpers are ES6 classes inherited from [corresponding abstract class](https://github.com/Codeception/CodeceptJS/blob/master/lib/helper.js).
39+
Helpers are ES6 classes inherited from [corresponding abstract class](https://github.com/codecept-js/CodeceptJS/blob/master/lib/helper.js).
4040
Generated Helper will be added to `codecept.conf.js` config file. It should look like this:
4141

4242
```js

docs/examples.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ editLink: false
77
---
88

99
# Examples
10-
> Add your own examples to our [Wiki Page](https://github.com/Codeception/CodeceptJS/wiki/Examples)
10+
> Add your own examples to our [Wiki Page](https://github.com/codecept-js/CodeceptJS/wiki/Examples)
1111
## [TodoMVC Examples](https://github.com/codecept-js/examples)
1212

1313
![](https://github.com/codecept-js/examples/raw/master/todo.png)
@@ -23,7 +23,7 @@ Tests repository demonstrate usage of
2323
* PageObjects
2424
* Cucumber syntax
2525

26-
## [Basic Examples](https://github.com/Codeception/CodeceptJS/tree/master/examples)
26+
## [Basic Examples](https://github.com/codecept-js/CodeceptJS/tree/master/examples)
2727

2828
CodeceptJS repo contains basic tests (both failing and passing) just to show how it works.
2929
Our team uses it to test new features and run simple scenarios.
@@ -145,4 +145,4 @@ This is a ready to use example that shows how to integrate CodeceptJS with Puppe
145145
* puppeteer helper example
146146
* test steps, pages, fragments
147147
* examples for sequential and parallel execution
148-
* generation of allure test results
148+
* generation of allure test results

docs/hooks.md

+14-14
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ module.exports = {
240240

241241
Plugins allow to use CodeceptJS internal API to extend functionality. Use internal event dispatcher, container, output, promise recorder, to create your own reporters, test listeners, etc.
242242

243-
CodeceptJS includes [built-in plugins](/plugins/) which extend basic functionality and can be turned on and off on purpose. Taking them as [examples](https://github.com/Codeception/CodeceptJS/tree/master/lib/plugin) you can develop your custom plugins.
243+
CodeceptJS includes [built-in plugins](/plugins/) which extend basic functionality and can be turned on and off on purpose. Taking them as [examples](https://github.com/codecept-js/CodeceptJS/tree/master/lib/plugin) you can develop your custom plugins.
244244

245245
A plugin is a basic JS module returning a function. Plugins can have individual configs which are passed into this function:
246246

@@ -255,7 +255,7 @@ module.exports = function(config) {
255255
}
256256
```
257257

258-
Plugin can register event listeners or hook into promise chain with recorder. See [API reference](https://github.com/Codeception/CodeceptJS/tree/master/lib/helper).
258+
Plugin can register event listeners or hook into promise chain with recorder. See [API reference](https://github.com/codecept-js/CodeceptJS/tree/master/lib/helper).
259259

260260
To enable your custom plugin in config add it to `plugins` section. Specify path to node module using `require`.
261261

@@ -332,21 +332,21 @@ module.exports = function(options) {
332332
CodeceptJS provides an API which can be loaded via `require('codeceptjs')` when CodeceptJS is installed locally.
333333
These internal objects are available:
334334

335-
* [`codecept`](https://github.com/Codeception/CodeceptJS/blob/master/lib/codecept.js): test runner class
336-
* [`config`](https://github.com/Codeception/CodeceptJS/blob/master/lib/config.js): current codecept config
337-
* [`event`](https://github.com/Codeception/CodeceptJS/blob/master/lib/event.js): event listener
338-
* [`recorder`](https://github.com/Codeception/CodeceptJS/blob/master/lib/recorder.js): global promise chain
339-
* [`output`](https://github.com/Codeception/CodeceptJS/blob/master/lib/output.js): internal printer
340-
* [`container`](https://github.com/Codeception/CodeceptJS/blob/master/lib/container.js): dependency injection container for tests, includes current helpers and support objects
341-
* [`helper`](https://github.com/Codeception/CodeceptJS/blob/master/lib/helper.js): basic helper class
342-
* [`actor`](https://github.com/Codeception/CodeceptJS/blob/master/lib/actor.js): basic actor (I) class
335+
* [`codecept`](https://github.com/codecept-js/CodeceptJS/blob/master/lib/codecept.js): test runner class
336+
* [`config`](https://github.com/codecept-js/CodeceptJS/blob/master/lib/config.js): current codecept config
337+
* [`event`](https://github.com/codecept-js/CodeceptJS/blob/master/lib/event.js): event listener
338+
* [`recorder`](https://github.com/codecept-js/CodeceptJS/blob/master/lib/recorder.js): global promise chain
339+
* [`output`](https://github.com/codecept-js/CodeceptJS/blob/master/lib/output.js): internal printer
340+
* [`container`](https://github.com/codecept-js/CodeceptJS/blob/master/lib/container.js): dependency injection container for tests, includes current helpers and support objects
341+
* [`helper`](https://github.com/codecept-js/CodeceptJS/blob/master/lib/helper.js): basic helper class
342+
* [`actor`](https://github.com/codecept-js/CodeceptJS/blob/master/lib/actor.js): basic actor (I) class
343343

344-
[API reference](https://github.com/Codeception/CodeceptJS/tree/master/docs/api) is available on GitHub.
344+
[API reference](https://github.com/codecept-js/CodeceptJS/tree/master/docs/api) is available on GitHub.
345345
Also please check the source code of corresponding modules.
346346

347347
### Event Listeners
348348

349-
CodeceptJS provides a module with [event dispatcher and set of predefined events](https://github.com/Codeception/CodeceptJS/blob/master/lib/event.js).
349+
CodeceptJS provides a module with [event dispatcher and set of predefined events](https://github.com/codecept-js/CodeceptJS/blob/master/lib/event.js).
350350

351351
It can be required from codeceptjs package if it is installed locally.
352352

@@ -389,7 +389,7 @@ Available events:
389389
* *sync* - means that event is fired in the moment of action happens.
390390
* *async* - means that event is fired when an actions is scheduled. Use `recorder` to schedule your actions.
391391

392-
For further reference look for [currently available listeners](https://github.com/Codeception/CodeceptJS/tree/master/lib/listener) using event system.
392+
For further reference look for [currently available listeners](https://github.com/codecept-js/CodeceptJS/tree/master/lib/listener) using event system.
393393

394394
#### Test Object
395395

@@ -421,7 +421,7 @@ Step events provide step objects with following fields:
421421

422422
### Recorder
423423

424-
To inject asynchronous functions in a test or before/after a test you can subscribe to corresponding event and register a function inside a recorder object. [Recorder](https://github.com/Codeception/CodeceptJS/blob/master/lib/recorder.js) represents a global promises chain.
424+
To inject asynchronous functions in a test or before/after a test you can subscribe to corresponding event and register a function inside a recorder object. [Recorder](https://github.com/codecept-js/CodeceptJS/blob/master/lib/recorder.js) represents a global promises chain.
425425

426426
Provide a function description as a first parameter, function should return a promise:
427427

docs/locators.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -301,4 +301,4 @@ New locator strategy is ready to use:
301301
I.click('=Login');
302302
```
303303
304-
> For more details on locator object see [Locator](https://github.com/Codeception/CodeceptJS/blob/master/lib/locator.js) class implementation.
304+
> For more details on locator object see [Locator](https://github.com/codecept-js/CodeceptJS/blob/master/lib/locator.js) class implementation.

docs/translation.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ title: Translation
1010
Test output and the way tests are written can be localized.
1111
This way scenarios can be written in almost native language using UTF support of JavaScript.
1212
If you have non-English team and you work on non-English project consider enabling translation
13-
by setting translation to [one of available languages](https://github.com/Codeception/CodeceptJS/blob/master/translations).
13+
by setting translation to [one of available languages](https://github.com/codecept-js/CodeceptJS/blob/master/translations).
1414

1515
Please refer to translated steps inside translation files and send Pull Requests to add missing.
1616

docs/videos.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ title: Videos
66
editLink: false
77
---
88

9-
> Add your own videos to our [Wiki Page](https://github.com/Codeception/CodeceptJS/wiki/Videos)
9+
> Add your own videos to our [Wiki Page](https://github.com/codecept-js/CodeceptJS/wiki/Videos)
1010
[![Maxresdefault](http://i3.ytimg.com/vi/BRMWstiOTks/maxresdefault.jpg)](https://www.youtube.com/watch?v=BRMWstiOTks)
1111

1212
* ## [An Introduction, Getting started and working with CodeceptJS & Puppeteer (EAWeekend)](https://www.youtube.com/watch?v=BRMWstiOTks)

lib/cli.js

+19-4
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ class Cli extends Base {
4848
});
4949

5050
runner.on('pending', (test) => {
51+
if (test.parent && test.parent.pending) {
52+
const suite = test.parent;
53+
const skipInfo = suite.opts.skipInfo || {};
54+
skipTestConfig(test, skipInfo.message);
55+
}
5156
this.loadedTests.push(test.id);
5257
cursor.CR();
5358
output.test.skipped(test);
@@ -101,10 +106,7 @@ class Cli extends Base {
101106
if (!test.opts.skipInfo) {
102107
test.opts.skipInfo = {};
103108
}
104-
test.opts.skipInfo.message = 'Skipped due to failure in \'before\' hook';
105-
test.opts.skipInfo.isFastSkipped = true;
106-
event.emit(event.test.skipped, test);
107-
test.state = 'skipped';
109+
skipTestConfig(test, 'Skipped due to failure in \'before\' hook');
108110
output.test.skipped(test);
109111
skippedCount += 1;
110112
}
@@ -193,6 +195,19 @@ function matchTest(grep, test) {
193195
return true;
194196
}
195197

198+
function skipTestConfig(test, message) {
199+
if (!test.opts) {
200+
test.opts = {};
201+
}
202+
if (!test.opts.skipInfo) {
203+
test.opts.skipInfo = {};
204+
}
205+
test.opts.skipInfo.message = test.opts.skipInfo.message || message;
206+
test.opts.skipInfo.isFastSkipped = true;
207+
event.emit(event.test.skipped, test);
208+
test.state = 'skipped';
209+
}
210+
196211
module.exports = function (runner, opts) {
197212
return new Cli(runner, opts);
198213
};

lib/command/workers/runTests.js

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const { tryOrDefault } = require('../../utils');
1616
// eslint-disable-next-line no-unused-vars
1717
let stdout = '';
1818
/* eslint-enable no-unused-vars */
19+
const stderr = '';
1920

2021
// Requiring of Codecept need to be after tty.getWindowSize is available.
2122
const Codecept = require(process.env.CODECEPT_CLASS_PATH || '../../codecept');

lib/helper/Playwright.js

+9-3
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,13 @@ class Playwright extends Helper {
300300
async _before() {
301301
recorder.retry({
302302
retries: 5,
303-
when: err => err.message.indexOf('context') > -1, // ignore context errors
303+
when: err => {
304+
if (!err || typeof (err.message) !== 'string') {
305+
return false;
306+
}
307+
// ignore context errors
308+
return err.message.includes('context');
309+
},
304310
});
305311
if (this.options.restart && !this.options.manualStart) return this._startBrowser();
306312
if (!this.isRunning && !this.options.manualStart) return this._startBrowser();
@@ -1867,7 +1873,7 @@ class Playwright extends Helper {
18671873
return currUrl.indexOf(urlPart) > -1;
18681874
}, urlPart, { timeout: waitTimeout }).catch(async (e) => {
18691875
const currUrl = await this._getPageUrl(); // Required because the waitForFunction can't return data.
1870-
if (/failed: timeout/i.test(e.message)) {
1876+
if (/Timeout/i.test(e.message)) {
18711877
throw new Error(`expected url to include ${urlPart}, but found ${currUrl}`);
18721878
} else {
18731879
throw e;
@@ -1891,7 +1897,7 @@ class Playwright extends Helper {
18911897
return currUrl.indexOf(urlPart) > -1;
18921898
}, urlPart, { timeout: waitTimeout }).catch(async (e) => {
18931899
const currUrl = await this._getPageUrl(); // Required because the waitForFunction can't return data.
1894-
if (/failed: timeout/i.test(e.message)) {
1900+
if (/Timeout/i.test(e.message)) {
18951901
throw new Error(`expected url to be ${urlPart}, but found ${currUrl}`);
18961902
} else {
18971903
throw e;

lib/helper/Puppeteer.js

+17-1
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,13 @@ class Puppeteer extends Helper {
249249
this.sessionPages = {};
250250
recorder.retry({
251251
retries: 5,
252-
when: err => err.message.indexOf('context') > -1, // ignore context errors
252+
when: err => {
253+
if (!err || typeof (err.message) !== 'string') {
254+
return false;
255+
}
256+
// ignore context errors
257+
return err.message.includes('context');
258+
},
253259
});
254260
if (this.options.restart && !this.options.manualStart) return this._startBrowser();
255261
if (!this.isRunning && !this.options.manualStart) return this._startBrowser();
@@ -418,6 +424,7 @@ class Puppeteer extends Helper {
418424
async _setPage(page) {
419425
page = await page;
420426
this._addPopupListener(page);
427+
this._addErrorListener(page);
421428
this.page = page;
422429
if (!page) return;
423430
page.setDefaultNavigationTimeout(this.options.getPageTimeout);
@@ -427,6 +434,15 @@ class Puppeteer extends Helper {
427434
}
428435
}
429436

437+
async _addErrorListener(page) {
438+
if (!page) {
439+
return;
440+
}
441+
page.on('error', async (error) => {
442+
console.error('Puppeteer page error', error);
443+
});
444+
}
445+
430446
/**
431447
* Add the 'dialog' event listener to a page
432448
* @page {Puppeteer.Page}

lib/helper/WebDriver.js

+2
Original file line numberDiff line numberDiff line change
@@ -2203,6 +2203,7 @@ class WebDriver extends Helper {
22032203
let selected = await forEachAsync(res, async el => el.isDisplayed());
22042204

22052205
if (!Array.isArray(selected)) selected = [selected];
2206+
selected = selected.filter(val => val === true);
22062207
return selected.length === num;
22072208
}, aSec * 1000, `The number of elements (${new Locator(locator)}) is not ${num} after ${aSec} sec`);
22082209
}
@@ -2212,6 +2213,7 @@ class WebDriver extends Helper {
22122213
let selected = await forEachAsync(res, async el => el.isDisplayed());
22132214

22142215
if (!Array.isArray(selected)) selected = [selected];
2216+
selected = selected.filter(val => val === true);
22152217
return selected.length === num;
22162218
}, { timeout: aSec * 1000, timeoutMsg: `The number of elements (${new Locator(locator)}) is not ${num} after ${aSec} sec` });
22172219
}

lib/ui.js

+19
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,28 @@ module.exports = function (suite) {
114114
suite.beforeAll('codeceptjs.beforeSuite', () => scenario.suiteSetup(suite));
115115
afterAllHooks.push(['codeceptjs.afterSuite', () => scenario.suiteTeardown(suite)]);
116116

117+
if (opts.skipInfo && opts.skipInfo.skipped) {
118+
suite.pending = true;
119+
suite.opts = { ...suite.opts, skipInfo: opts.skipInfo };
120+
}
121+
117122
return new FeatureConfig(suite);
118123
};
119124

125+
/**
126+
* Pending test suite.
127+
* @global
128+
* @kind constant
129+
* @type {CodeceptJS.IFeature}
130+
*/
131+
context.xFeature = context.Feature.skip = function (title, opts) {
132+
const skipInfo = {
133+
skipped: true,
134+
message: 'Skipped due to "skip" on Feature.',
135+
};
136+
return context.Feature(title, { ...opts, skipInfo });
137+
};
138+
120139
context.BeforeSuite = function (fn) {
121140
suites[0].beforeAll('BeforeSuite', scenario.injected(fn, suites[0], 'beforeSuite'));
122141
};

0 commit comments

Comments
 (0)