Troubleshooting
Solutions for common issues when testing Dioxus applications with WebdriverIO.
Bridge Issues
"Bridge not available" or execute always returns undefined
The wdio-dioxus-bridge crate is not wired into your app.
Check 1: Bridge crate in dependencies
# Cargo.toml
[dependencies]
wdio-dioxus-bridge = "1"
Check 2: Bridge installed in main.rs
fn main() {
let mut config = dioxus::desktop::Config::new();
#[cfg(debug_assertions)]
{
config = wdio_dioxus_bridge::install(config);
}
dioxus::LaunchBuilder::desktop().with_cfg(config).launch(App);
}
Check 3: Debug build used for testing
The bridge is only compiled in debug builds. Ensure you are using cargo build (not cargo build --release) and the binary path in your config points to target/debug/my_app, not target/release/my_app.
Check 4: Rebuild application
cargo clean
cargo build
See Bridge Setup for the complete installation guide.
Driver Installation Issues
"wdio-dioxus-driver not found" ('external' provider, Windows)
The service cannot find the wdio-dioxus-driver executable.
Solution 1: Enable Auto-Installation
services: [['@wdio/dioxus-service', {
driverProvider: 'external',
autoInstallDioxusDriver: true,
}]]
Solution 2: Manual Installation
cargo install wdio-dioxus-driver
Solution 3: Specify Path Manually
services: [['@wdio/dioxus-service', {
driverProvider: 'external',
dioxusDriverPath: '/custom/path/wdio-dioxus-driver',
}]]
"MSEdgeDriver not found" (Windows, 'external' provider)
Solution 1: Enable Auto-Download
services: [['@wdio/dioxus-service', {
driverProvider: 'external',
autoDownloadEdgeDriver: true, // Default: true
}]]
Solution 2: Manual Download
- Check your WebView2 version (right-click your binary → Properties → Details)
- Download matching MSEdgeDriver from Microsoft Edge WebDriver
- Add to PATH
See Edge WebDriver (Windows) for detailed setup.
Provider Issues
"external provider not supported on Linux"
'external' is blocked on Linux in v1 — an upstream Dioxus PR is pending. Use driverProvider: 'embedded' instead.
services: [['@wdio/dioxus-service', {
driverProvider: 'embedded', // The only supported option on Linux
}]]
"external provider not supported on macOS"
'external' is not supported on macOS. Use driverProvider: 'embedded'.
"No driverProvider configured" or service fails to start
Set driverProvider explicitly:
services: [['@wdio/dioxus-service', {
driverProvider: 'embedded', // Recommended everywhere
}]]
Application Issues
"Application not found at path"
The Dioxus app binary cannot be found.
Solution 1: Verify Binary Exists
ls -la target/debug/my_app # Linux/macOS
dir target\debug\my_app.exe # Windows
Solution 2: Build the Application
cargo build # Debug build (bridge active)
Solution 3: Use Correct Path
services: [['@wdio/dioxus-service', {
appBinaryPath: './target/debug/my_app', // Linux/macOS
// or
appBinaryPath: './target/debug/my_app.exe', // Windows
}]]
Solution 4: Use Absolute Path
import path from 'path';
services: [['@wdio/dioxus-service', {
appBinaryPath: path.resolve('./target/debug/my_app'),
}]]
Debug vs. Release Build Mismatch
The bridge is only compiled into debug builds. If you point appBinaryPath at a release binary, the bridge will not be present and browser.dioxus.execute() will fail.
Always use cargo build (without --release) for testing.
Commands Timing Out
Solution 1: Increase Start Timeout
services: [['@wdio/dioxus-service', {
startTimeout: 60000, // Allow more time for app to start
}]]
Solution 2: Increase Status Poll Timeout
For slow CI environments:
services: [['@wdio/dioxus-service', {
statusPollTimeout: 5000, // Default: 2000
}]]
Solution 3: Wait for App to Be Ready
it('should wait for app', async () => {
await browser.pause(1000);
const element = await browser.$('button');
expect(element).toBeDefined();
});
"Port already in use"
Solution 1: Change Embedded Port
services: [['@wdio/dioxus-service', {
embeddedPort: 4446, // Instead of default 4445
}]]
Solution 2: Kill Process Using Port
# Linux/macOS
lsof -ti:4445 | xargs kill -9
# Windows (PowerShell)
Get-Process -Id (Get-NetTCPConnection -LocalPort 4445).OwningProcess | Stop-Process -Force
Mocking Issues
Mocking Doesn't Work
Check 1: Mock Set Up Before Call
// Correct — mock first, then call
const mock = await browser.dioxus.mock('my_command');
await mock.mockReturnValue('test');
await browser.dioxus.execute(({ invoke }) => invoke('my_command'));
// Wrong — calling before mocking
await browser.dioxus.execute(({ invoke }) => invoke('my_command'));
const mock = await browser.dioxus.mock('my_command');
Check 2: Correct Command Name
// Command name must match exactly what your app passes to invoke()
const mock = await browser.dioxus.mock('get_user');
await mock.mockReturnValue({ id: 1 });
Multi-Window Issues
Window Label Not Found
Error: Window label "settings" not found. Available windows: main
Solution:
// Debug: list available windows
const windows = await browser.dioxus.listWindows();
console.log('Available:', windows);
Verify the window label matches exactly (case-sensitive) and the window is created before your test runs.
Linux Headless Issues
"X11 connection refused" or "Cannot open display"
# Install Xvfb
sudo apt-get install -y xvfb
# Run tests headless
xvfb-run -a npx wdio run wdio.conf.ts