testdriverai/testdriver:secrets
Securely manage passwords and sensitive data in your tests
npx skills add https://github.com/testdriverai/testdriverai --skill testdriver:secrets
<!-- Generated from secrets.mdx. DO NOT EDIT. -->
Protect sensitive information like passwords, API keys, and tokens in your TestDriver tests.
When typing sensitive information like passwords, use the secret: true option to prevent the value from being logged or stored:
import { test } from 'vitest';
import { chrome } from 'testdriverai/presets';
test('login with secure password', async (context) => {
const { testdriver } = await chrome(context, {
url: 'https://myapp.com/login'
});
await testdriver.find('email input').click();
await testdriver.type(process.env.TD_USERNAME);
await testdriver.find('password input').click();
// Password is masked in logs and recordings
await testdriver.type(process.env.TD_PASSWORD, { secret: true });
await testdriver.find('login button').click();
await testdriver.assert('dashboard is visible');
});
<Note>
When secret: true is set, the typed text appears as in all logs, recordings, and dashcam output.
</Note>
Store sensitive credentials as GitHub repository secrets so they're never exposed in your code:
<Steps>
<Step title="Navigate to Repository Settings">
Go to your GitHub repository → Settings → Secrets and variables → Actions
</Step>
<Step title="Add Repository Secrets">
Click New repository secret and add your secrets:
TD_API_KEY - Your TestDriver API keyTD_USERNAME - Test account usernameTD_PASSWORD - Test account password</Step>
<Step title="Use in GitHub Actions">
Reference secrets in your workflow file:
- name: Run TestDriver tests
env:
TD_API_KEY: ${{ secrets.TD_API_KEY }}
TD_USERNAME: ${{ secrets.TD_USERNAME }}
TD_PASSWORD: ${{ secrets.TD_PASSWORD }}
run: vitest run
</Step>
</Steps>
For local development, store secrets in a .env file:
TD_API_KEY=your_api_key_here
[email protected]
TD_PASSWORD=your_secure_password
<Warning>
Never commit .env files to version control. Add .env to your .gitignore file.
</Warning>
Here's a full login test with proper secrets handling:
import { test, expect } from 'vitest';
import { chrome } from 'testdriverai/presets';
test('secure login flow', async (context) => {
const { testdriver } = await chrome(context, {
url: process.env.TD_WEBSITE || 'https://staging.myapp.com'
});
// Enter username (not sensitive)
await testdriver.find('email input').click();
await testdriver.type(process.env.TD_USERNAME);
// Enter password securely
await testdriver.find('password input').click();
await testdriver.type(process.env.TD_PASSWORD, { secret: true });
// Submit login
await testdriver.find('login button').click();
// Verify successful login
const loggedIn = await testdriver.assert('user is logged in');
expect(loggedIn).toBeTruthy();
});
<Card title="Secrets Best Practices" icon="shield-check">
secret: true when typing passwords, tokens, or sensitive data</Card>
Take testdriverai/testdriver:secrets 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.