Overview
The TestDriver client is the main entry point for the SDK. It handles authentication, sandbox connection, and provides access to all testing methods.
Constructor
const testdriver = new TestDriver(apiKey, options)
Parameters
Configuration options for the client
Operating system for the sandbox: 'windows' or 'linux'
Screen resolution for the sandbox (e.g., '1920x1080', '1366x768')
apiRoot
string
default:"https://testdriver-api.onrender.com"
API endpoint URL (typically only changed for self-hosted deployments)
Enable or disable usage analytics
Enable or disable console logging
Additional environment variables to pass to the sandbox
Example
import TestDriver from 'testdriverai';
const testdriver = new TestDriver(process.env.TD_API_KEY, {
os: 'windows',
resolution: '1920x1080',
logging: true,
analytics: true
});
Authentication
auth()
Authenticate with the TestDriver API.
Returns: Promise<string> - Authentication token
Example:
You must call auth() before connect(). Most examples call both sequentially.
Connection Management
connect()
Connect to a sandbox environment. This creates or reconnects to a virtual machine where your tests will run.
await testdriver.connect(options)
Parameters
Connection options
Force creation of a new sandbox instead of reusing an existing one
Existing sandbox ID to reconnect to
Direct IP address to connect to (for self-hosted sandboxes)
AMI to use for the sandbox (AWS deployments)
Instance type for the sandbox (AWS deployments)
Run in headless mode without opening the debugger
Returns: Promise<Object> - Sandbox instance details including instanceId, ip, vncPort, etc.
Examples
Basic connection:
await testdriver.connect({ newSandbox: true });
Reconnect to existing sandbox:
const instance = await testdriver.connect({
sandboxId: 'existing-sandbox-id-123'
});
Self-hosted sandbox:
await testdriver.connect({
ip: '192.168.1.100'
});
disconnect()
Disconnect from the sandbox and clean up resources.
await testdriver.disconnect()
Returns: Promise<void>
Example:
afterAll(async () => {
await testdriver.disconnect();
});
getInstance()
Get the current sandbox instance details.
const instance = testdriver.getInstance()
Returns: Object | null - Sandbox instance information
Example:
const instance = testdriver.getInstance();
console.log('Instance ID:', instance.instanceId);
console.log('IP Address:', instance.ip);
getSessionId()
Get the current session ID for tracking and debugging.
const sessionId = testdriver.getSessionId()
Returns: string | null - Session ID
Example:
const sessionId = testdriver.getSessionId();
console.log('Session:', sessionId);
Logging & Events
setLogging()
Enable or disable console logging at runtime.
testdriver.setLogging(enabled)
Parameters:
enabled (boolean) - Whether to enable logging
Example:
// Disable logging for cleanup operations
testdriver.setLogging(false);
await testdriver.disconnect();
testdriver.setLogging(true);
getEmitter()
Get the event emitter for custom event handling.
const emitter = testdriver.getEmitter()
Returns: EventEmitter2 - Event emitter instance
Example:
const emitter = testdriver.getEmitter();
emitter.on('command:start', (data) => {
console.log('Command started:', data);
});
emitter.on('command:success', (data) => {
console.log('Command succeeded:', data);
});
emitter.on('command:error', (error) => {
console.error('Command failed:', error);
});
Complete Example
import { beforeAll, afterAll, describe, it } from 'vitest';
import TestDriver from 'testdriverai';
describe('My Test Suite', () => {
let testdriver;
beforeAll(async () => {
// Initialize client
client = new TestDriver(process.env.TD_API_KEY, {
os: 'windows',
resolution: '1366x768',
logging: true
});
// Set up event listeners
const emitter = testdriver.getEmitter();
emitter.on('log:info', (msg) => console.log('[INFO]', msg));
// Authenticate and connect
await testdriver.auth();
const instance = await testdriver.connect({ newSandbox: true });
console.log('Connected to sandbox:', instance.instanceId);
});
afterAll(async () => {
await testdriver.disconnect();
});
it('runs a test', async () => {
// Your test code here
});
});
Best Practices
Reuse sandboxes across tests
Use beforeAll/afterAll to create one sandbox per test suite rather than per test. This significantly reduces execution time.
Handle connection errors gracefully
Wrap connect() in a try-catch block to handle network issues or quota limits:try {
await testdriver.connect({ newSandbox: true });
} catch (error) {
console.error('Failed to connect:', error.message);
throw error;
}
Use afterAll or try-finally blocks to ensure disconnect() is called even if tests fail. This prevents orphaned sandboxes.
Use environment variables for API keys
Never hardcode API keys. Use environment variables:const testdriver = new TestDriver(process.env.TD_API_KEY);