testdriverai/testdriverai-testdriver:press-keys
Press keyboard keys and shortcuts
This is a copy. The original lives at testdriverai/testdriver:press-keys.
npx skills add https://github.com/testdriverai/testdriverai --skill testdriver:press-keys
<!-- Generated from press-keys.mdx. DO NOT EDIT. -->
Press one or more keyboard keys simultaneously, useful for keyboard shortcuts, navigation, and special keys.
await testdriver.pressKeys(keys)
<ParamField path="keys" type="Array<string>" required>
Array of keys to press simultaneously
</ParamField>
Promise<void>
'enter', 'tab', 'escape', 'backspace', 'delete''space', 'up', 'down', 'left', 'right''home', 'end', 'pageup', 'pagedown''ctrl', 'alt', 'shift''command' (macOS), 'win' (Windows)'ctrlleft', 'ctrlright', 'shiftleft', 'shiftright''f1' through 'f24'// 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('[email protected]');
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:
'ctrl''command' // 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('[email protected]');
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(['ctrl', 's']);
// Print
await testdriver.pressKeys(['ctrl', 'p']);
// Find in page
await testdriver.pressKeys(['ctrl', 'f']);
await testdriver.type('search term');
await testdriver.pressKeys(['escape']); // Close find
</Accordion>
</AccordionGroup>
import { beforeAll, afterAll, describe, it } from 'vitest';
import TestDriver from 'testdriverai';
describe('Keyboard Navigation', () => {
let testdriver;
beforeAll(async () => {
client = new TestDriver(process.env.TD_API_KEY);
await testdriver.auth();
await testdriver.connect();
});
afterAll(async () => {
await testdriver.disconnect();
});
it('should navigate form with keyboard', async () => {
await testdriver.focusApplication('Google Chrome');
// Find first field
const emailField = await testdriver.find('email input');
await emailField.click();
await testdriver.type('[email protected]');
// Tab through fields
await testdriver.pressKeys(['tab']);
await testdriver.type('John');
await testdriver.pressKeys(['tab']);
await testdriver.type('Doe');
await testdriver.pressKeys(['tab']);
await testdriver.type('password123');
// Submit with Enter
await testdriver.pressKeys(['tab']);
await testdriver.pressKeys(['enter']);
await testdriver.assert('form submitted successfully');
});
it('should use keyboard shortcuts', async () => {
// Open new browser 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']);
await new Promise(r => setTimeout(r, 2000));
// Select all page content
await testdriver.pressKeys(['ctrl', 'a']);
// Copy
await testdriver.pressKeys(['ctrl', 'c']);
// Refresh page
await testdriver.pressKeys(['f5']);
});
});
type() - Type textclick() - Click elementsscroll() - Scroll pagesTake testdriverai/testdriverai-testdriver:press-keys from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.