Chuyển đến nội dung chính

Configuration

Complete guide to configuring @wdio/tauri-service in your WebdriverIO setup.

Service Configuration

Add the Tauri service to your wdio.conf.ts:

export const config = {
services: [
['@wdio/tauri-service', {
// Service options go here
autoInstallTauriDriver: true,
autoDownloadEdgeDriver: true,
captureBackendLogs: true,
captureFrontendLogs: true,
}]
],
// ... rest of config
};

Service Options

appBinaryPath (string, optional)

Path to the compiled Tauri application binary (executable).

Example:

appBinaryPath: './src-tauri/target/release/my-app.exe',  // Windows
appBinaryPath: './src-tauri/target/release/my-app', // Linux

Default: Auto-detected from capabilities if not provided

Note: Path should be absolute or relative to the WebdriverIO config directory.


appArgs (string[], optional)

Command-line arguments to pass to the Tauri application when launching. Each array element is passed as a separate argument — no shell parsing is applied.

Example:

appArgs: ['--debug', '--log-level', 'debug']

// For key=value style arguments, use either form:
appArgs: ['--window-size', '1920,1080'] // Two separate elements
appArgs: ['--window-size=1920,1080'] // Single element with equals

Default: []


autoInstallTauriDriver (boolean, optional)

Automatically install tauri-driver if not found in PATH.

Requirements:

  • Rust toolchain must be installed (cargo)
  • First installation will take a few minutes

Example:

autoInstallTauriDriver: true

Default: false

Note: Disable if you have tauri-driver installed manually or globally.


autoDownloadEdgeDriver (boolean, optional)

Automatically download MSEdgeDriver on Windows if version mismatch detected.

Example:

autoDownloadEdgeDriver: true  // Windows only

Default: true

Note: Windows only, ignored on Linux/macOS. See Edge WebDriver Windows.


tauriDriverPort (number, optional)

Port for tauri-driver to listen on. Each worker process gets a unique port (port + worker index).

Example:

tauriDriverPort: 4444

Default: 4444

Note: Increment for multiremote to avoid port conflicts.


tauriDriverPath (string, optional)

Path to the tauri-driver executable if not in PATH.

Example:

tauriDriverPath: '/usr/local/bin/tauri-driver'  // Linux/macOS
tauriDriverPath: 'C:\\tools\\tauri-driver.exe' // Windows

Default: Use tauri-driver from PATH


logLevel ('trace' | 'debug' | 'info' | 'warn' | 'error', optional)

Log level for tauri-driver output.

Example:

logLevel: 'debug'  // More verbose

Default: 'info'


windowLabel (string, optional)

The default window label to target for Tauri operations. This controls which webview window browser.tauri.execute() and other Tauri-specific operations target by default.

Example:

windowLabel: 'settings'  // Target the settings window by default

Default: 'main'

Note:

  • Each browser instance (including multiremote) can have its own default windowLabel
  • Override at runtime with browser.tauri.switchWindow(label)
  • Per-call override with browser.tauri.execute(fn, withExecuteOptions({ windowLabel: 'x' })) is supported

commandTimeout (number, optional)

Timeout in milliseconds for individual command execution.

Example:

commandTimeout: 60000  // 60 seconds

Default: 30000 (30 seconds)


startTimeout (number, optional)

Timeout in milliseconds for the Tauri app to start and become ready.

Example:

startTimeout: 60000  // 60 seconds

Default: 30000 for the 'official' and 'crabnebula' providers, 60000 for the 'embedded' provider (the embedded WebDriver server takes longer to come up, especially on Windows CI).


captureBackendLogs (boolean, optional)

Capture logs from the Tauri backend (Rust code).

Example:

captureBackendLogs: true

Default: false

Note: When enabled, logs appear in WebdriverIO reports. See Log Forwarding.


captureFrontendLogs (boolean, optional)

Capture console logs from the frontend (JavaScript/TypeScript).

Example:

captureFrontendLogs: true

Default: false

Note: When enabled, console.log() calls appear in WebdriverIO reports. See Log Forwarding.


backendLogLevel ('trace' | 'debug' | 'info' | 'warn' | 'error', optional)

Minimum log level to capture from backend. Logs below this level are ignored.

Example:

backendLogLevel: 'debug'  // Capture debug and above

Default: 'info'

Note: Only has effect if captureBackendLogs: true.


frontendLogLevel ('trace' | 'debug' | 'info' | 'warn' | 'error', optional)

Minimum log level to capture from frontend. Logs below this level are ignored.

Example:

frontendLogLevel: 'debug'

Default: 'info'

Note: Only has effect if captureFrontendLogs: true.


logDir (string, optional)

Directory to store logs from the Tauri service (for standalone mode).

Example:

logDir: './test-logs'

Default: Logs to stdout/stderr


statusPollTimeout (number, optional)

Timeout in milliseconds for the /status endpoint poll during embedded WebDriver server startup. Increase this in slow CI environments (e.g. containerised Windows runners) where a healthy-but-busy server may miss the default deadline and trigger a false-positive restart.

Example:

statusPollTimeout: 5000

Default: 2000

Note: Only applies when driverProvider: 'embedded'.


clearMocks (boolean, optional)

If true, all mock call history is cleared before each test. Equivalent to calling browser.tauri.clearAllMocks() in a beforeEach.

Example:

clearMocks: true

Default: false


clearMocksPrefix (string, optional)

If set, only mocks whose command name starts with this prefix are cleared. Only used when clearMocks: true.

Example:

clearMocks: true,
clearMocksPrefix: 'clipboard' // Only clears clipboard.* mocks

Default: undefined


resetMocks (boolean, optional)

If true, all mocks are reset (implementation + history) before each test. Equivalent to browser.tauri.resetAllMocks() in a beforeEach.

Example:

resetMocks: true

Default: false


resetMocksPrefix (string, optional)

If set, only mocks whose command name starts with this prefix are reset. Only used when resetMocks: true.

Default: undefined


restoreMocks (boolean, optional)

If true, all mocks are restored to their original implementations before each test. Equivalent to browser.tauri.restoreAllMocks() in a beforeEach.

Example:

restoreMocks: true

Default: false


restoreMocksPrefix (string, optional)

If set, only mocks whose command name starts with this prefix are restored. Only used when restoreMocks: true.

Default: undefined


driverProvider ('official' | 'crabnebula' | 'embedded', optional)

Select which driver provider to use for WebDriver communication.

  • 'embedded': Use embedded WebDriver server via tauri-plugin-wdio-webdriver (no external driver needed, works on all platforms)
  • 'official': Use the cargo-installed tauri-driver (supports Windows/Linux)
  • 'crabnebula': Use @crabnebula/tauri-driver from npm (supports Windows/Linux/macOS; CN_API_KEY required for macOS only)

Auto-detection (no explicit config needed):

The service automatically selects 'embedded' when either of the following signals is present:

  • TAURI_WEBDRIVER_PORT environment variable is set (you've configured the plugin's port)
  • Running on macOS (WKWebView requires the embedded approach)

If neither signal is present on Windows or Linux, the service throws an immediate error with instructions.

Example:

// Auto-detected on macOS, or when TAURI_WEBDRIVER_PORT is set — no config needed
// driverProvider: 'embedded' (set this explicitly to be unambiguous)

// Use CrabNebula — all platforms; CN_API_KEY required for macOS
driverProvider: 'crabnebula'

// Use official tauri-driver — opt out of embedded provider
driverProvider: 'official'

Default: Auto-detected (see above). Set explicitly to override.

Note: Install tauri-plugin-wdio-webdriver in your Tauri app to use the embedded provider. See Plugin Setup for details.


Choosing a Driver Provider

ProviderPlatform SupportExternal driver requiredNotes
'embedded'Windows, Linux, macOSNoNo external deps; auto-detected on macOS or via TAURI_WEBDRIVER_PORT
'official'Windows, LinuxYes (tauri-driver + platform driver)Explicit opt-in; cargo-installed
'crabnebula'Windows, Linux, macOSYes (platform driver; CN_API_KEY for macOS)Fork of official driver; good fit if already on CrabNebula platform

