# Configuration

Based on the [setup type](/docs/setuptypes.md) (e.g. using the raw protocol bindings, WebdriverIO as standalone package or the WDIO testrunner) there is a different set of options available to control the environment.

## WebDriver Options[​](#webdriver-options "Direct link to WebDriver Options")

The following options are defined when using the [`webdriver`](https://www.npmjs.com/package/webdriver) protocol package:

### protocol[​](#protocol "Direct link to protocol")

Protocol to use when communicating with the driver server.

Type: `String`<br />Default: `http`

### hostname[​](#hostname "Direct link to hostname")

Host of your driver server.

Type: `String`<br />Default: `0.0.0.0`

### port[​](#port "Direct link to port")

Port your driver server is on.

Type: `Number`<br />Default: `undefined`

### path[​](#path "Direct link to path")

Path to driver server endpoint.

Type: `String`<br />Default: `/`

### queryParams[​](#queryparams "Direct link to queryParams")

Query parameters that are propagated to the driver server.

Type: `Object`<br />Default: `undefined`

### user[​](#user "Direct link to user")

Your cloud service username (only works for [Sauce Labs](https://saucelabs.com), [Browserstack](https://www.browserstack.com), [TestingBot](https://testingbot.com) or [TestMu AI](https://www.testmuai.com/) accounts). If set, WebdriverIO will automatically set connection options for you. If you don't use a cloud provider this can be used to authenticate any other WebDriver backend.

Type: `String`<br />Default: `undefined`

### key[​](#key "Direct link to key")

Your cloud service access key or secret key (only works for [Sauce Labs](https://saucelabs.com), [Browserstack](https://www.browserstack.com), [TestingBot](https://testingbot.com) or [TestMu AI](https://www.testmuai.com/) accounts). If set, WebdriverIO will automatically set connection options for you. If you don't use a cloud provider this can be used to authenticate any other WebDriver backend.

Type: `String`<br />Default: `undefined`

### capabilities[​](#capabilities "Direct link to capabilities")

Defines the capabilities you want to run in your WebDriver session. Check out the [WebDriver Protocol](https://w3c.github.io/webdriver/#capabilities) for more details. If you run an older driver that doesn't support the WebDriver protocol, you’ll need to use the [JSONWireProtocol capabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities) to successfully run a session.

Next to the WebDriver based capabilities you can apply browser and vendor specific options that allow deeper configuration to the remote browser or device. These are documented in the corresponding vendor docs, e.g.:

* `goog:chromeOptions`: for [Google Chrome](https://chromedriver.chromium.org/capabilities#h.p_ID_106)
* `moz:firefoxOptions`: for [Mozilla Firefox](https://firefox-source-docs.mozilla.org/testing/geckodriver/Capabilities.html)
* `ms:edgeOptions`: for [Microsoft Edge](https://docs.microsoft.com/en-us/microsoft-edge/webdriver-chromium/capabilities-edge-options#using-the-edgeoptions-class)
* `sauce:options`: for [Sauce Labs](https://docs.saucelabs.com/dev/test-configuration-options/#desktop-and-mobile-capabilities-sauce-specific--optional)
* `bstack:options`: for [BrowserStack](https://www.browserstack.com/automate/capabilities?tag=selenium-4#)
* `selenoid:options`: for [Selenoid](https://github.com/aerokube/selenoid/blob/master/docs/special-capabilities.adoc)

Additionally, a useful utility is the Sauce Labs [Automated Test Configurator](https://docs.saucelabs.com/basics/platform-configurator/), which helps you create this object by clicking together your desired capabilities.

Type: `Object`<br />Default: `null`

**Example:**

```
{
    browserName: 'chrome', // options: `chrome`, `edge`, `firefox`, `safari`
    browserVersion: '27.0', // browser version
    platformName: 'Windows 10' // OS platform
}
```

If you’re running web or native tests on mobile devices, `capabilities` differs from the WebDriver protocol. See the [Appium Docs](https://appium.io/docs/en/latest/guides/caps/) for more details.

### logLevel[​](#loglevel "Direct link to logLevel")

Level of logging verbosity.

Type: `String`<br />Default: `info`<br />Options: `trace` | `debug` | `info` | `warn` | `error` | `silent`

### outputDir[​](#outputdir "Direct link to outputDir")

Directory to store all testrunner log files (including reporter logs and `wdio` logs). If not set, all logs are streamed to `stdout`. Since most reporters are made to log to `stdout`, it is recommended to only use this option for specific reporters where it makes more sense to push report into a file (like the `junit` reporter, for example).

When running in standalone mode, the only log generated by WebdriverIO will be the `wdio` log.

Type: `String`<br />Default: `null`

### connectionRetryTimeout[​](#connectionretrytimeout "Direct link to connectionRetryTimeout")

Timeout for any WebDriver request to a driver or grid.

Type: `Number`<br />Default: `120000`

### connectionRetryCount[​](#connectionretrycount "Direct link to connectionRetryCount")

Maximum count of request retries to the Selenium server.

Type: `Number`<br />Default: `3`

### bidiResponseTimeout[​](#bidiresponsetimeout "Direct link to bidiResponseTimeout")

Timeout (in ms) for a WebDriver Bidi command to receive a response from the browser. Increase this if you run commands, e.g. [`execute`](/docs/api/browser/execute.md), that legitimately take longer than the default to resolve, otherwise WebdriverIO gives up waiting before the browser is done.

Type: `Number`<br />Default: `180000`

### agent[​](#agent "Direct link to agent")

Allows you to use a custom` http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests.

Type: `Object`<br />Default:

```
{
    http: new http.Agent({ keepAlive: true }),
    https: new https.Agent({ keepAlive: true })
}
```

### headers[​](#headers "Direct link to headers")

Specify custom `headers` to pass into every WebDriver request. If your Selenium Grid requires Basic Authentification we recommend to pass in an `Authorization` header through this option to authenticate your WebDriver requests, e.g.:

```
import { Buffer } from 'buffer';
// Read the username and password from environment variables
const username = process.env.SELENIUM_GRID_USERNAME;
const password = process.env.SELENIUM_GRID_PASSWORD;

// Combine the username and password with a colon separator
const credentials = `${username}:${password}`;
// Encode the credentials using Base64
const encodedCredentials = Buffer.from(credentials).toString('base64');

export const config: WebdriverIO.Config = {
    // ...
    headers: {
        Authorization: `Basic ${encodedCredentials}`
    }
    // ...
}
```

Type: `Object`<br />Default: `{}`

### transformRequest[​](#transformrequest "Direct link to transformRequest")

Function intercepting [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made

Type: `(RequestOptions) => RequestOptions`<br />Default: *none*

### transformResponse[​](#transformresponse "Direct link to transformResponse")

Function intercepting HTTP response objects after a WebDriver response has arrived. The function is passed the original response object as the first and the corresponding `RequestOptions` as the second argument.

Type: `(Response, RequestOptions) => Response`<br />Default: *none*

### strictSSL[​](#strictssl "Direct link to strictSSL")

Whether it does not require SSL certificate to be valid. It can be set via an environment variables as `STRICT_SSL` or `strict_ssl`.

Type: `Boolean`<br />Default: `true`

### enableDirectConnect[​](#enabledirectconnect "Direct link to enableDirectConnect")

Whether enable [Appium direct connection feature](https://appiumpro.com/editions/86-connecting-directly-to-appium-hosts-in-distributed-environments). It does nothing if the response did not have proper keys while the flag is enabled.

Type: `Boolean`<br />Default: `true`

### cacheDir[​](#cachedir "Direct link to cacheDir")

The path to the root of the cache directory. This directory is used to store all drivers that are downloaded when attempting to start a session.

Type: `String`<br />Default: `process.env.WEBDRIVER_CACHE_DIR || os.tmpdir()`

### maskingPatterns[​](#maskingpatterns "Direct link to maskingPatterns")

For more secure logging, regular expressions set with `maskingPatterns` can obfuscate sensitive information from the log.

* The string format is a regular expression with or without flags (e.g. `/.../i`) and comma-separated for multiple regular expressions.
* For more details on masking patterns, see the [Masking Patterns section in the WDIO Logger README](https://github.com/webdriverio/webdriverio/blob/main/packages/wdio-logger/README.md#masking-patterns).

Type: `String`<br />Default: `undefined`

**Example:**

```
{
    maskingPatterns: '/--key=([^ ]*)/i,/RESULT (.*)/'
}
```

***

## WebdriverIO[​](#webdriverio "Direct link to WebdriverIO")

The following options (including the ones listed above) can be used with WebdriverIO in standalone:

### automationProtocol[​](#automationprotocol "Direct link to automationProtocol")

Define the protocol you want to use for your browser automation. Currently only [`webdriver`](https://www.npmjs.com/package/webdriver) is supported, as it is the main browser automation technology WebdriverIO uses.

If you want to automate the browser using a different automation technology, make you set this property to a path that resolves to a module that adheres to the following interface:

```
import type { Capabilities } from '@wdio/types';
import type { Client, AttachOptions } from 'webdriver';

export default class YourAutomationLibrary {
    /**
     * Start a automation session and return a WebdriverIO [monad](https://github.com/webdriverio/webdriverio/blob/940cd30939864bdbdacb2e94ee6e8ada9b1cc74c/packages/wdio-utils/src/monad.ts)
     * with respective automation commands. See the [webdriver](https://www.npmjs.com/package/webdriver) package
     * as a reference implementation
     *
     * @param {Capabilities.RemoteConfig} options WebdriverIO options
     * @param {Function} hook that allows to modify the client before it gets released from the function
     * @param {PropertyDescriptorMap} userPrototype allows user to add custom protocol commands
     * @param {Function} customCommandWrapper allows to modify the command execution
     * @returns a WebdriverIO compatible client instance
     */
    static newSession(
        options: Capabilities.RemoteConfig,
        modifier?: (...args: any[]) => any,
        userPrototype?: PropertyDescriptorMap,
        customCommandWrapper?: (...args: any[]) => any
    ): Promise<Client>;

    /**
     * allows user to attach to existing sessions
     * @optional
     */
    static attachToSession(
        options?: AttachOptions,
        modifier?: (...args: any[]) => any, userPrototype?: {},
        commandWrapper?: (...args: any[]) => any
    ): Client;

    /**
     * Changes The instance session id and browser capabilities for the new session
     * directly into the passed in browser object
     *
     * @optional
     * @param   {object} instance  the object we get from a new browser session.
     * @returns {string}           the new session id of the browser
     */
    static reloadSession(
        instance: Client,
        newCapabilities?: WebdriverIO.Capabilitie
    ): Promise<string>;
}
```

Type: `String`<br />Default: `webdriver`

### baseUrl[​](#baseurl "Direct link to baseUrl")

Shorten `url` command calls by setting a base URL.

* If your `url` parameter starts with `/`, then `baseUrl` is prepended (except the `baseUrl` path, if it has one).
* If your `url` parameter starts without a scheme or `/` (like `some/path`), then the full `baseUrl` is prepended directly.

Type: `String`<br />Default: `null`

### waitforTimeout[​](#waitfortimeout "Direct link to waitforTimeout")

Default timeout for all `waitFor*` commands. (Note the lowercase `f` in the option name.) This timeout **only** affects commands starting with `waitFor*` and their default wait time.

To increase the timeout for a *test*, please see the framework docs.

Type: `Number`<br />Default: `5000`

### waitforInterval[​](#waitforinterval "Direct link to waitforInterval")

Default interval for all `waitFor*` commands to check if an expected state (e.g., visibility) has been changed.

Type: `Number`<br />Default: `100`

### maxSpyCollectedBodySize[​](#maxspycollectedbodysize "Direct link to maxSpyCollectedBodySize")

Maximum size of the response body (in bytes) that can be returned when using the [`mock`](/docs/api/browser/mock.md) command. Use `0` to disable data collection of the spied payload.

Type: `Number`<br />Default: `10485760` (10MB)

### region[​](#region "Direct link to region")

If running on Sauce Labs, you can choose to run tests between different data centers. Use short region handles `us` (default, maps to `us-west-1`) or `eu` (maps to `eu-central-1`), or the full region names directly.

**Note:** This only has an effect if you provide `user` and `key` options that are connected to your Sauce Labs account.

Type: `String`<br />Default: `us`<br />Options: `us` | `eu` | `us-west-1` | `eu-central-1` | `us-east-4` | `staging`

*(only for vm and or em/simulators)*

***

## Testrunner Options[​](#testrunner-options "Direct link to Testrunner Options")

The following options (including the ones listed above) are defined only for running WebdriverIO with the WDIO testrunner:

### specs[​](#specs "Direct link to specs")

Define specs for test execution. You can either specify a glob pattern to match multiple files at once or wrap a glob or set of paths into an array to run them within a single worker process. All paths are seen as relative from the config file path.

Type: `(String | String[])[]`<br />Default: `[]`

### exclude[​](#exclude "Direct link to exclude")

Exclude specs from test execution. All paths are seen as relative from the config file path.

Type: `String[]`<br />Default: `[]`

### suites[​](#suites "Direct link to suites")

An object describing various suites, which you can then specify with the `--suite` option on the `wdio` CLI.

Type: `Object`<br />Default: `{}`

### capabilities[​](#capabilities-1 "Direct link to capabilities")

The same as the `capabilities` section described above, except with the option to specify either a [`multiremote`](/docs/multiremote.md) object, or multiple WebDriver sessions in an array for parallel execution.

You can apply the same vendor and browser specific capabilities as defined [above](/docs/configuration.md#capabilities).

Type: `Object`|`Object[]`<br />Default: `[{ 'wdio:maxInstances': 5, browserName: 'firefox' }]`

### maxInstances[​](#maxinstances "Direct link to maxInstances")

Maximum number of total parallel running workers.

**Note:** that it may be a number as high as `100`, when the tests are being performed on some external vendors such as Sauce Labs's machines. There, the tests are not tested on a single machine, but rather, on multiple VMs. If the tests are to be run on a local development machine, use a number that is more reasonable, such as `3`, `4`, or `5`. Essentially, this is the number of browsers that will be concurrently started and running your tests at the same time, so it depends on how much RAM there is on your machine, and how many other apps are running on your machine.

You can also apply `maxInstances` within your capability objects using the `wdio:maxInstances` capability. This will limit the amount of parallel sessions for that particular capability.

Type: `Number`<br />Default: `100`

### maxInstancesPerCapability[​](#maxinstancespercapability "Direct link to maxInstancesPerCapability")

Maximum number of total parallel running workers per capability.

Type: `Number`<br />Default: `100`

### injectGlobals[​](#injectglobals "Direct link to injectGlobals")

Inserts WebdriverIO's globals (e.g. `browser`, `$` and `$$`) into the global environment. If you set to `false`, you should import from `@wdio/globals`, e.g.:

```
import { browser, $, $$, expect } from '@wdio/globals'
```

Note: WebdriverIO doesn't handle injection of test framework specific globals.

Type: `Boolean`<br />Default: `true`

### bail[​](#bail "Direct link to bail")

If you want your test run to stop after a specific number of test failures, use `bail`. (It defaults to `0`, which runs all tests no matter what.) **Note:** A test in this context are all tests within a single spec file (when using Mocha or Jasmine) or all steps within a feature file (when using Cucumber). If you want to control the bail behavior within tests of a single test file, take a look at the available [framework](/docs/frameworks.md) options.

Type: `Number`<br />Default: `0` (don't bail; run all tests)

### specFileRetries[​](#specfileretries "Direct link to specFileRetries")

The number of times to retry an entire specfile when it fails as a whole.

Type: `Number`<br />Default: `0`

### specFileRetriesDelay[​](#specfileretriesdelay "Direct link to specFileRetriesDelay")

Delay in seconds between the spec file retry attempts

Type: `Number`<br />Default: `0`

### specFileRetriesDeferred[​](#specfileretriesdeferred "Direct link to specFileRetriesDeferred")

Whether or not retried spec files should be retried immediately or deferred to the end of the queue.

Type: `Boolean`<br />Default: `true`

### groupLogsByTestSpec[​](#grouplogsbytestspec "Direct link to groupLogsByTestSpec")

Choose the log output view.

If set to `false` logs from different test files will be printed in real-time. Please note that this may result in the mixing of log outputs from different files when running in parallel.

If set to `true` log outputs will be grouped by Test Spec and printed only when the Test Spec is completed.

By default, it is set to `false` so logs are printed in real-time.

Type: `Boolean`<br />Default: `false`

### autoAssertOnTestEnd[​](#autoassertontestend "Direct link to autoAssertOnTestEnd")

Controls whether WebdriverIO automatically asserts all soft assertions at the end of each test. When set to `true`, any accumulated soft assertions will be automatically checked and cause the test to fail if any assertions failed. When set to `false`, you must manually call the assert method to check soft assertions.

Type: `Boolean`<br />Default: `true`

### services[​](#services "Direct link to services")

Services take over a specific job you don't want to take care of. They enhance your test setup with almost no effort.

Type: `String[]|Object[]`<br />Default: `[]`

### framework[​](#framework "Direct link to framework")

Defines the test framework to be used by the WDIO testrunner.

Type: `String`<br />Default: `mocha`<br />Options: `mocha` | `jasmine` | `cucumber`

### mochaOpts, jasmineOpts and cucumberOpts[​](#mochaopts-jasmineopts-and-cucumberopts "Direct link to mochaOpts, jasmineOpts and cucumberOpts")

Specific framework-related options. See the framework adapter documentation on which options are available. Read more on this in [Frameworks](/docs/frameworks.md).

Type: `Object`<br />Default: `{ timeout: 10000 }`

### cucumberFeaturesWithLineNumbers[​](#cucumberfeatureswithlinenumbers "Direct link to cucumberFeaturesWithLineNumbers")

List of cucumber features with line numbers (when [using cucumber framework](/docs/frameworks.md#using-cucumber)).

Type: `String[]` Default: `[]`

### reporters[​](#reporters "Direct link to reporters")

List of reporters to use. A reporter can be either a string, or an array of `['reporterName', { /* reporter options */}]` where the first element is a string with the reporter name and the second element an object with reporter options.

Type: `String[]|Object[]`<br />Default: `[]`

Example:

```
reporters: [
    'dot',
    'spec'
    ['junit', {
        outputDir: `${__dirname}/reports`,
        otherOption: 'foobar'
    }]
]
```

### reporterSyncInterval[​](#reportersyncinterval "Direct link to reporterSyncInterval")

Determines in which interval the reporter should check if they are synchronized if they report their logs asynchronously (e.g. if logs are streamed to a 3rd party vendor).

Type: `Number`<br />Default: `100` (ms)

### reporterSyncTimeout[​](#reportersynctimeout "Direct link to reporterSyncTimeout")

Determines the maximum time reporters have to finish uploading all their logs until an error is being thrown by the testrunner.

Type: `Number`<br />Default: `5000` (ms)

### execArgv[​](#execargv "Direct link to execArgv")

Node arguments to specify when launching child processes.

Type: `String[]`<br />Default: `null`

### cpuProf[​](#cpuprof "Direct link to cpuProf")

Enable CPU profiling for the worker process. The profile will be generated automatically when the worker process exits.

Type: `Boolean`<br />Default: `false`

### heapProf[​](#heapprof "Direct link to heapProf")

Enable Heap profiling for the worker process. The snapshot will be generated automatically when the worker process exits (uses sampling heap profiler).

Type: `Boolean`<br />Default: `false`

### profileOutputDir[​](#profileoutputdir "Direct link to profileOutputDir")

Directory where the CPU profiles (`.cpuprofile`) and Heap profiles (`.heapprofile`) will be saved.

Type: `String`<br />Default: `./profiles`

### filesToWatch[​](#filestowatch "Direct link to filesToWatch")

A list of glob supporting string patterns that tell the testrunner to have it additionally watch other files, e.g. application files, when running it with the `--watch` flag. By default the testrunner already watches all spec files.

Type: `String[]`<br />Default: `[]`

### updateSnapshots[​](#updatesnapshots "Direct link to updateSnapshots")

Set to true if you want to update your snapshots. Ideally used as part of a CLI parameter, e.g. `wdio run wdio.conf.js --s`.

Type: `'new' | 'all' | 'none'`<br />Default: `none` if not provided and tests run in CI, `new` if not provided, otherwise what's been provided

### resolveSnapshotPath[​](#resolvesnapshotpath "Direct link to resolveSnapshotPath")

Overrides default snapshot path. For example, to store snapshots next to test files.

wdio.conf.ts

```
export const config: WebdriverIO.Config = {
    resolveSnapshotPath: (testPath, snapExtension) => testPath + snapExtension,
}
```

Type: `(testPath: string, snapExtension: string) => string`<br />Default: stores snapshot files in `__snapshots__` directory next to test file

### tsConfigPath[​](#tsconfigpath "Direct link to tsConfigPath")

WDIO uses `tsx` to compile TypeScript files. Your TSConfig is automatically detected from the current working directory but you can specify a custom path here or by setting the TSX\_TSCONFIG\_PATH environment variable.

See the `tsx` docs: <https://tsx.is/dev-api/node-cli#custom-tsconfig-json-path>

Type: `String`<br />Default: `null`<br />

## Hooks[​](#hooks "Direct link to Hooks")

The WDIO testrunner allows you to set hooks to be triggered at specific times of the test lifecycle. This allows custom actions (e.g. take screenshot if a test fails).

Every hook has as parameter specific information about the lifecycle (e.g. information about the test suite or test). Read more about all hook properties in [our example config](https://github.com/webdriverio/webdriverio/blob/master/examples/wdio.conf.js#L183-L326).

**Note:** Some hooks (`onPrepare`, `onWorkerStart`, `onWorkerEnd` and `onComplete`) are executed in a different process and therefore can not share any global data with the other hooks that live in the worker process.

### onPrepare[​](#onprepare "Direct link to onPrepare")

Gets executed once before all workers get launched.

Parameters:

* `config` (`object`): WebdriverIO configuration object
* `param` (`object[]`): list of capabilities details

### onWorkerStart[​](#onworkerstart "Direct link to onWorkerStart")

Gets executed before a worker process is spawned and can be used to initialize specific service for that worker as well as modify runtime environments in an async fashion.

Parameters:

* `cid` (`string`): capability id (e.g 0-0)
* `caps` (`object`): containing capabilities for session that will be spawn in the worker
* `specs` (`string[]`): specs to be run in the worker process
* `args` (`object`): object that will be merged with the main configuration once worker is initialized
* `execArgv` (`string[]`): list of string arguments passed to the worker process

### onWorkerEnd[​](#onworkerend "Direct link to onWorkerEnd")

Gets executed just after a worker process has exited.

Parameters:

* `cid` (`string`): capability id (e.g 0-0)
* `exitCode` (`number`): 0 - success, 1 - fail. A worker that was terminated by a signal reports `128` + the signal number instead, e.g. `139` for a `SIGSEGV`
* `specs` (`string[]`): specs to be run in the worker process
* `retries` (`number`): number of spec level retries used as defined in [*"Add retries on a per-specfile basis"*](/docs/retry.md#add-retries-on-a-per-specfile-basis)
* `signal` (`string`): signal that terminated the worker, e.g. `SIGSEGV`, or `null` if it exited on its own

### beforeSession[​](#beforesession "Direct link to beforeSession")

Gets executed just before initializing the webdriver session and test framework. It allows you to manipulate configurations depending on the capability or spec.

Parameters:

* `config` (`object`): WebdriverIO configuration object
* `caps` (`object`): containing capabilities for session that will be spawn in the worker
* `specs` (`string[]`): specs to be run in the worker process

### before[​](#before "Direct link to before")

Gets executed before test execution begins. At this point you can access to all global variables like `browser`. It is the perfect place to define custom commands.

Parameters:

* `caps` (`object`): containing capabilities for session that will be spawn in the worker
* `specs` (`string[]`): specs to be run in the worker process
* `browser` (`object`): instance of created browser/device session

### beforeSuite[​](#beforesuite "Direct link to beforeSuite")

Hook that gets executed before the suite starts (in Mocha/Jasmine only)

Parameters:

* `suite` (`object`): suite details

### beforeHook[​](#beforehook "Direct link to beforeHook")

Hook that gets executed *before* a hook within the suite starts (e.g. runs before calling beforeEach in Mocha)

Parameters:

* `test` (`object`): test details
* `context` (`object`): test context (represents World object in Cucumber)

### afterHook[​](#afterhook "Direct link to afterHook")

Hook that gets executed *after* a hook within the suite ends (e.g. runs after calling afterEach in Mocha)

Parameters:

* `test` (`object`): test details
* `context` (`object`): test context (represents World object in Cucumber)
* `result` (`object`): hook result (contains `error`, `result`, `duration`, `passed`, `retries` properties)

### beforeTest[​](#beforetest "Direct link to beforeTest")

Function to be executed before a test (in Mocha/Jasmine only).

Parameters:

* `test` (`object`): test details
* `context` (`object`): scope object the test was executed with

### beforeCommand[​](#beforecommand "Direct link to beforeCommand")

Runs before a WebdriverIO command gets executed.

Parameters:

* `commandName` (`string`): command name
* `args` (`*`): arguments that command would receive

### afterCommand[​](#aftercommand "Direct link to afterCommand")

Runs after a WebdriverIO command gets executed.

Parameters:

* `commandName` (`string`): command name
* `args` (`*`): arguments that command would receive
* `result` (`*`): result of the command
* `error` (`Error`): error object if any

### afterTest[​](#aftertest "Direct link to afterTest")

Function to be executed after a test (in Mocha/Jasmine) ends.

Parameters:

* `test` (`object`): test details
* `context` (`object`): scope object the test was executed with
* `result.error` (`Error`): error object in case the test fails, otherwise `undefined`
* `result.result` (`Any`): return object of test function
* `result.duration` (`Number`): duration of test
* `result.passed` (`Boolean`): true if test has passed, otherwise false
* `result.retries` (`Object`): information about single test related retries as defined for [Mocha and Jasmine](/docs/retry.md#rerun-single-tests-in-jasmine-or-mocha) as well as [Cucumber](/docs/retry.md#rerunning-in-cucumber), e.g. `{ attempts: 0, limit: 0 }`, see
* `result` (`object`): hook result (contains `error`, `result`, `duration`, `passed`, `retries` properties)

### afterSuite[​](#aftersuite "Direct link to afterSuite")

Hook that gets executed after the suite has ended (in Mocha/Jasmine only)

Parameters:

* `suite` (`object`): suite details

### after[​](#after "Direct link to after")

Gets executed after all tests are done. You still have access to all global variables from the test.

Parameters:

* `result` (`number`): 0 - test pass, 1 - test fail
* `caps` (`object`): containing capabilities for session that will be spawn in the worker
* `specs` (`string[]`): specs to be run in the worker process

### afterSession[​](#aftersession "Direct link to afterSession")

Gets executed right after terminating the webdriver session.

Parameters:

* `config` (`object`): WebdriverIO configuration object
* `caps` (`object`): containing capabilities for session that will be spawn in the worker
* `specs` (`string[]`): specs to be run in the worker process

### onComplete[​](#oncomplete "Direct link to onComplete")

Gets executed after all workers got shut down and the process is about to exit. An error thrown in the onComplete hook will result in the test run failing.

Parameters:

* `exitCode` (`number`): 0 - success, 1 - fail
* `config` (`object`): WebdriverIO configuration object
* `caps` (`object`): containing capabilities for session that will be spawn in the worker
* `result` (`object`): results object containing test results

### onReload[​](#onreload "Direct link to onReload")

Gets executed when a refresh happens.

Parameters:

* `oldSessionId` (`string`): session ID of the old session
* `newSessionId` (`string`): session ID of the new session

### beforeFeature[​](#beforefeature "Direct link to beforeFeature")

Runs before a Cucumber Feature.

Parameters:

* `uri` (`string`): path to feature file
* `feature` ([`GherkinDocument.IFeature`](https://github.com/cucumber/common/blob/b94ce625967581de78d0fc32d84c35b46aa5a075/json-to-messages/javascript/src/cucumber-generic/JSONSchema.ts#L8-L17)): Cucumber feature object

### afterFeature[​](#afterfeature "Direct link to afterFeature")

Runs after a Cucumber Feature.

Parameters:

* `uri` (`string`): path to feature file
* `feature` ([`GherkinDocument.IFeature`](https://github.com/cucumber/common/blob/b94ce625967581de78d0fc32d84c35b46aa5a075/json-to-messages/javascript/src/cucumber-generic/JSONSchema.ts#L8-L17)): Cucumber feature object

### beforeScenario[​](#beforescenario "Direct link to beforeScenario")

Runs before a Cucumber Scenario.

Parameters:

* `world` ([`ITestCaseHookParameter`](https://github.com/cucumber/cucumber-js/blob/ac124f7b2be5fa54d904c7feac077a2657b19440/src/support_code_library_builder/types.ts#L10-L15)): world object containing information on pickle and test step
* `context` (`object`): Cucumber World object

### afterScenario[​](#afterscenario "Direct link to afterScenario")

Runs after a Cucumber Scenario.

Parameters:

* `world` ([`ITestCaseHookParameter`](https://github.com/cucumber/cucumber-js/blob/ac124f7b2be5fa54d904c7feac077a2657b19440/src/support_code_library_builder/types.ts#L10-L15)): world object containing information on pickle and test step
* `result` (`object`): results object containing scenario results
* `result.passed` (`boolean`): true if scenario has passed
* `result.error` (`string`): error stack if scenario failed
* `result.duration` (`number`): duration of scenario in milliseconds
* `context` (`object`): Cucumber World object

### beforeStep[​](#beforestep "Direct link to beforeStep")

Runs before a Cucumber Step.

Parameters:

* `step` ([`Pickle.IPickleStep`](https://github.com/cucumber/common/blob/b94ce625967581de78d0fc32d84c35b46aa5a075/messages/jsonschema/Pickle.json#L20-L49)): Cucumber step object
* `scenario` ([`IPickle`](https://github.com/cucumber/common/blob/b94ce625967581de78d0fc32d84c35b46aa5a075/messages/jsonschema/Pickle.json#L137-L175)): Cucumber scenario object
* `context` (`object`): Cucumber World object

### afterStep[​](#afterstep "Direct link to afterStep")

Runs after a Cucumber Step.

Parameters:

* `step` ([`Pickle.IPickleStep`](https://github.com/cucumber/common/blob/b94ce625967581de78d0fc32d84c35b46aa5a075/messages/jsonschema/Pickle.json#L20-L49)): Cucumber step object
* `scenario` ([`IPickle`](https://github.com/cucumber/common/blob/b94ce625967581de78d0fc32d84c35b46aa5a075/messages/jsonschema/Pickle.json#L137-L175)): Cucumber scenario object
* `result`: (`object`): results object containing step results
* `result.passed` (`boolean`): true if scenario has passed
* `result.error` (`string`): error stack if scenario failed
* `result.duration` (`number`): duration of scenario in milliseconds
* `context` (`object`): Cucumber World object

### beforeAssertion[​](#beforeassertion "Direct link to beforeAssertion")

Hook that gets executed before a WebdriverIO assertion happens.

Parameters:

* `params`: assertion information
* `params.matcherName` (`string`): name of the matcher (e.g. `toHaveTitle`)
* `params.expectedValue`: value that is passed into the matcher
* `params.options`: assertion options

### afterAssertion[​](#afterassertion "Direct link to afterAssertion")

Hook that gets executed after a WebdriverIO assertion happened.

Parameters:

* `params`: assertion information
* `params.matcherName` (`string`): name of the matcher (e.g. `toHaveTitle`)
* `params.expectedValue`: value that is passed into the matcher
* `params.options`: assertion options
* `params.result`: assertion results
