API Reference
This document provides a complete reference for all browser.electron.* methods and exported utility functions provided by the service.
Table of Contents
- Utility Functions
- Execution Methods
- Mocking Methods
- Mock Object Methods
- Mock Object Properties
- Electron Class Mock
Utility Functions
These functions are exported directly from the package and can be used independently of the WDIO test runner.
createElectronCapabilities()
Creates an Electron capabilities object for use with startWdioSession() or in WDIO configuration. Builds the correct capability structure including goog:chromeOptions and wdio:electronServiceOptions.
Signature:
import { createElectronCapabilities } from '@wdio/electron-service';
createElectronCapabilities(options: ElectronServiceOptions): ElectronStandaloneCapability
Parameters:
| Parameter | Type | Description |
|---|---|---|
options | ElectronServiceOptions | Service options. Must include at least appBinaryPath or appEntryPoint. |
Common fields:
| Field | Type | Description |
|---|---|---|
appBinaryPath | string | Path to the compiled Electron app binary |
appEntryPoint | string | Path to the unpackaged app entry point (e.g., main.js) |
appArgs | string[] | Command-line arguments passed to the app |
captureMainProcessLogs | boolean | Enable main process log capture |
captureRendererLogs | boolean | Enable renderer process log capture |
logDir | string | Directory for standalone mode logs |
See Configuration for the full list of ElectronServiceOptions fields.
Returns:
ElectronStandaloneCapability - A single capabilities object
Throws:
| Error | Condition |
|---|---|
Error | If neither appBinaryPath nor appEntryPoint is provided |
Example:
import { startWdioSession, createElectronCapabilities } from '@wdio/electron-service';
const caps = createElectronCapabilities({
appBinaryPath: './dist/mac/MyApp.app/Contents/MacOS/MyApp',
appArgs: ['--disable-gpu', '--headless'],
captureMainProcessLogs: true,
logDir: './test-logs',
});
const browser = await startWdioSession([caps]);
See Also:
getElectronBinaryPath()
Resolves the path to the Electron binary for a given app directory. Uses the same detection logic as the service (reading package.json, checking Electron Forge/Builder configs) without starting a session.
Signature:
import { getElectronBinaryPath } from '@wdio/electron-service';
getElectronBinaryPath(appDir: string): Promise<string>
Parameters:
| Parameter | Type | Description |
|---|---|---|
appDir | string | Path to the Electron app directory (must contain a package.json) |
Returns:
Promise<string> - The resolved path to the Electron binary
Throws:
| Error | Condition |
|---|---|
Error | If no package.json is found in appDir |
Error | If the binary path cannot be resolved |
Example:
import { getElectronBinaryPath } from '@wdio/electron-service';
const binaryPath = await getElectronBinaryPath('/path/to/my-electron-app');
console.log(binaryPath);
// e.g. '/path/to/my-electron-app/dist/mac-arm64/MyApp.app/Contents/MacOS/MyApp'
See Also:
startWdioSession()
Starts a WebdriverIO session in standalone mode (without the WDIO test runner). Performs the same launcher setup the runner does — binary detection, capability mutation, log writer initialization — and returns a browser instance.
Signature:
import { startWdioSession } from '@wdio/electron-service';
startWdioSession(
capabilities: ElectronServiceCapabilities,
globalOptions?: ElectronServiceGlobalOptions,
): Promise<WebdriverIO.Browser>
Parameters:
| Parameter | Type | Description |
|---|---|---|
capabilities | ElectronServiceCapabilities | An array of standalone capability objects (typically one, built with createElectronCapabilities()), or a multiremote capabilities object. |
globalOptions | ElectronServiceGlobalOptions | Optional. Service-level options applied to all capabilities (e.g., rootDir). |
Returns:
Promise<WebdriverIO.Browser> - The browser instance, with browser.electron.* available.
Example:
import { startWdioSession, cleanupWdioSession, createElectronCapabilities } from '@wdio/electron-service';
const caps = createElectronCapabilities({
appBinaryPath: '/path/to/MyApp',
captureMainProcessLogs: true,
logDir: './logs',
});
const browser = await startWdioSession([caps]);
try {
const name = await browser.electron.execute((electron) => electron.app.getName());
console.log(name);
} finally {
await cleanupWdioSession(browser);
}
See Also:
cleanupWdioSession()
Tears down a standalone session started with startWdioSession(). Calls browser.deleteSession() and runs the launcher's onComplete cleanup so the Electron process and any spawned drivers are released.
Signature:
import { cleanupWdioSession } from '@wdio/electron-service';
cleanupWdioSession(browser: WebdriverIO.Browser): Promise<void>
Parameters:
| Parameter | Type | Description |
|---|---|---|
browser | WebdriverIO.Browser | The browser instance returned from startWdioSession(). |
Returns:
Promise<void>
See Also:
Execution Methods
execute()
Executes arbitrary JavaScript code in the Electron main process context.
Signature:
browser.electron.execute<T>(
script: (electron, ...args) => T | Promise<T>,
...args: any[]
): Promise<T>
Parameters:
| Parameter | Type | Description |
|---|---|---|
script | (electron, ...args) => T | Promise<T> | Function to execute in main process. First arg is always the electron module. |
...args | any[] | Additional arguments passed to the script function |
Returns:
Promise<T> - Resolves with the return value of the script
Example:
// Simple execution
const appName = await browser.electron.execute((electron) => {
return electron.app.getName();
});
// With parameters
const result = await browser.electron.execute(
(electron, param1, param2) => {
return param1 + param2;
},
5,
10
);
// With async code
const fileIcon = await browser.electron.execute(async (electron) => {
return await electron.app.getFileIcon('/path/to/file');
});
See Also:
triggerDeeplink()
Triggers a deeplink to the Electron application for testing protocol handlers.
On Windows and Linux, this automatically appends the test instance's userData directory to ensure the deeplink reaches the correct instance. On macOS, it works transparently without modification.
Signature:
browser.electron.triggerDeeplink(url: string): Promise<void>
Parameters:
| Parameter | Type | Description |
|---|---|---|
url | string | The deeplink URL to trigger (e.g., 'myapp://open?path=/test'). Must use a custom protocol scheme (not http/https/file). |
Returns:
Promise<void> - Resolves when the deeplink has been triggered.
Throws:
| Error | Condition |
|---|---|
Error | If appBinaryPath is not configured (Windows/Linux only) |
Error | If the URL is invalid or malformed |
Error | If the URL uses http/https/file protocols |
Error | If the platform is unsupported |
Error | If the command to trigger the deeplink fails |
Example:
// Basic usage
await browser.electron.triggerDeeplink('myapp://open?file=test.txt');
// With complex parameters
await browser.electron.triggerDeeplink('myapp://action?id=123&type=user&tags[]=a&tags[]=b');
// In a test with verification
it('should handle deeplinks', async () => {
await browser.electron.triggerDeeplink('myapp://navigate?to=/settings');
await browser.waitUntil(async () => {
const currentPath = await browser.electron.execute(() => {
return globalThis.currentPath;
});
return currentPath === '/settings';
}, {
timeout: 5000,
timeoutMsg: 'App did not process the deeplink'
});
});
Platform-Specific Behavior:
- Windows: Cannot use
appEntryPoint(must use packaged binary). Automatically appendsuserDataparameter to URL. - macOS: Works with both packaged binaries and script-based apps. No URL modification.
- Linux: Cannot use
appEntryPoint(must use packaged binary). Automatically appendsuserDataparameter to URL.
See Also:
Mocking Methods
mock()
Mocks an Electron API function when provided with an API name and function name. Returns a mock object.
When called with only an API name (no function name), mocks an entire Electron class (e.g., 'Tray', 'BrowserWindow'). Returns an Electron class mock object.
Signature:
// Mock a specific function
browser.electron.mock(apiName: string, funcName: string): Promise<ElectronMock>
// Mock an entire class
browser.electron.mock(className: string): Promise<ElectronClassMock>
Parameters:
| Parameter | Type | Description |
|---|---|---|
apiName | string | The Electron API module name (e.g., 'dialog', 'app', 'clipboard') or class name (e.g., 'Tray', 'BrowserWindow') |
funcName | string | Optional. The function name to mock (e.g., 'showOpenDialog', 'getName'). If omitted, mocks the entire class. |
Returns:
Promise<ElectronMock> - An Electron mock object (function mock or class mock) with methods for controlling and inspecting the mock
Example:
const mockedShowOpenDialog = await browser.electron.mock('dialog', 'showOpenDialog');
await browser.electron.execute(
async (electron) =>
await electron.dialog.showOpenDialog({
properties: ['openFile', 'openDirectory'],
}),
);
expect(mockedShowOpenDialog).toHaveBeenCalledTimes(1);
expect(mockedShowOpenDialog).toHaveBeenCalledWith({
properties: ['openFile', 'openDirectory'],
});
// Class mocking
const mockTray = await browser.electron.mock('Tray');
await mockTray.setTitle.mockReturnValue(undefined);
// Track constructor calls
const tray = await browser.electron.execute((electron) => new electron.Tray('/path/to/icon.png'));
expect(mockTray.__constructor).toHaveBeenCalledWith('/path/to/icon.png');
// Mock instance methods
await browser.electron.execute((electron) => {
const tray = new electron.Tray('/path/to/icon.png');
tray.setTitle('My App');
});
expect(mockTray.setTitle).toHaveBeenCalledWith('My App');
See Also:
mockAll()
Mocks all functions on an Electron API module simultaneously. Returns an object containing all mocks.
Signature:
browser.electron.mockAll(apiName: string): Promise<Record<string, ElectronMock>>
Parameters:
| Parameter | Type | Description |
|---|---|---|
apiName | string | The Electron API module name (e.g., 'dialog', 'app') |
Returns:
Promise<Record<string, ElectronMock>> - Object with function names as keys and mock objects as values
Example:
const { showOpenDialog, showMessageBox } = await browser.electron.mockAll('dialog');
await showOpenDialog.mockReturnValue('I opened a dialog!');
await showMessageBox.mockReturnValue('I opened a message box!');
See Also:
clearAllMocks()
Calls mockClear() on all active mocks, or on mocks of a specific API if apiName is provided.
Signature:
browser.electron.clearAllMocks(apiName?: string): Promise<void>
Parameters:
| Parameter | Type | Description |
|---|---|---|
apiName | string | Optional. If provided, only clears mocks of this specific API |
Returns:
Promise<void>
Example:
// Clear all mocks
const mockSetName = await browser.electron.mock('app', 'setName');
const mockWriteText = await browser.electron.mock('clipboard', 'writeText');
await browser.electron.execute((electron) => electron.app.setName('new app name'));
await browser.electron.execute((electron) => electron.clipboard.writeText('text to be written'));
await browser.electron.clearAllMocks();
expect(mockSetName.mock.calls).toStrictEqual([]);
expect(mockWriteText.mock.calls).toStrictEqual([]);
// Clear mocks of specific API
await browser.electron.clearAllMocks('app');
expect(mockSetName.mock.calls).toStrictEqual([]);
expect(mockWriteText.mock.calls).toStrictEqual([['text to be written']]);
resetAllMocks()
Calls mockReset() on all active mocks, or on mocks of a specific API if apiName is provided.
Signature:
browser.electron.resetAllMocks(apiName?: string): Promise<void>
Parameters:
| Parameter | Type | Description |
|---|---|---|
apiName | string | Optional. If provided, only resets mocks of this specific API |
Returns:
Promise<void>
Example:
const mockGetName = await browser.electron.mock('app', 'getName');
const mockReadText = await browser.electron.mock('clipboard', 'readText');
await mockGetName.mockReturnValue('mocked appName');
await mockReadText.mockReturnValue('mocked clipboardText');
await browser.electron.resetAllMocks();
const appName = await browser.electron.execute((electron) => electron.app.getName());
const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
expect(appName).toBeUndefined();
expect(clipboardText).toBeUndefined();
restoreAllMocks()
Calls mockRestore() on all active mocks, or on mocks of a specific API if apiName is provided.
Signature:
browser.electron.restoreAllMocks(apiName?: string): Promise<void>
Parameters:
| Parameter | Type | Description |
|---|---|---|
apiName | string | Optional. If provided, only restores mocks of this specific API |
Returns:
Promise<void>
Example:
const mockGetName = await browser.electron.mock('app', 'getName');
const mockReadText = await browser.electron.mock('clipboard', 'readText');
await mockGetName.mockReturnValue('mocked appName');
await mockReadText.mockReturnValue('mocked clipboardText');
await browser.electron.restoreAllMocks();
const appName = await browser.electron.execute((electron) => electron.app.getName());
const clipboardText = await browser.electron.execute((electron) => electron.clipboard.readText());
expect(appName).toBe('my real app name');
expect(clipboardText).toBe('some real clipboard text');
isMockFunction()
Checks if a given parameter is an Electron mock function. If using TypeScript, narrows down the type.
Signature:
browser.electron.isMockFunction(fn: any): fn is ElectronMock
Parameters:
| Parameter | Type | Description |
|---|---|---|
fn | any | The value to check |
Returns:
boolean - true if the value is a mock function, false otherwise
Example:
const mockGetName = await browser.electron.mock('app', 'getName');
expect(browser.electron.isMockFunction(mockGetName)).toBe(true);
expect(browser.electron.isMockFunction(() => {})).toBe(false);
Mock Object Methods
Each mock object returned by mock() or mockAll() has the following methods: