---
id: modules
title: Modules
---
WebdriverIO publishes various modules to NPM and other registries that you can use to build your own automation framework. See more documentation on WebdriverIO setup types [here](/docs/setuptypes).
## `webdriver` and `devtools`
The protocol packages ([`webdriver`](https://www.npmjs.com/package/webdriver) and [`devtools`](https://www.npmjs.com/package/devtools)) expose a class with the following static functions attached that allow you to initiate sessions:
#### `newSession(options, modifier, userPrototype, customCommandWrapper)`
Starts a new session with specific capabilities. Based on the session response commands from different protocols will be provided.
##### Paramaters
- `options`: [WebDriver Options](/docs/configuration#webdriver-options)
- `modifier`: function that allows to modify the client instance before it is being returned
- `userPrototype`: properties object that allows to extend the instance prototype
- `customCommandWrapper`: function that allows to wrap functionality around function calls
##### Returns
- [Browser](/docs/api/browser) object
##### Example
```js
const client = await WebDriver.newSession({
capabilities: { browserName: 'chrome' }
})
```
#### `attachToSession(attachInstance, modifier, userPrototype, customCommandWrapper)`
Attaches to a running WebDriver or DevTools session.
##### Paramaters
- `attachInstance`: instance to attach a session to or at least an object with a property `sessionId` (e.g. `{ sessionId: 'xxx' }`)
- `modifier`: function that allows to modify the client instance before it is being returned
- `userPrototype`: properties object that allows to extend the instance prototype
- `customCommandWrapper`: function that allows to wrap functionality around function calls
##### Returns
- [Browser](/docs/api/browser) object
##### Example
```js
const client = await WebDriver.newSession({...})
const clonedClient = await WebDriver.attachToSession(client)
```
#### `reloadSession(instance)`
Reloads a session given provided instance.
##### Paramaters
- `instance`: package instance to reload
##### Example
```js
const client = await WebDriver.newSession({...})
await WebDriver.reloadSession(client)
```
## `webdriverio`
Similar as to the protocol packages (`webdriver` and `devtools`) you can also use the WebdriverIO package APIs to manage sessions. The APIs can be imported using `import { remote, attach, multiremote } from 'webdriverio` and contain the following functionality:
#### `remote(options, modifier)`
Starts a WebdriverIO session. The instance contains all commands as the protocol package but with additional higher order functions, see [API docs](/docs/api).
##### Paramaters
- `options`: [WebdriverIO Options](/docs/configuration#webdriverio)
- `modifier`: function that allows to modify the client instance before it is being returned
##### Returns
- [Browser](/docs/api/browser) object
##### Example
```js
import { remote } from 'webdriverio'
const browser = await remote({
capabilities: { browserName: 'chrome' }
})
```
#### `attach(attachOptions)`
Attaches to a running WebdriverIO session.
##### Paramaters
- `attachOptions`: instance to attach a session to or at least an object with a property `sessionId` (e.g. `{ sessionId: 'xxx' }`)
##### Returns
- [Browser](/docs/api/browser) object
##### Example
```js
import { remote, attach } from 'webdriverio'
const browser = await remote({...})
const newBrowser = await attach(browser)
```
#### `multiremote(multiremoteOptions)`
Initiates a multiremote instance which allows you to control multiple session within a single instance. Checkout our [multiremote examples](https://github.com/webdriverio/webdriverio/tree/main/examples/multiremote) for concrete use cases.
##### Paramaters
- `multiremoteOptions`: an object with keys representing the browser name and their [WebdriverIO Options](/docs/configuration#webdriverio).
##### Returns
- [Browser](/docs/api/browser) object
##### Example
```js
import { multiremote } from 'webdriverio'
const matrix = await multiremote({
myChromeBrowser: {
capabilities: { browserName: 'chrome' }
},
myFirefoxBrowser: {
capabilities: { browserName: 'firefox' }
}
})
await matrix.url('http://json.org')
await matrix.getInstance('browserA').url('https://google.com')
console.log(await matrix.getTitle())
// returns ['Google', 'JSON']
```
## `@wdio/cli`
Instead of calling the `wdio` command, you can also include the test runner as module and run it in an arbitrary environment. For that, you'll need to require the `@wdio/cli` package as module, like this:
```js
import Launcher from '@wdio/cli'
```
```js
const Launcher = require('@wdio/cli').default
```
After that, create an instance of the launcher, and run the test.
#### `Launcher(configPath, opts)`
The `Launcher` class constructor expects the URL to the config file, and an `opts` object with settings that will overwrite those in the config.
##### Paramaters
- `configPath`: path to the `wdio.conf.js` to run
- `opts`: arguments ([``](https://github.com/webdriverio/webdriverio/blob/main/packages/wdio-cli/src/types.ts#L51-L77)) to overwrite values from the config file
##### Example
```js
const wdio = new Launcher(
'/path/to/my/wdio.conf.js',
{ spec: '/path/to/a/single/spec.e2e.js' }
)
wdio.run().then((exitCode) => {
process.exit(exitCode)
}, (error) => {
console.error('Launcher failed to start the test', error.stacktrace)
process.exit(1)
})
```
The `run` command returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). It is resolved if tests ran successfully or failed, and it is rejected if the launcher was unable to start run the tests.
## `@wdio/browser-runner`
When running unit or component tests using WebdriverIO's [browser runner](/docs/runner#browser-runner) you can import mocking utilities for your tests, e.g.:
```ts
import { fn, spyOn, mock, unmock } from '@wdio/browser-runner'
```
The following named exports are available:
#### `fn`
Mock function, see more in the official [Vitest docs](https://vitest.dev/api/mock.html#mock-functions).
#### `spyOn`
Spy function, see more in the official [Vitest docs](https://vitest.dev/api/mock.html#mock-functions).
#### `mock`
Method to mock file or dependency module.
##### Paramaters
- `moduleName`: either a relative path to the file to be mocked or a module name.
- `factory`: function to return the mocked value (optional)
##### Example
```js
mock('../src/constants.ts', () => ({
SOME_DEFAULT: 'mocked out'
}))
mock('lodash', (origModuleFactory) => {
const origModule = await origModuleFactory()
return {
...origModule,
pick: fn()
}
})
```
#### `unmock`
Unmock dependency that is defined within the manual mock (`__mocks__`) directory.
##### Paramaters
- `moduleName`: name of the module to be unmocked.
##### Example
```js
unmock('lodash')
```