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
Automatically capture screenshots before and after each command. Screenshots are saved to .testdriver/screenshots/<test>/ with descriptive filenames that include the line number and action name. Format: <seq>-<action>-<phase>-L<line>-<description>.png
Additional environment variables to pass to the sandbox
Global AI sampling configuration. Controls how the AI model generates responses for find() verification and assert() calls. Can be overridden per call. Controls randomness in AI responses. 0 = deterministic (best for verification), higher values = more creative. Default: 0 for find verification, model default for assert.
Nucleus and top-k sampling parameters Top-P (nucleus sampling). Limits token choices to the smallest set whose cumulative probability exceeds P. Lower values = more focused responses. Range: 0-1.
Top-K sampling. Limits token choices to the top K most likely tokens. 1 = always pick the most likely token. 0 = disabled (consider all tokens).
Example
import TestDriver from 'testdriverai' ;
// API key is automatically loaded from TD_API_KEY in .env
const testdriver = new TestDriver ({
os: 'windows' ,
resolution: '1920x1080' ,
logging: true ,
analytics: true
});
// With AI config for stricter verification
const testdriver = new TestDriver ({
ai: { temperature: 0 , top: { p: 0.9 , k: 40 } }
});
// Or pass API key explicitly
const testdriver = new TestDriver ( 'your-api-key' , {
os: 'windows'
});
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)
Preview mode for live test visualization:
"browser" - Opens debugger in default browser (default)
"ide" - Opens preview in IDE panel (VSCode, Cursor - requires TestDriver extension)
"none" - Headless mode, no visual preview
Deprecated : Use preview: "none" instead. 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 ();
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 - API key loaded automatically from .env
testdriver = new TestDriver ({
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 ();
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 ();
} 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. The SDK automatically loads TD_API_KEY from your .env file: TD_API_KEY = your_api_key_here
// API key is loaded automatically - no need to pass it!
const testdriver = new TestDriver ();