testdriver-agent
How the TestDriver agent behaves on GitHub issues, pull requests, and @mentions
Press keyboard keys and shortcuts
$ npx -y skills add testdriverai/testdriverai --skill testdriver-press-keys --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/testdriver-press-keysContext preview
The summary Claude sees to decide when to auto-load this skill.
Press keyboard keys and shortcuts
name: testdriver:press-keys description: Press keyboard keys and shortcuts
<!-- Generated from press-keys.mdx. DO NOT EDIT. -->
Push one or more keyboard keys at the same time. Use this for keyboard shortcuts, navigation, and special keys.
await testdriver.pressKeys(keys)
<ParamField path="keys" type="Array<string>" required> An array of the keys to push at the same time </ParamField>
`Promise<void>`
// Tab to next field await testdriver.pressKeys(['tab']); // Shift+Tab to previous field await testdriver.pressKeys(['shift', 'tab']); // Arrow keys await testdriver.pressKeys(['down']); await testdriver.pressKeys(['up']); await testdriver.pressKeys(['left']); await testdriver.pressKeys(['right']); // Home/End await testdriver.pressKeys(['home']); // Start of line await testdriver.pressKeys(['end']); // End of line // Page navigation await testdriver.pressKeys(['pagedown']); await testdriver.pressKeys(['pageup']);
// Copy (Ctrl+C / Cmd+C) await testdriver.pressKeys(['ctrl', 'c']); // Paste (Ctrl+V / Cmd+V) await testdriver.pressKeys(['ctrl', 'v']); // Save (Ctrl+S) await testdriver.pressKeys(['ctrl', 's']); // Select All (Ctrl+A) await testdriver.pressKeys(['ctrl', 'a']); // Undo (Ctrl+Z) await testdriver.pressKeys(['ctrl', 'z']); // Redo (Ctrl+Y) await testdriver.pressKeys(['ctrl', 'y']); // Find (Ctrl+F) await testdriver.pressKeys(['ctrl', 'f']); // New tab (Ctrl+T) await testdriver.pressKeys(['ctrl', 't']); // Close tab (Ctrl+W) await testdriver.pressKeys(['ctrl', 'w']); // Refresh (F5 or Ctrl+R) await testdriver.pressKeys(['f5']); await testdriver.pressKeys(['ctrl', 'r']);
// Alt+Tab (Windows - switch apps) await testdriver.pressKeys(['alt', 'tab']); // Alt+F4 (Windows - close window) await testdriver.pressKeys(['alt', 'f4']); // Win+D (Windows - show desktop) await testdriver.pressKeys(['winleft', 'd']); // Win+L (Windows - lock screen) await testdriver.pressKeys(['winleft', 'l']); // Cmd+Tab (macOS - switch apps) await testdriver.pressKeys(['command', 'tab']); // Cmd+Q (macOS - quit app) await testdriver.pressKeys(['command', 'q']);
// Submit form await testdriver.pressKeys(['enter']); // Cancel/Close await testdriver.pressKeys(['escape']); // Check checkbox await testdriver.pressKeys(['space']);
// Delete selected text await testdriver.pressKeys(['delete']); // Backspace await testdriver.pressKeys(['backspace']); // Select all and delete await testdriver.pressKeys(['ctrl', 'a']); await testdriver.pressKeys(['delete']); // Cut text await testdriver.pressKeys(['ctrl', 'x']);
<Check> **Wait after shortcuts**
Some keyboard shortcuts trigger animations or navigation:
await testdriver.pressKeys(['ctrl', 't']); // New tab await new Promise(r => setTimeout(r, 500)); // Wait for tab await testdriver.pressKeys(['ctrl', 'l']); // Focus URL bar
</Check>
<Check> **Use Tab for form navigation**
Tab is more reliable than clicking multiple fields:
const firstField = await testdriver.find('email input');
await firstField.click();
await testdriver.type('user@example.com');
await testdriver.pressKeys(['tab']);
await testdriver.type('password123');
await testdriver.pressKeys(['tab']);
await testdriver.pressKeys(['enter']); // Submit</Check>
<Warning> **Platform-specific keys**
Use the appropriate modifier key for the platform:
// For cross-platform, you might need to detect OS const modKey = process.platform === 'darwin' ? 'command' : 'ctrl'; await testdriver.pressKeys([modKey, 'c']); // Copy
</Warning>
<AccordionGroup> <Accordion title="Form Navigation">
// Fill form using Tab
const firstField = await testdriver.find('name field');
await firstField.click();
await testdriver.type('John Doe');
await testdriver.pressKeys(['tab']);
await testdriver.type('john@example.com');
await testdriver.pressKeys(['tab']);
await testdriver.type('555-0123');
await testdriver.pressKeys(['tab']);
await testdriver.pressKeys(['enter']); // Submit</Accordion>
<Accordion title="Text Manipulation">
const textArea = await testdriver.find('comment textarea');
await textArea.click();
// Select all existing text
await testdriver.pressKeys(['ctrl', 'a']);
// Copy it
await testdriver.pressKeys(['ctrl', 'c']);
// Type new text
await testdriver.type('New comment');
// Undo if needed
await testdriver.pressKeys(['ctrl', 'z']);</Accordion>
<Accordion title="Browser Navigation">
// Open new tab
await testdriver.pressKeys(['ctrl', 't']);
await new Promise(r => setTimeout(r, 500));
// Focus address bar
await testdriver.pressKeys(['ctrl', 'l']);
await testdriver.type('https://example.com');
await testdriver.pressKeys(['enter']);
// Refresh page
await testdriver.pressKeys(['f5']);
// Close tab
await testdriver.pressKeys(['ctrl', 'w']);</Accordion>
<Accordion title="Application Shortcuts">
// Save document
await testdriver.pressKeys(['cRepo: testdriverai/testdriverai
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