Repository: Codeception/CodeceptJS
Pull request #1054 (2018-05-08 11:33:14)

Prepare 1.2.0

codacy-bot: 
![Codacy](https://app.codacy.com/assets/images/favicon.png) Here is an overview of what got changed by this pull request:


```diff

Clones removed
==============
+ lib/listener/config.js  -10
         
```


See the complete overview on [Codacy](https://app.codacy.com/app/DavertMik/CodeceptJS/pullRequest?prid=1624414&bid=7258048)
        
codacy-bot: 
![Codacy](https://app.codacy.com/assets/images/favicon.png) Here is an overview of what got changed by this pull request:


```diff

Clones removed
==============
+ lib/listener/config.js  -10
         
```


See the complete overview on [Codacy](https://app.codacy.com/app/DavertMik/CodeceptJS/pullRequest?prid=1624414&bid=7258048)
        
codacy-bot: 
![Codacy](https://app.codacy.com/assets/images/favicon.png) Here is an overview of what got changed by this pull request:


```diff

Clones removed
==============
+ lib/listener/config.js  -10
         
```


See the complete overview on [Codacy](https://app.codacy.com/app/DavertMik/CodeceptJS/pullRequest?prid=1624414&bid=7258048)
        
codacy-bot: 
![Codacy](https://app.codacy.com/assets/images/favicon.png) Here is an overview of what got changed by this pull request:


```diff

Clones removed
==============
+ lib/listener/config.js  -10
         
```


See the complete overview on [Codacy](https://app.codacy.com/app/DavertMik/CodeceptJS/pullRequest?prid=1624414&bid=7258048)
        

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b1e05524..442b78bb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,63 @@
+## 1.2.0
+
+* [Multiple Sessions](https://codecept.io/acceptance/#multiple-sessions). Run several browser sessions in one test. Introduced `session` command, which opens additional browser window and closes it after a test.
+
+```js
+Scenario('run in different browsers', (I) => {
+  I.amOnPage('/hello');
+  I.see('Hello!');
+  session('john', () => {
+    I.amOnPage('/bye');
+    I.dontSee('Hello');
+    I.see('Bye');
+  });
+  I.see('Hello');
+});
+```
+
+* [Parallel Execution](https://codecept.io/advanced/#chunks) by @sveneisenschmidt. Run tests in parallel specifying number of chunks:
+
+```js
+"multiple": {
+  "parallel": {
+    // run in 2 processes
+    "chunks": 2,
+    // run all tests in chrome
+    "browsers": ["chrome"]
+  },
+}
+```
+
+* [Locator Builder](https://codecept.io/locators). Write complex locators with simplest API combining CSS and XPath:
+
+```js
+// select 'Edit' link inside 2nd row of a table
+locate('//table')
+  .find('tr')
+  .at(2)
+  .find('a')
+  .withText('Edit');
+```
+
+* [Dynamic configuration](https://codecept.io/advanced/#dynamic-configuration) to update helpers config per test or per suite.
+* Added `event.test.finished` which fires synchronously for both failed and passed tests.
+* Added scenario and feature configuration via fluent API
+
+```js
+Feature('checkout')
+  .timeout(3000)
+  .retry(2);
+
+Scenario('user can order in firefox', (I) => {
+  // see dynamic configuration
+}).config({ browser: 'firefox' })
+  .timeout(20000);
+
+Scenario('this test should throw error', (I) => {
+  // I.amOnPage
+}).throws(new Error);
+```
+
 ## 1.1.8
 
 * Fixed generating TypeScript definitions with `codeceptjs def`.
diff --git a/docs/acceptance.md b/docs/acceptance.md
index 2a2e7469..2c465917 100644
--- a/docs/acceptance.md
+++ b/docs/acceptance.md
@@ -265,7 +265,7 @@ within({frame: [".content", "#editor"]}, () => {
 
 ## Multiple Sessions
 
-*Note: Currently multiple sessions works only in WebDriverIO and Protractor*
+*Note: Currently multiple sessions work only in WebDriverIO and Protractor*
 
 CodeceptJS allows to run several browser sessions inside a test. This can be useful for testing communication between users inside a system, for instance in chats. To open another browser use `session()` function as shown in example:
 
diff --git a/docs/advanced.md b/docs/advanced.md
index e6161acf..3532fa89 100644
--- a/docs/advanced.md
+++ b/docs/advanced.md
@@ -1,53 +1,5 @@
 # Advanced Usage
 
-## Dynamic Configuration
-
-Helpers can be reconfigured per scenario or per feature.
-This might be useful when some tests should be executed with different settings than others.
-In order to reconfigure tests use `.config()` method of `Scenario` or `Feature`.
-
-```js
-Scenario('should be executed in firefox', (I) => {
-  // I.amOnPage(..)
-}).config({ browser: 'firefox' })
-```
-
-In this case `config` overrides current config of the first helper.
-To change config of specific helper pass two arguments: helper name and config values:
-
-```js
-Scenario('should create data via v2 version of API', (I) => {
-  // I.amOnPage(..)
-}).config('REST', { endpoint: 'https://api.mysite.com/v2' })
-```
-
-<<<<<<< HEAD
-=======
-Config can also be set by a function, in this case you can get a test object and specify config values based on it.
-This is very useful when running tests against cloud providers, like BrowserStack.
-
-```js
-Scenario('should report to BrowserStack', (I) => {
-  // I.amOnPage(..)
-}).config((test) => {
-  return { desiredCapabilities: {
-    project: test.suite.title,
-    name: test.title,
-  }}
-});
-```
-
->>>>>>> dynamic-config
-Config changes can be applied to all tests in suite:
-
-```js
-Feature('Admin Panel').config({ url: 'https://mysite.com/admin' });
-```
-
-Please note that some config changes can't be applied on the fly. For instance, if you set `restart: false` in your config and then changing value `browser` won't take an effect as browser is already started and won't be closed untill all tests finish.
-
-Configuration changes will be reverted after a test or a suite.
-
 ## Data Driven Tests
 
 Execute the same scenario on a different data set.
@@ -284,4 +236,49 @@ Passing a function will enable you to provide your own chunking algorithm. The f
 
 Note: Chunking will be most effective if you have many individual test files that contain only a small amount of scenarios. Otherwise the combined execution time of many scenarios or big scenarios in one single test file potentially lead to an uneven execution time.
 
+## Dynamic Configuration
+
+Helpers can be reconfigured per scenario or per feature.
+This might be useful when some tests should be executed with different settings than others.
+In order to reconfigure tests use `.config()` method of `Scenario` or `Feature`.
+
+```js
+Scenario('should be executed in firefox', (I) => {
+  // I.amOnPage(..)
+}).config({ browser: 'firefox' })
+```
+
+In this case `config` overrides current config of the first helper.
+To change config of specific helper pass two arguments: helper name and config values:
+
+```js
+Scenario('should create data via v2 version of API', (I) => {
+  // I.amOnPage(..)
+}).config('REST', { endpoint: 'https://api.mysite.com/v2' })
+```
+
+Config can also be set by a function, in this case you can get a test object and specify config values based on it.
+This is very useful when running tests against cloud providers, like BrowserStack.
+
+```js
+Scenario('should report to BrowserStack', (I) => {
+  // I.amOnPage(..)
+}).config((test) => {
+  return { desiredCapabilities: {
+    project: test.suite.title,
+    name: test.title,
+  }}
+});
+```
+
+Config changes can be applied to all tests in suite:
+
+```js
+Feature('Admin Panel').config({ url: 'https://mysite.com/admin' });
+```
+
+Please note that some config changes can't be applied on the fly. For instance, if you set `restart: false` in your config and then changing value `browser` won't take an effect as browser is already started and won't be closed untill all tests finish.
+
+Configuration changes will be reverted after a test or a suite.
+
 ## done()
diff --git a/docs/api/helper.md b/docs/api/helper.md
index 12cf7090..9933a982 100644
--- a/docs/api/helper.md
+++ b/docs/api/helper.md
@@ -72,6 +72,14 @@ Hook executed after each passed test
 
 -   `test` **Any** 
 
+## _setConfig
+
+Sets config for current test
+
+**Parameters**
+
+-   `opts`  
+
 ## _test
 
 Hook provides a test details
@@ -81,6 +89,14 @@ Executed in the very beginning of a test
 
 -   `test` **Any** 
 
+## _validateConfig
+
+Abstract method to validate config
+
+**Parameters**
+
+-   `config` **Any** 
+
 ## debug
 
 Print debug message to console (outputs only in debug mode)
diff --git a/docs/helpers/Appium.md b/docs/helpers/Appium.md
index 0ffadf1a..f46ce675 100644
--- a/docs/helpers/Appium.md
+++ b/docs/helpers/Appium.md
@@ -434,7 +434,7 @@ I.runInWeb(() => {
 
 ## runOnAndroid
 
-Execute code only on iOS
+Execute code only on Android
 
 ```js
 I.runOnAndroid(() => {
diff --git a/docs/helpers/Nightmare.md b/docs/helpers/Nightmare.md
index 5703ba58..8fc67f49 100644
--- a/docs/helpers/Nightmare.md
+++ b/docs/helpers/Nightmare.md
@@ -299,7 +299,7 @@ By passing value to `done()` function you can return values.
 Additional arguments can be passed as well, while `done` function is always last parameter in arguments list.
 
 ```js
-let val = yield I.executeAsyncScript(function(url, done) {
+let val = await I.executeAsyncScript(function(url, done) {
 // in browser context
 $.ajax(url, { success: (data) => done(data); }
 }, 'http://ajax.callback.url/');
diff --git a/docs/helpers/Protractor.md b/docs/helpers/Protractor.md
index cf8e03f2..14051477 100644
--- a/docs/helpers/Protractor.md
+++ b/docs/helpers/Protractor.md
@@ -20,6 +20,7 @@ This helper should be configured in codecept.json
 -   `keepBrowserState` (optional, default: false)  - keep browser state between tests when `restart` set to false.
 -   `seleniumAddress` - Selenium address to connect (default: <http://localhost:4444/wd/hub>)
 -   `rootElement` - Root element of AngularJS application (default: body)
+-   `getPageTimeout` (optional) sets default timeout for a page to be loaded. 10000 by default.
 -   `waitForTimeout`: (optional) sets default wait time in _ms_ for all `wait*` functions. 1000 by default.
 -   `scriptsTimeout`: (optional) timeout in milliseconds for each script run on the browser, 10000 by default.
 -   `windowSize`: (optional) default window size. Set to `maximize` or a dimension in the format `640x480`.
@@ -444,7 +445,7 @@ By passing value to `done()` function you can return values.
 Additional arguments can be passed as well, while `done` function is always last parameter in arguments list.
 
 ```js
-let val = yield I.executeAsyncScript(function(url, done) {
+let val = await I.executeAsyncScript(function(url, done) {
 // in browser context
 $.ajax(url, { success: (data) => done(data); }
 }, 'http://ajax.callback.url/');
diff --git a/docs/helpers/Puppeteer.md b/docs/helpers/Puppeteer.md
index 72a1860b..3d13cd2b 100644
--- a/docs/helpers/Puppeteer.md
+++ b/docs/helpers/Puppeteer.md
@@ -420,7 +420,7 @@ By passing value to `done()` function you can return values.
 Additional arguments can be passed as well, while `done` function is always last parameter in arguments list.
 
 ```js
-let val = yield I.executeAsyncScript(function(url, done) {
+let val = await I.executeAsyncScript(function(url, done) {
 // in browser context
 $.ajax(url, { success: (data) => done(data); }
 }, 'http://ajax.callback.url/');
diff --git a/docs/helpers/WebDriverIO.md b/docs/helpers/WebDriverIO.md
index 3ec440b5..538c8405 100644
--- a/docs/helpers/WebDriverIO.md
+++ b/docs/helpers/WebDriverIO.md
@@ -537,7 +537,7 @@ Example: In Vue.js to make components completely rendered we are waiting for [ne
 
 ```js
 I.executeAsyncScript(function(done) {
-  Vue.nextTick(done); // waiting for next tick
+Vue.nextTick(done); // waiting for next tick
 });
 ```
 
@@ -545,11 +545,9 @@ By passing value to `done()` function you can return values.
 Additional arguments can be passed as well, while `done` function is always last parameter in arguments list.
 
 ```js
-let val = yield I.executeAsyncScript(function(url, done) {
-  // in browser context
-  $.ajax(url, {
-    success: (data) => done(data);
-  }
+let val = await I.executeAsyncScript(function(url, done) {
+// in browser context
+$.ajax(url, { success: (data) => done(data); }
 }, 'http://ajax.callback.url/');
 ```
 
@@ -569,8 +567,8 @@ Example with jQuery DatePicker:
 ```js
 // change date of jQuery DatePicker
 I.executeScript(function() {
-  // now we are inside browser context
-  $('date').datetimepicker('setDate', new Date());
+// now we are inside browser context
+$('date').datetimepicker('setDate', new Date());
 });
 ```
 
@@ -578,8 +576,8 @@ Can return values. Don't forget to use `yield` to get them.
 
 ```js
 let date = yield I.executeScript(function(el) {
-  // only basic types can be returned
-  return $(el).datetimepicker('getDate').toString();
+// only basic types can be returned
+return $(el).datetimepicker('getDate').toString();
 }, '#date'); // passing jquery selector
 ```
 
@@ -1419,44 +1417,6 @@ I.waitUrlEquals('http://127.0.0.1:8000/info');
 -   `urlPart`  
 -   `sec`   (optional, default `null`)
 
-# filterAsync
-
-Mimic Array.filter() API, but with an async callback function.
-Execute each callback on each array item serially. Useful when using WebDriverIO API.
-
-Added due because of problem with chrome driver when too many requests
-are made simultaneously. <https://bugs.chromium.org/p/chromedriver/issues/detail?id=2152#c9>
-
-**Parameters**
-
--   `array` **Array&lt;object&gt;** Input array items to iterate over
--   `callback` **function** Async function to excute on each array item
--   `option` **object** Additional options. 'extractValue' will extract the .value object from a WebdriverIO
-
-# forEachAsync
-
-Mimic Array.forEach() API, but with an async callback function.
-Execute each callback on each array item serially. Useful when using WebDriverIO API.
-
-Added due because of problem with chrome driver when too many requests
-are made simultaneously. <https://bugs.chromium.org/p/chromedriver/issues/detail?id=2152#c9>
-
-**Parameters**
-
--   `array` **Array&lt;object&gt;** Input array items to iterate over
--   `callback` **function** Async function to excute on each array item
--   `option` **object** Additional options. 'extractValue' will extract the .value object from a WebdriverIO
-
 # locator
 
 just press button if no selector is given
-
-# unify
-
-Internal helper method to handle command results (similar behaviour as the unify function from WebDriverIO
-except it does not resolve promises)
-
-**Parameters**
-
--   `items` **Array&lt;object&gt;** list of items
--   `option` **[object]** extractValue: set to try to return the .value property of the input items
diff --git a/docs/webapi/executeAsyncScript.mustache b/docs/webapi/executeAsyncScript.mustache
index 2a394806..4038f138 100644
--- a/docs/webapi/executeAsyncScript.mustache
+++ b/docs/webapi/executeAsyncScript.mustache
@@ -13,9 +13,9 @@ By passing value to `done()` function you can return values.
 Additional arguments can be passed as well, while `done` function is always last parameter in arguments list.
 
 ```js
-let val = yield I.executeAsyncScript(function(url, done) {
- // in browser context
- $.ajax(url, { success: (data) => done(data); }
+let val = await I.executeAsyncScript(function(url, done) {
+  // in browser context
+  $.ajax(url, { success: (data) => done(data); }
 }, 'http://ajax.callback.url/');
 ```
 
diff --git a/lib/container.js b/lib/container.js
index 9f666e91..f58ceed1 100644
--- a/lib/container.js
+++ b/lib/container.js
@@ -1,7 +1,7 @@
 const path = require('path');
 const fileExists = require('./utils').fileExists;
 const Translation = require('./translation');
-const MochaFactory = require('./mocha_factory');
+const MochaFactory = require('./mochaFactory');
 const recorder = require('./recorder');
 
 let container = {
diff --git a/lib/helper/WebDriverIO.js b/lib/helper/WebDriverIO.js
index 698af281..32a2eeb3 100644
--- a/lib/helper/WebDriverIO.js
+++ b/lib/helper/WebDriverIO.js
@@ -1846,18 +1846,16 @@ async function proceedSee(assertType, text, context, strict = false) {
   return stringIncludes(description)[assertType](text, selected);
 }
 
+// Mimic Array.forEach() API, but with an async callback function.
+// Execute each callback on each array item serially. Useful when using WebDriverIO API.
+//
+// Added due because of problem with chrome driver when too many requests
+// are made simultaneously. https://bugs.chromium.org/p/chromedriver/issues/detail?id=2152#c9
+//
+// @param {object[]} array Input array items to iterate over
+// @param {function} callback Async function to excute on each array item
+// @param {object} option Additional options. 'extractValue' will extract the .value object from a WebdriverIO
 async function forEachAsync(array, callback, option = {}) {
-  /**
-   * Mimic Array.forEach() API, but with an async callback function.
-   * Execute each callback on each array item serially. Useful when using WebDriverIO API.
-   *
-   * Added due because of problem with chrome driver when too many requests
-   * are made simultaneously. https://bugs.chromium.org/p/chromedriver/issues/detail?id=2152#c9
-   *
-   * @param {object[]} array Input array items to iterate over
-   * @param {function} callback Async function to excute on each array item
-   * @param {object} option Additional options. 'extractValue' will extract the .value object from a WebdriverIO
-   */
   const {
     extractValue = true,
     unify: unifyResults = true,
@@ -1884,18 +1882,15 @@ async function forEachAsync(array, callback, option = {}) {
   return values;
 }
 
+//  Mimic Array.filter() API, but with an async callback function.
+//  Execute each callback on each array item serially. Useful when using WebDriverIO API.
+//  Added due because of problem with chrome driver when too many requests
+//  are made simultaneously. https://bugs.chromium.org/p/chromedriver/issues/detail?id=2152#c9
+//  @param {object[]} array Input array items to iterate over
+//  @param {function} callback Async function to excute on each array item
+//  @param {object} option Additional options. 'extractValue' will extract the .value object from a WebdriverIO
+//
 async function filterAsync(array, callback, option = {}) {
-  /**
-   * Mimic Array.filter() API, but with an async callback function.
-   * Execute each callback on each array item serially. Useful when using WebDriverIO API.
-   *
-   * Added due because of problem with chrome driver when too many requests
-   * are made simultaneously. https://bugs.chromium.org/p/chromedriver/issues/detail?id=2152#c9
-   *
-   * @param {object[]} array Input array items to iterate over
-   * @param {function} callback Async function to excute on each array item
-   * @param {object} option Additional options. 'extractValue' will extract the .value object from a WebdriverIO
-   */
   const {
     extractValue = true,
   } = option;
@@ -1917,14 +1912,12 @@ async function filterAsync(array, callback, option = {}) {
 }
 
 
+// Internal helper method to handle command results (similar behaviour as the unify function from WebDriverIO
+// except it does not resolve promises)
+//
+// @param  {object[]} items  list of items
+// @param  {object} [option]  extractValue: set to try to return the .value property of the input items
 function unify(items, option = {}) {
-  /**
-   * Internal helper method to handle command results (similar behaviour as the unify function from WebDriverIO
-   * except it does not resolve promises)
-   *
-   * @param  {object[]} items  list of items
-   * @param  {object} [option]  extractValue: set to try to return the .value property of the input items
-   */
   const { extractValue = false } = option;
 
   let result = Array.isArray(items) ? items : [items];
diff --git a/lib/interfaces/featureConfig.js b/lib/interfaces/featureConfig.js
index 0f311d0f..4776e30b 100644
--- a/lib/interfaces/featureConfig.js
+++ b/lib/interfaces/featureConfig.js
@@ -31,12 +31,9 @@ class FeatureConfig {
       obj = helper;
       helper = 0;
     }
-<<<<<<< HEAD
-=======
     if (typeof obj === 'function') {
       obj = obj(this.suite);
     }
->>>>>>> dynamic-config
     if (!this.suite.config) {
       this.suite.config = {};
     }
diff --git a/lib/interfaces/scenarioConfig.js b/lib/interfaces/scenarioConfig.js
index d69df57c..1c2e2e6d 100644
--- a/lib/interfaces/scenarioConfig.js
+++ b/lib/interfaces/scenarioConfig.js
@@ -63,12 +63,9 @@ class ScenarioConfig {
       obj = helper;
       helper = 0;
     }
-<<<<<<< HEAD
-=======
     if (typeof obj === 'function') {
       obj = obj(this.test);
     }
->>>>>>> dynamic-config
     if (!this.test.config) {
       this.test.config = {};
     }
diff --git a/lib/listener/config.js b/lib/listener/config.js
index 06553f93..c6e66e9e 100644
--- a/lib/listener/config.js
+++ b/lib/listener/config.js
@@ -1,11 +1,7 @@
 const event = require('../event');
 const container = require('../container');
 const recorder = require('../recorder');
-<<<<<<< HEAD
-const { deepMerge } = require('../utils');
-=======
 const { deepMerge, ucfirst } = require('../utils');
->>>>>>> dynamic-config
 const { debug } = require('../output');
 /**
  * Enable Helpers to listen to test events
@@ -13,68 +9,6 @@ const { debug } = require('../output');
 module.exports = function () {
   const helpers = container.helpers();
 
-<<<<<<< HEAD
-  event.dispatcher.on(event.suite.before, (suite) => {
-    function updateHelperConfig(helper, config) {
-      const oldConfig = Object.assign({}, helper.options);
-      try {
-        helper._setConfig(deepMerge(Object.assign({}, oldConfig), config));
-        debug(`[Suite Config] ${helper.constructor.name} ${JSON.stringify(config)}`);
-      } catch (err) {
-        recorder.throw(err);
-        return;
-      }
-      event.dispatcher.once(event.suite.after, (t) => {
-        helper._setConfig(oldConfig);
-        debug(`[Suite Config] Reverted for ${helper.constructor.name}`);
-      });
-    }
-
-    // change config
-    if (suite.config) {
-      for (let name in suite.config) {
-        const config = suite.config[name];
-        if (name === '0') { // first helper
-          name = Object.keys(helpers);
-        }
-        const helper = helpers[name];
-        updateHelperConfig(helper, config);
-      }
-    }
-  });
-
-  event.dispatcher.on(event.test.before, (test) => {
-    if (!test) return;
-    function updateHelperConfig(helper, config) {
-      const oldConfig = Object.assign({}, helper.options);
-      try {
-        helper._setConfig(deepMerge(Object.assign({}, oldConfig), config));
-        debug(`[Test Config] ${helper.constructor.name} ${JSON.stringify(config)}`);
-      } catch (err) {
-        recorder.throw(err);
-        return;
-      }
-      event.dispatcher.once(event.test.finished, (t) => {
-        helper._setConfig(oldConfig);
-        debug(`[Test Config] Reverted for ${helper.constructor.name}`);
-      });
-    }
-
-    // change config
-    if (test.config) {
-      for (let name in test.config) {
-        const config = test.config[name];
-        if (name === '0') { // first helper
-          name = Object.keys(helpers);
-        }
-        const helper = helpers[name];
-        updateHelperConfig(helper, config);
-      }
-    }
-  });
-};
-
-=======
   enableDynamicConfigFor('suite');
   enableDynamicConfigFor('test');
 
@@ -109,4 +43,3 @@ module.exports = function () {
     });
   }
 };
->>>>>>> dynamic-config
diff --git a/lib/mocha_factory.js b/lib/mochaFactory.js
similarity index 100%
rename from lib/mocha_factory.js
rename to lib/mochaFactory.js
diff --git a/package.json b/package.json
index a535131a..52a7a15a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "codeceptjs",
-  "version": "1.1.8",
+  "version": "1.2.0",
   "description": "Modern Era Acceptance Testing Framework for NodeJS",
   "keywords": [
     "acceptance",


Test patch:
diff --git a/test/acceptance/1_event_test.js b/test/acceptance/1_event_test.js
index ea3e49ca..dec9e517 100644
--- a/test/acceptance/1_event_test.js
+++ b/test/acceptance/1_event_test.js
@@ -11,7 +11,7 @@ const eventHandlers = require('../data/sandbox/eventHandlers');
 
 const expectedEvents = [];
 
-Feature('Events');
+Feature('Events').retry(3).timeout(10000);
 
 BeforeSuite((I) => {
   expectedEvents.push(...[
diff --git a/test/acceptance/config_test.js b/test/acceptance/config_test.js
index c076f0b0..fdf9bcc4 100644
--- a/test/acceptance/config_test.js
+++ b/test/acceptance/config_test.js
@@ -10,39 +10,26 @@ Scenario('change config 1 @WebDriverIO @Puppeteer @Protractor @Nightmare', (I) =
   I.seeInCurrentUrl('google.com');
 });
 
-<<<<<<< HEAD
-
-=======
->>>>>>> dynamic-config
 Scenario('change config 2 @WebDriverIO @Puppeteer @Protractor @Nightmare', (I) => {
   I.amOnPage('/');
   I.seeInCurrentUrl('github.com');
 }).config({ url: 'https://github.com' });
 
-<<<<<<< HEAD
-
-=======
->>>>>>> dynamic-config
 Scenario('change config 3 @WebDriverIO @Puppeteer @Protractor @Nightmare', (I) => {
   I.amOnPage('/');
   I.dontSeeInCurrentUrl('github.com');
   I.seeInCurrentUrl('google.com');
 });
-<<<<<<< HEAD
-=======
 
 Scenario('change config 4 @WebDriverIO @Puppeteer @Protractor @Nightmare', (I) => {
   I.amOnPage('/');
-  pause();
   I.seeInCurrentUrl('codecept.io');
 }).config((test) => {
   return { url: 'https://codecept.io/', desiredCapabilities: { title: test.title } };
 });
 
-
 Scenario('change config 5 @WebDriverIO @Puppeteer @Protractor @Nightmare', (I) => {
   I.amOnPage('/');
   I.dontSeeInCurrentUrl('github.com');
   I.seeInCurrentUrl('google.com');
 });
->>>>>>> dynamic-config