Recommendation:

  • 'embedded' — simplest setup: no external driver installation, works on all three platforms
  • 'crabnebula' — best if you are already using CrabNebula Cloud or want a single driver config across all platforms; macOS testing requires a CrabNebula subscription
  • 'official' — explicit opt-in for Windows/Linux if you have tauri-driver already installed

embeddedPort (number, optional)

Port for the embedded WebDriver server. Only used when driverProvider: 'embedded'.

  • The service spawns your Tauri app with this port
  • Each worker instance gets a unique port (basePort + workerIndex)
  • Can also be set via the TAURI_WEBDRIVER_PORT or WDIO_EMBEDDED_PORT environment variable. Setting either env var also serves as the auto-detection signal that opts you into the embedded provider on Windows/Linux.

Example:

embeddedPort: 4445

Default: 4445

Note: Port must be available. The service will fail if the port is in use.


crabnebulaDriverPath (string, optional)

Path to the @crabnebula/tauri-driver executable. Only used when driverProvider: 'crabnebula'.

Example:

crabnebulaDriverPath: './node_modules/.bin/tauri-driver'

Default: Auto-detected from node_modules


crabnebulaManageBackend (boolean, optional)

Auto-manage the test-runner-backend process (macOS only). When enabled, the service will automatically start and stop the backend.

Example:

crabnebulaManageBackend: true

Default: true when using CrabNebula on macOS


crabnebulaBackendPort (number, optional)

Port for the test-runner-backend to listen on (macOS only).

Example:

crabnebulaBackendPort: 3000

Default: 3000


Capabilities Configuration

Configure Tauri-specific capabilities in your capabilities array:

Basic Configuration

capabilities: [{
browserName: 'tauri',
'tauri:options': {
application: './src-tauri/target/release/my-app.exe'
}
}]

browserName accepts either 'tauri' (preferred) or 'wry' (the underlying webview library). Both are treated identically by the service.

Full Configuration

capabilities: [{
browserName: 'tauri',
'tauri:options': {
application: './src-tauri/target/release/my-app.exe',
args: ['--debug']
},
// Optional: override service settings per capability
// tauriDriverPort: 4445,
}]

Multiremote Configuration

Run multiple instances of the app:

capabilities: {
app1: {
browserName: 'tauri',
'tauri:options': {
application: './src-tauri/target/release/my-app.exe'
}
},
app2: {
browserName: 'tauri',
'tauri:options': {
application: './src-tauri/target/release/my-app.exe'
}
}
}

Or as array:

capabilities: [
{
browserName: 'tauri',
'tauri:options': {
application: './src-tauri/target/release/my-app.exe'
}
},
{
browserName: 'tauri',
'tauri:options': {
application: './src-tauri/target/release/my-app.exe'
}
}
]

Complete Configuration Example

// wdio.conf.ts
export const config = {
runner: 'local',

// Specs
specs: ['./test/specs/**/*.spec.ts'],
exclude: ['./test/specs/integration/**/*.spec.ts'],

// Parallelization
maxInstances: 1,
maxInstancesPerCapability: 1,

// Tauri Service
services: [
['@wdio/tauri-service', {
appBinaryPath: './src-tauri/target/release/my-app.exe',
appArgs: ['--debug'],
autoInstallTauriDriver: true,
autoDownloadEdgeDriver: true, // Windows only
tauriDriverPort: 4444,
logLevel: 'info',
commandTimeout: 30000,
startTimeout: 30000,
captureBackendLogs: true,
captureFrontendLogs: true,
backendLogLevel: 'debug',
frontendLogLevel: 'debug',
}]
],

// Capabilities
capabilities: [{
browserName: 'tauri',
'tauri:options': {
application: './src-tauri/target/release/my-app.exe',
args: ['--debug']
}
}],

// Connection settings
logLevel: 'info',
bail: 0,
baseUrl: 'http://localhost:4444',
waitforTimeout: 10000,
connectionRetryTimeout: 90000,
connectionRetryCount: 3,

// Framework
framework: 'mocha',
mochaOpts: {
ui: 'bdd',
timeout: 60000
},

// Reporters
reporters: ['spec'],

// Hooks
onPrepare: async (config, capabilities) => {
console.log('Starting test run...');
},

onComplete: async (exitCode, config, capabilities, results) => {
console.log('Test run completed');
}
};

