testdriverai 7.1.0 → 7.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +2 -0
- package/.github/workflows/linux-tests.yml +28 -0
- package/agent/index.js +18 -45
- package/agent/interface.js +13 -2
- package/agent/lib/commands.js +1 -1
- package/agent/lib/redraw.js +1 -1
- package/agent/lib/sandbox.js +30 -2
- package/agent/lib/valid-version.js +2 -2
- package/debugger/index.html +1 -1
- package/docs/docs.json +140 -131
- package/docs/v6/getting-started/self-hosting.mdx +3 -2
- package/docs/v7/_drafts/agents.mdx +852 -0
- package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
- package/docs/v7/{guides → _drafts}/caching-selectors.mdx +125 -17
- package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
- package/docs/v7/_drafts/error-handling.mdx +501 -0
- package/docs/v7/_drafts/implementation-plan.mdx +994 -0
- package/docs/v7/_drafts/init-command.mdx +95 -0
- package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
- package/docs/v7/_drafts/plugin-migration.mdx +222 -0
- package/docs/v7/_drafts/prompt-cache.mdx +200 -0
- package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
- package/docs/v7/_drafts/sdk-logging.mdx +222 -0
- package/docs/v7/_drafts/sdk-migration.mdx +474 -0
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
- package/docs/v7/{guides → _drafts}/troubleshooting.mdx +2 -2
- package/docs/v7/{guides → _drafts}/vitest-plugin.mdx +4 -4
- package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
- package/docs/v7/api/client.mdx +1 -1
- package/docs/v7/api/dashcam.mdx +2 -2
- package/docs/v7/api/elements.mdx +143 -41
- package/docs/v7/api/find.mdx +258 -0
- package/docs/v7/api/type.mdx +51 -7
- package/docs/v7/features/ai-native.mdx +427 -0
- package/docs/v7/features/easy-to-write.mdx +351 -0
- package/docs/v7/features/enterprise.mdx +540 -0
- package/docs/v7/features/fast.mdx +424 -0
- package/docs/v7/features/observable.mdx +623 -0
- package/docs/v7/features/powerful.mdx +531 -0
- package/docs/v7/features/scalable.mdx +417 -0
- package/docs/v7/features/stable.mdx +514 -0
- package/docs/v7/getting-started/configuration.mdx +1 -1
- package/docs/v7/getting-started/generating-tests.mdx +525 -0
- package/docs/v7/getting-started/installation.mdx +486 -0
- package/docs/v7/getting-started/quickstart.mdx +51 -5
- package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
- package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
- package/docs/v7/getting-started/writing-tests.mdx +535 -0
- package/docs/v7/overview/what-is-testdriver.mdx +398 -0
- package/docs/v7/playwright.mdx +3 -3
- package/docs/v7/presets/chrome.mdx +16 -0
- package/docs/v7/presets/electron.mdx +18 -0
- package/docs/v7/presets/vscode.mdx +19 -0
- package/examples/run-tests-with-recording.sh +70 -0
- package/examples/screenshot-example.js +63 -0
- package/examples/sdk-awesome-logs-demo.js +177 -0
- package/examples/sdk-cache-thresholds.js +96 -0
- package/examples/sdk-element-properties.js +155 -0
- package/examples/sdk-simple-example.js +65 -0
- package/examples/test-recording-example.test.js +166 -0
- package/interfaces/cli/commands/init.js +358 -0
- package/interfaces/vitest-plugin.mjs +214 -10
- package/{src → lib}/core/Dashcam.js +41 -4
- package/{src → lib}/vitest/hooks.mjs +118 -100
- package/lib/vitest/setup.mjs +44 -0
- package/package.json +9 -10
- package/sdk.d.ts +15 -2
- package/sdk.js +72 -17
- package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
- package/{testdriver/acceptance-sdk → test/manual}/test-console-logs.test.mjs +1 -1
- package/test/manual/test-find-api.js +73 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-prompt-cache.js +96 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/manual/test-sandbox-render.js +28 -0
- package/test/manual/test-sdk-methods.js +15 -0
- package/test/manual/test-sdk-refactor.js +53 -0
- package/test/manual/test-stack-trace.mjs +57 -0
- package/test/testdriver/assert.test.mjs +41 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/auto-cache-key-demo.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +3 -3
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +3 -3
- package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +2 -2
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-text.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +1 -1
- package/{src/vitest/lifecycle.mjs → test/testdriver/setup/lifecycleHelpers.mjs} +84 -99
- package/test/testdriver/setup/testHelpers.mjs +653 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/type.test.mjs +1 -1
- package/vitest.config.mjs +8 -59
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/acceptance-linux.yml +0 -75
- package/.github/workflows/acceptance-sdk-tests.yml +0 -133
- package/.github/workflows/acceptance-tests.yml +0 -130
- package/.github/workflows/lint.yml +0 -27
- package/.github/workflows/publish-canary.yml +0 -40
- package/.github/workflows/publish-latest.yml +0 -61
- package/.github/workflows/test-install.yml +0 -29
- package/.vscode/extensions.json +0 -3
- package/.vscode/launch.json +0 -22
- package/.vscode/settings.json +0 -14
- package/AGENTS.md +0 -550
- package/CODEOWNERS +0 -2
- package/_testdriver/acceptance/assert.yaml +0 -7
- package/_testdriver/acceptance/dashcam.yaml +0 -9
- package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
- package/_testdriver/acceptance/embed.yaml +0 -9
- package/_testdriver/acceptance/exec-js.yaml +0 -29
- package/_testdriver/acceptance/exec-output.yaml +0 -43
- package/_testdriver/acceptance/exec-shell.yaml +0 -40
- package/_testdriver/acceptance/focus-window.yaml +0 -16
- package/_testdriver/acceptance/hover-image.yaml +0 -18
- package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
- package/_testdriver/acceptance/hover-text.yaml +0 -14
- package/_testdriver/acceptance/if-else.yaml +0 -31
- package/_testdriver/acceptance/match-image.yaml +0 -15
- package/_testdriver/acceptance/press-keys.yaml +0 -35
- package/_testdriver/acceptance/prompt.yaml +0 -11
- package/_testdriver/acceptance/remember.yaml +0 -27
- package/_testdriver/acceptance/screenshots/cart.png +0 -0
- package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
- package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
- package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
- package/_testdriver/acceptance/scroll.yaml +0 -33
- package/_testdriver/acceptance/snippets/login.yaml +0 -29
- package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
- package/_testdriver/acceptance/type.yaml +0 -29
- package/_testdriver/behavior/failure.yaml +0 -7
- package/_testdriver/behavior/hover-text.yaml +0 -13
- package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
- package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
- package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
- package/_testdriver/behavior/secrets.yaml +0 -7
- package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
- package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
- package/_testdriver/edge-cases/js-exception.yaml +0 -8
- package/_testdriver/edge-cases/js-promise.yaml +0 -19
- package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
- package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
- package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
- package/_testdriver/edge-cases/success-test.yaml +0 -9
- package/_testdriver/examples/android/example.yaml +0 -12
- package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
- package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
- package/_testdriver/examples/android/readme.md +0 -7
- package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
- package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
- package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
- package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
- package/_testdriver/lifecycle/postrun.yaml +0 -8
- package/_testdriver/lifecycle/prerun.yaml +0 -15
- package/_testdriver/lifecycle/provision.yaml +0 -25
- package/docs/v7/guides/ci-cd/azure.mdx +0 -587
- package/docs/v7/guides/ci-cd/circleci.mdx +0 -523
- package/docs/v7/guides/ci-cd/github-actions.mdx +0 -457
- package/docs/v7/guides/ci-cd/gitlab.mdx +0 -498
- package/docs/v7/guides/ci-cd/jenkins.mdx +0 -664
- package/docs/v7/guides/ci-cd/travis.mdx +0 -438
- package/scripts/view-test-results.mjs +0 -96
- package/src/vitest/extended.mjs +0 -108
- package/src/vitest/index.mjs +0 -64
- package/src/vitest/utils.mjs +0 -150
- package/styles/.vale-config/2-MDX.ini +0 -5
- package/styles/Microsoft/AMPM.yml +0 -9
- package/styles/Microsoft/Accessibility.yml +0 -30
- package/styles/Microsoft/Acronyms.yml +0 -64
- package/styles/Microsoft/Adverbs.yml +0 -272
- package/styles/Microsoft/Auto.yml +0 -11
- package/styles/Microsoft/Avoid.yml +0 -14
- package/styles/Microsoft/Contractions.yml +0 -50
- package/styles/Microsoft/Dashes.yml +0 -13
- package/styles/Microsoft/DateFormat.yml +0 -8
- package/styles/Microsoft/DateNumbers.yml +0 -40
- package/styles/Microsoft/DateOrder.yml +0 -8
- package/styles/Microsoft/Ellipses.yml +0 -9
- package/styles/Microsoft/FirstPerson.yml +0 -16
- package/styles/Microsoft/Foreign.yml +0 -13
- package/styles/Microsoft/Gender.yml +0 -8
- package/styles/Microsoft/GenderBias.yml +0 -42
- package/styles/Microsoft/GeneralURL.yml +0 -11
- package/styles/Microsoft/HeadingAcronyms.yml +0 -7
- package/styles/Microsoft/HeadingColons.yml +0 -8
- package/styles/Microsoft/HeadingPunctuation.yml +0 -13
- package/styles/Microsoft/Headings.yml +0 -28
- package/styles/Microsoft/Hyphens.yml +0 -14
- package/styles/Microsoft/Negative.yml +0 -13
- package/styles/Microsoft/Ordinal.yml +0 -13
- package/styles/Microsoft/OxfordComma.yml +0 -8
- package/styles/Microsoft/Passive.yml +0 -183
- package/styles/Microsoft/Percentages.yml +0 -7
- package/styles/Microsoft/Plurals.yml +0 -7
- package/styles/Microsoft/Quotes.yml +0 -7
- package/styles/Microsoft/RangeTime.yml +0 -13
- package/styles/Microsoft/Semicolon.yml +0 -8
- package/styles/Microsoft/SentenceLength.yml +0 -6
- package/styles/Microsoft/Spacing.yml +0 -8
- package/styles/Microsoft/Suspended.yml +0 -7
- package/styles/Microsoft/Terms.yml +0 -42
- package/styles/Microsoft/URLFormat.yml +0 -9
- package/styles/Microsoft/Units.yml +0 -16
- package/styles/Microsoft/Vocab.yml +0 -25
- package/styles/Microsoft/We.yml +0 -11
- package/styles/Microsoft/Wordiness.yml +0 -127
- package/styles/Microsoft/meta.json +0 -4
- package/styles/alex/Ablist.yml +0 -274
- package/styles/alex/Condescending.yml +0 -16
- package/styles/alex/Gendered.yml +0 -110
- package/styles/alex/LGBTQ.yml +0 -55
- package/styles/alex/OCD.yml +0 -10
- package/styles/alex/Press.yml +0 -12
- package/styles/alex/ProfanityLikely.yml +0 -1289
- package/styles/alex/ProfanityMaybe.yml +0 -282
- package/styles/alex/ProfanityUnlikely.yml +0 -251
- package/styles/alex/README.md +0 -27
- package/styles/alex/Race.yml +0 -85
- package/styles/alex/Suicide.yml +0 -26
- package/styles/alex/meta.json +0 -4
- package/styles/config/vocabularies/Docs/accept.txt +0 -47
- package/styles/config/vocabularies/Docs/reject.txt +0 -4
- package/styles/proselint/Airlinese.yml +0 -8
- package/styles/proselint/AnimalLabels.yml +0 -48
- package/styles/proselint/Annotations.yml +0 -9
- package/styles/proselint/Apologizing.yml +0 -8
- package/styles/proselint/Archaisms.yml +0 -52
- package/styles/proselint/But.yml +0 -8
- package/styles/proselint/Cliches.yml +0 -782
- package/styles/proselint/CorporateSpeak.yml +0 -30
- package/styles/proselint/Currency.yml +0 -5
- package/styles/proselint/Cursing.yml +0 -15
- package/styles/proselint/DateCase.yml +0 -7
- package/styles/proselint/DateMidnight.yml +0 -7
- package/styles/proselint/DateRedundancy.yml +0 -10
- package/styles/proselint/DateSpacing.yml +0 -7
- package/styles/proselint/DenizenLabels.yml +0 -52
- package/styles/proselint/Diacritical.yml +0 -95
- package/styles/proselint/GenderBias.yml +0 -45
- package/styles/proselint/GroupTerms.yml +0 -39
- package/styles/proselint/Hedging.yml +0 -8
- package/styles/proselint/Hyperbole.yml +0 -6
- package/styles/proselint/Jargon.yml +0 -11
- package/styles/proselint/LGBTOffensive.yml +0 -13
- package/styles/proselint/LGBTTerms.yml +0 -15
- package/styles/proselint/Malapropisms.yml +0 -8
- package/styles/proselint/Needless.yml +0 -358
- package/styles/proselint/Nonwords.yml +0 -38
- package/styles/proselint/Oxymorons.yml +0 -22
- package/styles/proselint/P-Value.yml +0 -6
- package/styles/proselint/RASSyndrome.yml +0 -30
- package/styles/proselint/README.md +0 -12
- package/styles/proselint/Skunked.yml +0 -13
- package/styles/proselint/Spelling.yml +0 -17
- package/styles/proselint/Typography.yml +0 -11
- package/styles/proselint/Uncomparables.yml +0 -50
- package/styles/proselint/Very.yml +0 -6
- package/styles/proselint/meta.json +0 -15
- package/styles/write-good/Cliches.yml +0 -702
- package/styles/write-good/E-Prime.yml +0 -32
- package/styles/write-good/Illusions.yml +0 -11
- package/styles/write-good/Passive.yml +0 -183
- package/styles/write-good/README.md +0 -27
- package/styles/write-good/So.yml +0 -5
- package/styles/write-good/ThereIs.yml +0 -6
- package/styles/write-good/TooWordy.yml +0 -221
- package/styles/write-good/Weasel.yml +0 -29
- package/styles/write-good/meta.json +0 -4
- package/test/dashcam.test.js +0 -137
- package/test/mcp-example-test.yaml +0 -27
- package/test/test_parser.js +0 -47
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
- package/testdriver/acceptance-sdk/README.md +0 -128
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
- package/testdriver/acceptance-sdk/assert.test.mjs +0 -26
- package/testdriver/acceptance-sdk/hooks-example.test.mjs +0 -38
- package/testdriver/acceptance-sdk/presets-example.test.mjs +0 -87
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +0 -420
- package/testdriver/acceptance-sdk/sully-ai.test.mjs +0 -234
- package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
- package/vale.ini +0 -18
- package/vitest.config.example.js +0 -19
- package/vitest.config.mjs.bak +0 -44
- /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
- /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/best-practices.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/caching-ai.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/caching.mdx +0 -0
- /package/docs/{MIGRATION.md → v7/_drafts/cli-to-sdk-migration.mdx} +0 -0
- /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
- /package/docs/v7/{progressive-apis/CORE.md → _drafts/core.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/debugging.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/faq.mdx +0 -0
- /package/docs/v7/{progressive-apis/HOOKS.md → _drafts/hooks.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/performance.mdx +0 -0
- /package/docs/{PRESETS.md → v7/_drafts/presets.mdx} +0 -0
- /package/docs/v7/{progressive-apis/PROGRESSIVE_DISCLOSURE.md → _drafts/progressive-disclosure.mdx} +0 -0
- /package/docs/v7/{progressive-apis/PROVISION.md → _drafts/provision.mdx} +0 -0
- /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
- /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
- /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/vitest.mdx +0 -0
- /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
- /package/{src → lib}/core/index.d.ts +0 -0
- /package/{src → lib}/core/index.js +0 -0
- /package/{src → lib}/presets/index.mjs +0 -0
- /package/{src → lib}/vitest/hooks.d.ts +0 -0
- /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
- /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
- /package/{verify-types.js → test/manual/verify-types.js} +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/chrome-extension.test.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "AI-Native"
|
|
3
|
+
description: "Built specifically for AI agents and autonomous testing"
|
|
4
|
+
icon: "robot"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
TestDriver is designed from the ground up to be used by AI agents, enabling autonomous test creation, execution, and debugging.
|
|
8
|
+
|
|
9
|
+
## AI Agent Support
|
|
10
|
+
|
|
11
|
+
Complete guide for AI agents with autonomous operation patterns:
|
|
12
|
+
|
|
13
|
+
<Card title="agents.md - AI Agent Guide" icon="book" href="/agents.md">
|
|
14
|
+
Comprehensive documentation specifically for AI agents, including:
|
|
15
|
+
|
|
16
|
+
- Quick setup and authentication
|
|
17
|
+
- Provision methods (chrome, vscode, electron)
|
|
18
|
+
- Core API methods with examples
|
|
19
|
+
- Sandbox reconnection patterns
|
|
20
|
+
- Debugging failed finds
|
|
21
|
+
- Iterative selector refinement
|
|
22
|
+
- Best practices for autonomous operation
|
|
23
|
+
</Card>
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
// AI agents can autonomously write and run tests
|
|
27
|
+
import { test } from 'vitest';
|
|
28
|
+
import { chrome } from 'testdriverai/presets';
|
|
29
|
+
|
|
30
|
+
test('ai-generated test', async (context) => {
|
|
31
|
+
const { testdriver } = await chrome(context, {
|
|
32
|
+
url: 'https://example.com'
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
await testdriver.find('More information link').click();
|
|
36
|
+
await testdriver.assert('IANA page is visible');
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Natural Language Everything
|
|
41
|
+
|
|
42
|
+
AI-powered element location, assertions, and instructions:
|
|
43
|
+
|
|
44
|
+
<Tabs>
|
|
45
|
+
<Tab title="Element Location">
|
|
46
|
+
```javascript
|
|
47
|
+
// Describe elements naturally
|
|
48
|
+
await testdriver.find('submit button');
|
|
49
|
+
await testdriver.find('email input in the login form');
|
|
50
|
+
await testdriver.find('delete button in the top right corner');
|
|
51
|
+
await testdriver.find('first product card in the grid');
|
|
52
|
+
```
|
|
53
|
+
</Tab>
|
|
54
|
+
|
|
55
|
+
<Tab title="Assertions">
|
|
56
|
+
```javascript
|
|
57
|
+
// Assert application state naturally
|
|
58
|
+
await testdriver.assert('the login page is displayed');
|
|
59
|
+
await testdriver.assert('success message says "Welcome back"');
|
|
60
|
+
await testdriver.assert('the form is empty');
|
|
61
|
+
await testdriver.assert('the button is blue and enabled');
|
|
62
|
+
await testdriver.assert('loading spinner is not visible');
|
|
63
|
+
```
|
|
64
|
+
</Tab>
|
|
65
|
+
|
|
66
|
+
<Tab title="Instructions">
|
|
67
|
+
```javascript
|
|
68
|
+
// Complex interactions described naturally
|
|
69
|
+
await testdriver.find('Products menu').hover();
|
|
70
|
+
await testdriver.find('Laptops submenu item in the Products dropdown').click();
|
|
71
|
+
await testdriver.find('Sort by dropdown').click();
|
|
72
|
+
await testdriver.find('Price: Low to High option').click();
|
|
73
|
+
```
|
|
74
|
+
</Tab>
|
|
75
|
+
</Tabs>
|
|
76
|
+
|
|
77
|
+
## Iterative Selector Refinement
|
|
78
|
+
|
|
79
|
+
AI agents can iteratively refine selectors when initial attempts fail:
|
|
80
|
+
|
|
81
|
+
```javascript
|
|
82
|
+
test('iterative debugging', async (context) => {
|
|
83
|
+
const testdriver = new TestDriver({
|
|
84
|
+
apiKey: process.env.TD_API_KEY
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const instance = await testdriver.connect();
|
|
88
|
+
const sandboxId = instance.instanceId;
|
|
89
|
+
|
|
90
|
+
// Try multiple selector variations
|
|
91
|
+
const selectors = [
|
|
92
|
+
'submit button',
|
|
93
|
+
'blue submit button',
|
|
94
|
+
'submit button in bottom right',
|
|
95
|
+
'button with "Submit" text',
|
|
96
|
+
'primary action button'
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
for (const selector of selectors) {
|
|
100
|
+
try {
|
|
101
|
+
console.log(`Trying: ${selector}`);
|
|
102
|
+
const element = await testdriver.find(selector);
|
|
103
|
+
console.log(`✓ Found with: ${selector}`);
|
|
104
|
+
await element.click();
|
|
105
|
+
break; // Success!
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.log(`✗ Failed with: ${selector}`);
|
|
108
|
+
console.log(` Similarity: ${error.similarity}`);
|
|
109
|
+
console.log(` Confidence: ${error.confidence}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
await testdriver.disconnect();
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
<Tip>
|
|
118
|
+
AI agents can analyze error similarity scores to refine subsequent selector attempts intelligently.
|
|
119
|
+
</Tip>
|
|
120
|
+
|
|
121
|
+
## Sandbox Reconnection
|
|
122
|
+
|
|
123
|
+
AI agents can reconnect to sandboxes for debugging:
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
// Initial test attempt
|
|
127
|
+
test('initial attempt', async () => {
|
|
128
|
+
const testdriver = new TestDriver({
|
|
129
|
+
apiKey: process.env.TD_API_KEY
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
const instance = await testdriver.connect();
|
|
133
|
+
console.log('Sandbox ID:', instance.instanceId);
|
|
134
|
+
// Save this ID for reconnection
|
|
135
|
+
|
|
136
|
+
try {
|
|
137
|
+
await testdriver.find('difficult selector').click();
|
|
138
|
+
} catch (error) {
|
|
139
|
+
console.error('Failed:', error);
|
|
140
|
+
// Keep sandbox alive for debugging
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// Reconnect to same sandbox
|
|
145
|
+
test('reconnect attempt', async () => {
|
|
146
|
+
const testdriver = new TestDriver({
|
|
147
|
+
apiKey: process.env.TD_API_KEY
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// Read last sandbox ID
|
|
151
|
+
const lastSandboxId = testdriver.getLastSandboxId();
|
|
152
|
+
|
|
153
|
+
// Reconnect
|
|
154
|
+
await testdriver.connect({
|
|
155
|
+
sandboxId: lastSandboxId,
|
|
156
|
+
newSandbox: false
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// Try alternative selector
|
|
160
|
+
await testdriver.find('alternative selector').click();
|
|
161
|
+
|
|
162
|
+
await testdriver.disconnect();
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
<Card title="Automatic Sandbox Tracking" icon="bookmark">
|
|
167
|
+
TestDriver saves the last sandbox ID to `.testdriver/last-sandbox` automatically. AI agents can read this file to reconnect without manual ID tracking.
|
|
168
|
+
</Card>
|
|
169
|
+
|
|
170
|
+
## Error Analysis
|
|
171
|
+
|
|
172
|
+
Rich error information for AI agents to analyze and adapt:
|
|
173
|
+
|
|
174
|
+
```javascript
|
|
175
|
+
try {
|
|
176
|
+
await testdriver.find('non-existent button').click();
|
|
177
|
+
} catch (error) {
|
|
178
|
+
// Rich error information for AI analysis
|
|
179
|
+
console.log('Error type:', error.name); // 'ElementNotFoundError'
|
|
180
|
+
console.log('Message:', error.message);
|
|
181
|
+
console.log('Similarity score:', error.similarity); // 0.72
|
|
182
|
+
console.log('Confidence:', error.confidence); // 0.81
|
|
183
|
+
console.log('Debug screenshot:', error.debugScreenshot); // Base64
|
|
184
|
+
console.log('Cache info:', error.cacheInfo);
|
|
185
|
+
console.log('Attempted prompt:', error.prompt);
|
|
186
|
+
|
|
187
|
+
// AI can analyze and adapt
|
|
188
|
+
if (error.similarity > 0.7) {
|
|
189
|
+
// Close match, try more specific selector
|
|
190
|
+
await testdriver.find('blue submit button in bottom right').click();
|
|
191
|
+
} else {
|
|
192
|
+
// No close match, try completely different approach
|
|
193
|
+
await testdriver.find('primary action button').click();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Autonomous Test Generation
|
|
199
|
+
|
|
200
|
+
AI agents can generate entire test suites:
|
|
201
|
+
|
|
202
|
+
```javascript
|
|
203
|
+
// AI agent generates tests from requirements
|
|
204
|
+
const requirements = `
|
|
205
|
+
Test the login flow:
|
|
206
|
+
1. Navigate to login page
|
|
207
|
+
2. Enter valid credentials
|
|
208
|
+
3. Click submit
|
|
209
|
+
4. Verify dashboard appears
|
|
210
|
+
`;
|
|
211
|
+
|
|
212
|
+
// Agent generates:
|
|
213
|
+
test('user can login', async (context) => {
|
|
214
|
+
const { testdriver } = await chrome(context, {
|
|
215
|
+
url: 'https://myapp.com/login'
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
await testdriver.find('email input').type('user@example.com');
|
|
219
|
+
await testdriver.find('password input').type('password', { secret: true });
|
|
220
|
+
await testdriver.find('Login button').click();
|
|
221
|
+
|
|
222
|
+
await testdriver.assert('Dashboard is visible');
|
|
223
|
+
});
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## MCP Integration (Coming Soon)
|
|
227
|
+
|
|
228
|
+
Query test infrastructure using natural language:
|
|
229
|
+
|
|
230
|
+
```javascript
|
|
231
|
+
// Future MCP interactivity
|
|
232
|
+
await testdriver.mcp.query("What is the CPU usage of my app?");
|
|
233
|
+
await testdriver.mcp.query("Show me memory leaks in the last test run");
|
|
234
|
+
await testdriver.mcp.query("What tests are flakiest this week?");
|
|
235
|
+
await testdriver.mcp.query("Compare performance between branches");
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
<Note>
|
|
239
|
+
MCP (Model Context Protocol) integration is planned for Q1 2025.
|
|
240
|
+
</Note>
|
|
241
|
+
|
|
242
|
+
## AI-Powered Debugging
|
|
243
|
+
|
|
244
|
+
TestDriver provides intelligent debugging assistance:
|
|
245
|
+
|
|
246
|
+
<AccordionGroup>
|
|
247
|
+
<Accordion title="Similarity Scoring">
|
|
248
|
+
```javascript
|
|
249
|
+
// AI analyzes how close the match was
|
|
250
|
+
try {
|
|
251
|
+
await testdriver.find('submit button');
|
|
252
|
+
} catch (error) {
|
|
253
|
+
if (error.similarity > 0.8) {
|
|
254
|
+
console.log('Very close match - likely wrong selector specificity');
|
|
255
|
+
} else if (error.similarity > 0.5) {
|
|
256
|
+
console.log('Partial match - element might be present but different');
|
|
257
|
+
} else {
|
|
258
|
+
console.log('No match - element likely not on screen');
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
</Accordion>
|
|
263
|
+
|
|
264
|
+
<Accordion title="Visual Debugging">
|
|
265
|
+
```javascript
|
|
266
|
+
// Get debug screenshot for AI analysis
|
|
267
|
+
try {
|
|
268
|
+
await testdriver.find('button');
|
|
269
|
+
} catch (error) {
|
|
270
|
+
// AI can analyze the debug screenshot
|
|
271
|
+
const screenshot = error.debugScreenshot; // Base64 image
|
|
272
|
+
// Send to vision model for analysis
|
|
273
|
+
const analysis = await visionModel.analyze(screenshot,
|
|
274
|
+
"Why can't we find the submit button?"
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
</Accordion>
|
|
279
|
+
|
|
280
|
+
<Accordion title="Cache Diagnostics">
|
|
281
|
+
```javascript
|
|
282
|
+
// Understand cache behavior
|
|
283
|
+
try {
|
|
284
|
+
await testdriver.find('element');
|
|
285
|
+
} catch (error) {
|
|
286
|
+
console.log('Cache info:', error.cacheInfo);
|
|
287
|
+
// {
|
|
288
|
+
// cacheKey: 'abc123',
|
|
289
|
+
// cacheHit: false,
|
|
290
|
+
// similarEntries: 3,
|
|
291
|
+
// bestSimilarity: 0.87,
|
|
292
|
+
// reason: 'threshold_not_met'
|
|
293
|
+
// }
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
</Accordion>
|
|
297
|
+
</AccordionGroup>
|
|
298
|
+
|
|
299
|
+
## Programmatic Control
|
|
300
|
+
|
|
301
|
+
AI agents have full programmatic control:
|
|
302
|
+
|
|
303
|
+
```javascript
|
|
304
|
+
// Dynamic test generation
|
|
305
|
+
const testCases = [
|
|
306
|
+
{ email: 'user1@example.com', password: 'pass1', shouldSucceed: true },
|
|
307
|
+
{ email: 'invalid', password: 'pass2', shouldSucceed: false },
|
|
308
|
+
{ email: 'user3@example.com', password: 'wrong', shouldSucceed: false },
|
|
309
|
+
];
|
|
310
|
+
|
|
311
|
+
for (const testCase of testCases) {
|
|
312
|
+
test(`login with ${testCase.email}`, async (context) => {
|
|
313
|
+
const { testdriver } = await chrome(context, { url });
|
|
314
|
+
|
|
315
|
+
await testdriver.find('email input').type(testCase.email);
|
|
316
|
+
await testdriver.find('password input').type(testCase.password, { secret: true });
|
|
317
|
+
await testdriver.find('submit').click();
|
|
318
|
+
|
|
319
|
+
if (testCase.shouldSucceed) {
|
|
320
|
+
await testdriver.assert('dashboard is visible');
|
|
321
|
+
} else {
|
|
322
|
+
await testdriver.assert('error message is displayed');
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## Learning & Adaptation
|
|
329
|
+
|
|
330
|
+
TestDriver learns from test executions:
|
|
331
|
+
|
|
332
|
+
<Card title="AI Understanding of Your App" icon="brain">
|
|
333
|
+
The cache system builds a visual understanding over time:
|
|
334
|
+
|
|
335
|
+
- Element location patterns
|
|
336
|
+
- UI component relationships
|
|
337
|
+
- Common interaction flows
|
|
338
|
+
- Stability characteristics
|
|
339
|
+
- Performance baselines
|
|
340
|
+
|
|
341
|
+
This enables:
|
|
342
|
+
- Faster subsequent executions
|
|
343
|
+
- Better error messages
|
|
344
|
+
- Intelligent suggestions
|
|
345
|
+
- Anomaly detection
|
|
346
|
+
</Card>
|
|
347
|
+
|
|
348
|
+
## Best Practices for AI Agents
|
|
349
|
+
|
|
350
|
+
<AccordionGroup>
|
|
351
|
+
<Accordion title="1. Use Descriptive Selectors">
|
|
352
|
+
```javascript
|
|
353
|
+
// ✅ Good - specific and contextual
|
|
354
|
+
await testdriver.find('blue submit button below the login form');
|
|
355
|
+
|
|
356
|
+
// ❌ Bad - too vague
|
|
357
|
+
await testdriver.find('button');
|
|
358
|
+
```
|
|
359
|
+
</Accordion>
|
|
360
|
+
|
|
361
|
+
<Accordion title="2. Always Use secret: true for Passwords">
|
|
362
|
+
```javascript
|
|
363
|
+
// ✅ Protected from logging
|
|
364
|
+
await testdriver.type('MyPassword123', { secret: true });
|
|
365
|
+
|
|
366
|
+
// ❌ Password will be logged
|
|
367
|
+
await testdriver.type('MyPassword123');
|
|
368
|
+
```
|
|
369
|
+
</Accordion>
|
|
370
|
+
|
|
371
|
+
<Accordion title="3. Handle Errors Gracefully">
|
|
372
|
+
```javascript
|
|
373
|
+
// ✅ Try alternative approaches
|
|
374
|
+
try {
|
|
375
|
+
await testdriver.find('optional element').click();
|
|
376
|
+
} catch (error) {
|
|
377
|
+
console.log('Element not found, trying alternative...');
|
|
378
|
+
await testdriver.find('alternative element').click();
|
|
379
|
+
}
|
|
380
|
+
```
|
|
381
|
+
</Accordion>
|
|
382
|
+
|
|
383
|
+
<Accordion title="4. Save Sandbox IDs">
|
|
384
|
+
```javascript
|
|
385
|
+
// ✅ Enable reconnection
|
|
386
|
+
const instance = await testdriver.connect();
|
|
387
|
+
console.log('Sandbox ID:', instance.instanceId);
|
|
388
|
+
// Save for debugging later
|
|
389
|
+
```
|
|
390
|
+
</Accordion>
|
|
391
|
+
</AccordionGroup>
|
|
392
|
+
|
|
393
|
+
## Learn More
|
|
394
|
+
|
|
395
|
+
<CardGroup cols={2}>
|
|
396
|
+
<Card
|
|
397
|
+
title="AI Agent Guide"
|
|
398
|
+
icon="robot"
|
|
399
|
+
href="/agents.md"
|
|
400
|
+
>
|
|
401
|
+
Complete guide for AI agents
|
|
402
|
+
</Card>
|
|
403
|
+
|
|
404
|
+
<Card
|
|
405
|
+
title="API Reference"
|
|
406
|
+
icon="code"
|
|
407
|
+
href="/v7/api/client"
|
|
408
|
+
>
|
|
409
|
+
Full API documentation
|
|
410
|
+
</Card>
|
|
411
|
+
|
|
412
|
+
<Card
|
|
413
|
+
title="Error Handling"
|
|
414
|
+
icon="triangle-exclamation"
|
|
415
|
+
href="/v7/guides/error-handling"
|
|
416
|
+
>
|
|
417
|
+
Handle errors effectively
|
|
418
|
+
</Card>
|
|
419
|
+
|
|
420
|
+
<Card
|
|
421
|
+
title="Debugging Guide"
|
|
422
|
+
icon="bug"
|
|
423
|
+
href="/v7/guides/debugging"
|
|
424
|
+
>
|
|
425
|
+
Debug failing tests
|
|
426
|
+
</Card>
|
|
427
|
+
</CardGroup>
|