Skip to content
Back to skills

Testdriver Client

ASecurity

Create the TestDriver client, authenticate, and connect to a sandbox

  • 243 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 6, 2026
ai-agentsjavascriptjavabashawsdebuggingapi

Works with

  • cursor
  • vscode
  • cli
  • api

Security analysis

A100/100

Scanned September 22, 2026

npx -y skills add testdriverai/testdriverai --skill testdriver-client --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Testdriver Client?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Testdriver Client
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/testdriverai-testdriver-client/badge)](https://www.skillsdirectory.com/skills/testdriverai-testdriver-client)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: testdriver:client
description: Create the TestDriver client, authenticate, and connect to a sandbox
---
<!-- Generated from client.mdx. DO NOT EDIT. -->

## Overview

The `TestDriver` client is the main entry point for the SDK. It does the authentication and the sandbox connection. It gives access to all test methods.

## Constructor

```javascript
const testdriver = new TestDriver(apiKey, options)
```

### Parameters

<ParamField path="apiKey" type="string" required>
  Your TestDriver API key from the [dashboard](https://console.testdriver.ai/settings)
</ParamField>

<ParamField path="options" type="object">
  The configuration options for the client. See [SDK Options](/options) for the full list, with defaults and examples for each option.
</ParamField>

### Example

```javascript
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.

```javascript
await testdriver.auth()
```

**Returns:** `Promise<string>` - Authentication token

**Example:**
```javascript
await testdriver.auth();
```

<Note>
  You must call `auth()` before `connect()`. Most examples call both sequentially.
</Note>

## Connection Management

### connect()

Connect to a sandbox environment. This creates or reconnects to a virtual machine where your tests will run.

```javascript
await testdriver.connect(options)
```

#### Parameters

<ParamField path="options" type="object">
  Connection options
  
  <Expandable title="properties">
    <ParamField path="newSandbox" type="boolean" default="false">
      Force creation of a new sandbox instead of reusing an existing one
    </ParamField>
    
    <ParamField path="sandboxId" type="string">
      Existing sandbox ID to reconnect to
    </ParamField>
    
    <ParamField path="ip" type="string">
      Direct IP address to connect to (for self-hosted sandboxes)
    </ParamField>
    
    <ParamField path="sandboxAmi" type="string">
      AMI to use for the sandbox (AWS deployments)
    </ParamField>
    
    <ParamField path="sandboxInstance" type="string">
      Instance type for the sandbox (AWS deployments)
    </ParamField>
    
    <ParamField path="preview" type="string" default="browser">
      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
    </ParamField>
    
    <ParamField path="headless" type="boolean" default="false">
      **Deprecated**: Use `preview: "none"` instead. Run in headless mode without opening the debugger.
    </ParamField>
    
    <ParamField path="keepAlive" type="number" default="60000">
      Keep sandbox alive for the specified number of milliseconds after disconnect. Set to `0` to terminate immediately on disconnect. Useful for debugging or reconnecting to the same sandbox.
    </ParamField>
  </Expandable>
</ParamField>

**Returns:** `Promise&lt;Object&gt;` - Sandbox instance details including `instanceId`, `ip`, `vncPort`, etc.

#### Examples

**Basic connection:**
```javascript
await testdriver.connect();
```

**Reconnect to existing sandbox:**
```javascript
const instance = await testdriver.connect({ 
  sandboxId: 'existing-sandbox-id-123' 
});
```

**Self-hosted sandbox:**
```javascript
await testdriver.connect({ 
  ip: '192.168.1.100'
});
```

### disconnect()

Disconnect from the sandbox and clean up resources.

```javascript
await testdriver.disconnect()
```

**Returns:** `Promise<void>`

**Example:**
```javascript
afterAll(async () => {
  await testdriver.disconnect();
});
```

## Instance Information

### getInstance()

Get the current sandbox instance details.

```javascript
const instance = testdriver.getInstance()
```

**Returns:** `Object | null` - Sandbox instance information

**Example:**
```javascript
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.

```javascript
const sessionId = testdriver.getSessionId()
```

**Returns:** `string | null` - Session ID

**Example:**
```javascript
const sessionId = testdriver.getSessionId();
console.log('Session:', sessionId);
```

## Logging & Events

### setLogging()

Enable or disable console logging at runtime.

```javascript
testdriver.setLogging(enabled)
```

**Parameters:**
- `enabled` (boolean) - Whether to enable logging

**Example:**
```javascript
// Disable logging for cleanup operations
testdriver.setLogging(false);
await testdriver.disconnect();
testdriver.setLogging(true);
```

### getEmitter()

Get the event emitter for custom event handling.

```javascript
const emitter = testdriver.getEmitter()
```

**Returns:** `EventEmitter2` - Event emitter instance

**Example:**
```javascript
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

```javascript
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

<AccordionGroup>
  <Accordion title="Reuse sandboxes across tests">
    Use `beforeAll`/`afterAll` to create one sandbox per test suite rather than per test. This significantly reduces execution time.
  </Accordion>
  
  <Accordion title="Handle connection errors gracefully">
    Wrap `connect()` in a try-catch block to handle network issues or quota limits:
    
    ```javascript
    try {
      await testdriver.connect();
    } catch (error) {
      console.error('Failed to connect:', error.message);
      throw error;
    }
    ```
  </Accordion>
  
  <Accordion title="Always disconnect">
    Use `afterAll` or try-finally blocks to ensure `disconnect()` is called even if tests fail. This prevents orphaned sandboxes.
  </Accordion>
  
  <Accordion title="Use environment variables for API keys">
    Never hardcode API keys. The SDK automatically loads `TD_API_KEY` from your `.env` file:
    
    ```bash .env
    TD_API_KEY=your_api_key_here
    ```
    
    ```javascript
    // API key is loaded automatically - no need to pass it!
    const testdriver = new TestDriver();
    ```
  </Accordion>
</AccordionGroup>

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…