testdriver-agent
How the TestDriver agent behaves on GitHub issues, pull requests, and @mentions
Locate and interact with UI elements using AI
Claude Code
$ npx -y skills add testdriverai/testdriverai --skill testdriver-elements --agent claude-code
Codex
$ npx skills add testdriverai/testdriverai --skill testdriver-elements -a codex -y
Cursor
$ npx skills add testdriverai/testdriverai --skill testdriver-elements -a cursor -y
Gemini CLI
$ npx skills add testdriverai/testdriverai --skill testdriver-elements -a gemini-cli -y
GitHub Copilot
$ npx skills add testdriverai/testdriverai --skill testdriver-elements -a github-copilot -y
OpenCode
$ npx skills add testdriverai/testdriverai --skill testdriver-elements -a opencode -y
Windsurf
$ npx skills add testdriverai/testdriverai --skill testdriver-elements -a windsurf -y
name: testdriver:elements description: Locate and interact with UI elements using AI
<!-- Generated from elements.mdx. DO NOT EDIT. -->
The TestDriver element finding system uses AI. It finds elements on the screen with natural language descriptions. The `find()` method returns an `Element` object. You can interact with the object.
Find an element on the screen with a natural language description.
const element = await testdriver.find(description)
**Parameters:**
**Returns:** `Promise<Element>` - The Element instance that TestDriver found
**Example:**
// Find a button
const submitButton = await testdriver.find('the submit button');
// Find an input field with context
const emailField = await testdriver.find('email input field in the login form');
// Find an element by visual characteristics
const redButton = await testdriver.find('red button in the top right corner');<Tip> Be specific in your descriptions. Include visual details, location context, or nearby text to make the accuracy better. </Tip>
The `Element` class represents a located (or to-be-located) UI element. It provides methods for interaction and properties for element information.
Check if the element was successfully located.
element.found()
**Returns:** `boolean` - True if element coordinates were found
**Example:**
const element = await testdriver.find('login button');
if (element.found()) {
await element.click();
} else {
console.log('Element not found');
}Re-locate the element, optionally with a new description.
await element.find(newDescription)
**Parameters:**
**Returns:** `Promise<Element>` - This element instance
**Example:**
// Re-locate if the UI changed
const element = await testdriver.find('submit button');
// ... page updates ...
await element.find(); // Re-locate with same description
// Or update the description
await element.find('blue submit button'); // Now looking for blue buttonClick on the element.
await element.click(action)
**Parameters:**
**Returns:** `Promise<void>`
**Example:**
const button = await testdriver.find('submit button');
await button.click(); // Regular click
const file = await testdriver.find('document.txt');
await file.click('double-click'); // Double-click
const menu = await testdriver.find('settings icon');
await menu.click('right-click'); // Right-click<Note> The element must be found before clicking. The `find()` method automatically locates the element. </Note>
Hover over the element without clicking.
await element.hover()
**Returns:** `Promise<void>`
**Example:**
const tooltip = await testdriver.find('info icon');
await tooltip.hover();
// Wait to see tooltip
await new Promise(resolve => setTimeout(resolve, 1000));Double-click on the element.
await element.doubleClick()
**Returns:** `Promise<void>`
**Example:**
const file = await testdriver.find('README.txt file icon');
await file.doubleClick();Right-click on the element to open context menu.
await element.rightClick()
**Returns:** `Promise<void>`
**Example:**
const folder = await testdriver.find('Documents folder');
await folder.rightClick();Press or release mouse button on the element (for drag operations).
await element.mouseDown() await element.mouseUp()
**Returns:** `Promise<void>`
**Example:**
// Drag and drop
const item = await testdriver.find('draggable item');
await item.mouseDown();
// Move to drop target (using coordinates or another element)
const target = await testdriver.find('drop zone');
await target.hover();
await target.mouseUp();Element properties provide additional information about located elements. Properties are available after a successful `find()` call.
Get the element's coordinates object containing all position information.
const coords = element.getCoordinates() // or access directly element.coordinates
**Returns:** `Object | null` - Coordinate object with `{ x, y, centerX, centerY }`
**Example:**
const button = await testdriver.find('submit button');
const coords = button.coordinates;
if (coords) {
console.log(`Top-left: (${coords.x}, ${coords.y})`);
console.log(`Center: (${coords.centerX}, ${coords.centerY})`);
}Direct access to coordinate values. Always available after successful `find()`.
element.x // Top-left X coordinate (number) element.y // Top-left Y coordinate (number) element.centerX // Center X coordinate (number) element.centerY // Center Y coordinate (number)
**Example:**
const button = await testdriver.find('submit button');
console.log(`Button at: (${button.x}, ${button.y})`);
console.log(`Button center: (${button.centerX}, ${button.centerY})`);
// Use for custom mouse operations
await testdriver.click(button.centerX, button.centerY);Element dimensions in pixels. Available when AI detects element bounds.
element.width // Width in pixels (number | null) element.height // Height in pixels (number | null)
**Example:**
const button = await testdriver.find('submit button');
if (button.width && button.height) {
console.log(`Button size:How the TestDriver agent behaves on GitHub issues, pull requests, and @mentions
Deploy TestDriver on your AWS infrastructure using CloudFormation
How TestDriver learns your app and caches what it discovers for instant, deterministic replays
Produce the "Playwright 1.xx API Review" artifact for a range of commits - the public API additions and the breaking or behavior…
Write, refine, run, and QA promptfoo evaluation suites: promptfooconfig.yaml, prompts, providers, vars, tests, assertions,…
DeepEval evaluation workflow for AI agents and LLM applications. TRIGGER when the user wants to evaluate or improve an AI agent,…