Platform-Specific Configuration

Windows Configuration

Enable auto Edge WebDriver management:

services: [
['@wdio/tauri-service', {
appBinaryPath: './src-tauri/target/release/my-app.exe',
autoDownloadEdgeDriver: true, // Auto-download on version mismatch
}]
]

Linux Configuration

WebKitWebDriver is auto-detected:

services: [
['@wdio/tauri-service', {
appBinaryPath: './src-tauri/target/release/my-app',
autoInstallTauriDriver: true,
}]
]

Headless Configuration (Linux)

Run tests without a display server:

services: [
['@wdio/tauri-service', {
appBinaryPath: './src-tauri/target/release/my-app',
// Xvfb is auto-detected if available (WebdriverIO 9.19.1+)
}]
]

Finding Your appBinaryPath

Windows

Build your app:

cd src-tauri
cargo build --release

Binary is at:

./src-tauri/target/release/my-app.exe

(Replace my-app with your app name from Cargo.toml)

Linux

Build your app:

cd src-tauri
cargo build --release

Binary is at:

./src-tauri/target/release/my-app

(Replace my-app with your app name)

Verify Binary Exists

# Windows
if exist "src-tauri\target\release\my-app.exe" echo "Binary found"

# Linux/macOS
ls -la src-tauri/target/release/my-app

Configuration Validation

Check your configuration with:

# Verify service can be loaded
npx wdio config

# Run with verbose logging
npx wdio run wdio.conf.ts --logLevel debug

Common Configuration Patterns

Development Configuration

export const config = {
// ... other settings
services: [
['@wdio/tauri-service', {
appBinaryPath: './src-tauri/target/release/my-app.exe',
autoInstallTauriDriver: true,
autoDownloadEdgeDriver: true,
captureBackendLogs: true,
captureFrontendLogs: true,
backendLogLevel: 'debug',
frontendLogLevel: 'debug',
logLevel: 'debug',
}]
],
};

CI/CD Configuration

export const config = {
// ... other settings
services: [
['@wdio/tauri-service', {
appBinaryPath: process.env.APP_BINARY || './src-tauri/target/release/my-app.exe',
autoInstallTauriDriver: true,
autoDownloadEdgeDriver: true,
captureBackendLogs: true,
captureFrontendLogs: true,
logLevel: 'info',
}]
],
};

Production-Like Configuration

export const config = {
// ... other settings
services: [
['@wdio/tauri-service', {
appBinaryPath: './src-tauri/target/release/my-app.exe',
autoInstallTauriDriver: false, // Pre-installed
autoDownloadEdgeDriver: false, // Pre-downloaded
captureBackendLogs: false,
captureFrontendLogs: false,
logLevel: 'warn',
}]
],
};

Troubleshooting Configuration Issues

"Cannot find appBinaryPath"

  1. Verify path exists:

    ls -la src-tauri/target/release/my-app*
  2. Build the app first:

    cd src-tauri && cargo build --release
  3. Use absolute path in config:

    appBinaryPath: path.resolve('./src-tauri/target/release/my-app.exe')

"Service not found"

Ensure service is installed:

npm list @wdio/tauri-service

If missing:

npm install --save-dev @wdio/tauri-service

"Port already in use"

Change the tauri-driver port:

tauriDriverPort: 4445  // Instead of 4444

Or enable multiremote with auto-port assignment:

maxInstances: 3  // Each gets unique port

See Also

Welcome! How can I help?

WebdriverIO AI Copilot