Skip to main content
With GitHub Copilot and TestDriver’s MCP server, you can create tests by chatting with an AI agent. The agent spawns a virtual machine, executes actions, and writes test code for you.

Start a Conversation

Open GitHub Copilot Chat in VS Code. If your project has no other agents configured, the TestDriver agent is used by default. Otherwise, select testdriver from the agent dropdown in the chat panel. Describe what you want to test:
Create a test that logs into my app at https://myapp.com
The agent will:
  1. Start a new session and spawn a Linux virtual machine
  2. Launch Chrome and navigate to your URL
  3. Execute actions based on your instructions
  4. Write the test code to a .test.mjs file
The TestDriver agent appears in the agent selection dropdown if you have other agents configured (like copilot-instructions.md or other .agent.md files). Make sure to select testdriver to use TestDriver’s MCP tools.

Live Preview Panel

When the agent starts a session, a live preview panel opens in VS Code. This lets you:
  • Watch tests execute in real-time
  • Interact with the VM — click, type, and navigate manually
  • Debug issues — see exactly what the AI sees
The live preview panel requires the TestDriver VS Code extension. Set TD_PREVIEW=ide in your MCP configuration to enable it. See the device configuration docs for all preview options.

Interactive Workflow

The recommended workflow for creating tests:
1

Describe Your Test

Tell the agent what you want to test:
Test the checkout flow on https://shop.example.com
2

Watch and Guide

The agent will start executing. Watch the preview panel and provide guidance if needed:
The login modal appeared. Use test@example.com and password123
3

Add Assertions

Ask the agent to verify specific conditions:
Assert that the order confirmation page is shown with the order number
4

Review the Code

The agent writes test code as it works. Review the generated .test.mjs file and make any adjustments.

Example Conversation

Here’s a complete example of creating a login test:
You: Create a test for the login flow at https://console.testdriver.ai

Agent: I'll create a test for the login flow. Starting a session...
       [Screenshot: Login page loaded]

       I can see the login page. Let me find the email input.
       [Screenshot: Email input highlighted]

       Now I'll type the email and find the password field...

You: Use test@example.com for the email

Agent: Got it. Typing test@example.com...
       [Screenshot: Email entered]

       Now entering the password and clicking Sign In...
       [Screenshot: Dashboard loaded]

       ✅ Login successful! I've written the test to tests/login.test.mjs

Generated Test Code

The agent generates standard Vitest test files:
tests/login.test.mjs
import { describe, expect, it } from "vitest";
import { TestDriver } from "testdriverai/vitest/hooks";

describe("Login Flow", () => {
  it("should log in successfully", async (context) => {
    const testdriver = TestDriver(context);

    await testdriver.provision.chrome({
      url: "https://console.testdriver.ai"
    });

    const emailInput = await testdriver.find("email input field");
    await emailInput.click();
    await testdriver.type("test@example.com");

    const passwordInput = await testdriver.find("password input field");
    await passwordInput.click();
    await testdriver.type("password123");

    const signInButton = await testdriver.find("Sign In button");
    await signInButton.click();

    const result = await testdriver.assert("dashboard is visible");
    expect(result).toBeTruthy();
  });
});

Tips for Better Tests

Instead of “click the button”, say “click the blue Sign In button in the header”. More context helps the AI find the right element.
If your app has animations or loading states, tell the agent to wait:
Wait for the loading spinner to disappear before continuing
Add assertions after each major action to catch regressions early:
Assert that the product was added to the cart
For long workflows, create the test incrementally and verify each step works before moving on.