testdriverai 7.0.0 → 7.1.1
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/README.md +126 -0
- package/agent/index.js +7 -9
- package/agent/interface.js +13 -2
- package/agent/lib/commands.js +795 -136
- package/agent/lib/redraw.js +124 -39
- package/agent/lib/sandbox.js +40 -3
- package/agent/lib/sdk.js +21 -0
- package/agent/lib/valid-version.js +2 -2
- package/debugger/index.html +1 -1
- package/docs/docs.json +86 -71
- package/docs/guide/best-practices-polling.mdx +154 -0
- 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/_drafts/best-practices.mdx +486 -0
- package/docs/v7/_drafts/caching-ai.mdx +215 -0
- package/docs/v7/_drafts/caching-selectors.mdx +400 -0
- package/docs/v7/_drafts/caching.mdx +366 -0
- package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
- package/docs/v7/_drafts/core.mdx +459 -0
- package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
- package/docs/v7/_drafts/debugging.mdx +349 -0
- package/docs/v7/_drafts/error-handling.mdx +501 -0
- package/docs/v7/_drafts/faq.mdx +393 -0
- package/docs/v7/_drafts/hooks.mdx +360 -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/performance.mdx +517 -0
- package/docs/v7/_drafts/presets.mdx +210 -0
- package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
- package/docs/v7/_drafts/provision.mdx +266 -0
- package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
- package/docs/v7/_drafts/troubleshooting.mdx +526 -0
- package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
- package/docs/v7/_drafts/vitest.mdx +535 -0
- package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
- package/docs/v7/api/client.mdx +1 -1
- package/docs/v7/api/dashcam.mdx +497 -0
- package/docs/v7/api/doubleClick.mdx +102 -0
- package/docs/v7/api/elements.mdx +143 -41
- package/docs/v7/api/find.mdx +258 -0
- package/docs/v7/api/mouseDown.mdx +161 -0
- package/docs/v7/api/mouseUp.mdx +164 -0
- package/docs/v7/api/rightClick.mdx +123 -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 +380 -0
- 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 +320 -141
- 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/platforms/linux.mdx +308 -0
- package/docs/v7/platforms/macos.mdx +433 -0
- package/docs/v7/platforms/windows.mdx +430 -0
- package/docs/v7/playwright.mdx +3 -3
- package/docs/v7/presets/chrome-extension.mdx +223 -0
- package/docs/v7/presets/chrome.mdx +303 -0
- package/docs/v7/presets/electron.mdx +453 -0
- package/docs/v7/presets/vscode.mdx +417 -0
- package/docs/v7/presets/webapp.mdx +396 -0
- package/examples/run-tests-with-recording.sh +2 -2
- package/interfaces/cli/commands/init.js +358 -0
- package/interfaces/vitest-plugin.mjs +393 -103
- package/lib/core/Dashcam.js +506 -0
- package/lib/core/index.d.ts +150 -0
- package/lib/core/index.js +12 -0
- package/lib/presets/index.mjs +331 -0
- package/lib/vitest/hooks.d.ts +119 -0
- package/lib/vitest/hooks.mjs +316 -0
- package/lib/vitest/setup.mjs +44 -0
- package/package.json +13 -3
- package/sdk.d.ts +350 -44
- package/sdk.js +818 -105
- package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
- package/test/manual/test-console-logs.test.mjs +42 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/testdriver/assert.test.mjs +41 -0
- package/test/testdriver/auto-cache-key-demo.test.mjs +56 -0
- package/test/testdriver/chrome-extension.test.mjs +89 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +6 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +6 -18
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +9 -21
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +14 -26
- package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +8 -20
- package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +5 -20
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +10 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +5 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +5 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +6 -20
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +6 -18
- package/test/testdriver/scroll-until-text.test.mjs +28 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +12 -21
- package/test/testdriver/setup/lifecycleHelpers.mjs +262 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/setup/testHelpers.mjs +25 -20
- package/test/testdriver/type.test.mjs +45 -0
- package/vitest.config.mjs +11 -56
- 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/mcp.json +0 -9
- package/.vscode/settings.json +0 -14
- package/CODEOWNERS +0 -3
- package/MIGRATION.md +0 -389
- package/SDK_README.md +0 -1122
- 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/debug-screenshot-1763401388589.png +0 -0
- package/mcp-server/AI_GUIDELINES.md +0 -57
- package/scripts/view-test-results.mjs +0 -96
- 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/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 -44
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +0 -42
- package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
- package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
- package/testdriver/acceptance-sdk/type.test.mjs +0 -84
- 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/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
- /package/{PLUGIN_MIGRATION.md → docs/v7/_drafts/plugin-migration.mdx} +0 -0
- /package/{PROMPT_CACHE.md → docs/v7/_drafts/prompt-cache.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/{SDK_LOGGING.md → docs/v7/_drafts/sdk-logging.mdx} +0 -0
- /package/{SDK_MIGRATION.md → docs/v7/_drafts/sdk-migration.mdx} +0 -0
- /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
- /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
- /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
- /package/{test-find-api.js → test/manual/test-find-api.js} +0 -0
- /package/{test-prompt-cache.js → test/manual/test-prompt-cache.js} +0 -0
- /package/{test-sandbox-render.js → test/manual/test-sandbox-render.js} +0 -0
- /package/{test-sdk-methods.js → test/manual/test-sdk-methods.js} +0 -0
- /package/{test-sdk-refactor.js → test/manual/test-sdk-refactor.js} +0 -0
- /package/{test-stack-trace.mjs → test/manual/test-stack-trace.mjs} +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}/setup/globalTeardown.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "What is TestDriver?"
|
|
3
|
+
description: "AI-powered end-to-end testing for web, desktop, and mobile applications"
|
|
4
|
+
icon: "circle-info"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
TestDriver is an AI-native testing platform that lets you write tests in natural language. It uses computer vision and AI to understand your application like a human would, eliminating brittle selectors and making tests easy to write and maintain.
|
|
8
|
+
|
|
9
|
+
## The Problem with Traditional Testing
|
|
10
|
+
|
|
11
|
+
Traditional E2E testing tools require:
|
|
12
|
+
|
|
13
|
+
<CardGroup cols={2}>
|
|
14
|
+
<Card title="Brittle Selectors" icon="triangle-exclamation">
|
|
15
|
+
```javascript
|
|
16
|
+
// ❌ Breaks when DOM changes
|
|
17
|
+
await page.click('#root > div > form > div:nth-child(2) > button')
|
|
18
|
+
```
|
|
19
|
+
</Card>
|
|
20
|
+
|
|
21
|
+
<Card title="Complex Setup" icon="wrench">
|
|
22
|
+
```javascript
|
|
23
|
+
// ❌ Manual lifecycle management
|
|
24
|
+
await browser.launch()
|
|
25
|
+
await page.goto(url)
|
|
26
|
+
try {
|
|
27
|
+
// Test code
|
|
28
|
+
} finally {
|
|
29
|
+
await browser.close()
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
</Card>
|
|
33
|
+
|
|
34
|
+
<Card title="Flaky Tests" icon="shuffle">
|
|
35
|
+
```javascript
|
|
36
|
+
// ❌ Arbitrary waits
|
|
37
|
+
await page.click('button')
|
|
38
|
+
await page.waitForTimeout(1000)
|
|
39
|
+
await page.click('.dropdown-item')
|
|
40
|
+
```
|
|
41
|
+
</Card>
|
|
42
|
+
|
|
43
|
+
<Card title="Limited Scope" icon="ban">
|
|
44
|
+
Most tools only work for web browsers. Testing desktop apps, extensions, or IDEs requires completely different frameworks.
|
|
45
|
+
</Card>
|
|
46
|
+
</CardGroup>
|
|
47
|
+
|
|
48
|
+
## The TestDriver Solution
|
|
49
|
+
|
|
50
|
+
TestDriver solves these problems with AI-powered testing:
|
|
51
|
+
|
|
52
|
+
<CodeGroup>
|
|
53
|
+
```javascript TestDriver - Natural & Simple
|
|
54
|
+
import { test } from 'vitest';
|
|
55
|
+
import { chrome } from 'testdriverai/presets';
|
|
56
|
+
|
|
57
|
+
test('user can login', async (context) => {
|
|
58
|
+
const { testdriver } = await chrome(context, {
|
|
59
|
+
url: 'https://myapp.com/login'
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
await testdriver.find('email input').type('user@example.com');
|
|
63
|
+
await testdriver.find('password input').type('secret', { secret: true });
|
|
64
|
+
await testdriver.find('Login button').click();
|
|
65
|
+
|
|
66
|
+
await testdriver.assert('Dashboard is visible');
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```javascript Traditional - Complex & Brittle
|
|
71
|
+
import puppeteer from 'puppeteer';
|
|
72
|
+
|
|
73
|
+
test('user can login', async () => {
|
|
74
|
+
const browser = await puppeteer.launch();
|
|
75
|
+
const page = await browser.newPage();
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
await page.goto('https://myapp.com/login');
|
|
79
|
+
|
|
80
|
+
const email = await page.waitForSelector(
|
|
81
|
+
'input[type="email"][name="email"]',
|
|
82
|
+
{ state: 'visible', timeout: 30000 }
|
|
83
|
+
);
|
|
84
|
+
await email.type('user@example.com');
|
|
85
|
+
|
|
86
|
+
const password = await page.waitForSelector(
|
|
87
|
+
'input[type="password"][name="password"]',
|
|
88
|
+
{ state: 'visible', timeout: 30000 }
|
|
89
|
+
);
|
|
90
|
+
await password.type('secret');
|
|
91
|
+
|
|
92
|
+
const button = await page.waitForSelector(
|
|
93
|
+
'button[type="submit"]',
|
|
94
|
+
{ state: 'visible', timeout: 30000 }
|
|
95
|
+
);
|
|
96
|
+
await button.click();
|
|
97
|
+
|
|
98
|
+
await page.waitForSelector('.dashboard', {
|
|
99
|
+
state: 'visible',
|
|
100
|
+
timeout: 30000
|
|
101
|
+
});
|
|
102
|
+
} finally {
|
|
103
|
+
await browser.close();
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
</CodeGroup>
|
|
108
|
+
|
|
109
|
+
## How It Works
|
|
110
|
+
|
|
111
|
+
TestDriver uses Claude AI's computer vision to understand your application:
|
|
112
|
+
|
|
113
|
+
<Steps>
|
|
114
|
+
<Step title="Natural Language">
|
|
115
|
+
Describe what you want to interact with in plain English:
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
await testdriver.find('submit button in the login form')
|
|
119
|
+
```
|
|
120
|
+
</Step>
|
|
121
|
+
|
|
122
|
+
<Step title="AI Vision Analysis">
|
|
123
|
+
TestDriver captures a screenshot and asks Claude AI to locate the element using computer vision - just like a human would.
|
|
124
|
+
</Step>
|
|
125
|
+
|
|
126
|
+
<Step title="Smart Caching">
|
|
127
|
+
Element locations are cached for 1.7x faster subsequent runs. The cache automatically invalidates when your UI changes.
|
|
128
|
+
</Step>
|
|
129
|
+
|
|
130
|
+
<Step title="Automatic Stability">
|
|
131
|
+
TestDriver waits for animations, network requests, and DOM changes to complete before acting - no manual waits needed.
|
|
132
|
+
</Step>
|
|
133
|
+
</Steps>
|
|
134
|
+
|
|
135
|
+
## Key Features
|
|
136
|
+
|
|
137
|
+
<CardGroup cols={2}>
|
|
138
|
+
<Card title="Easy to Write" icon="feather" href="/v7/features/easy-to-write">
|
|
139
|
+
Natural language selectors, chainable API, full TypeScript support
|
|
140
|
+
</Card>
|
|
141
|
+
|
|
142
|
+
<Card title="Fast Performance" icon="bolt" href="/v7/features/fast">
|
|
143
|
+
1.7x faster with intelligent caching
|
|
144
|
+
</Card>
|
|
145
|
+
|
|
146
|
+
<Card title="Stable & Reliable" icon="shield-check" href="/v7/features/stable">
|
|
147
|
+
Anti-flake technology eliminates timing issues
|
|
148
|
+
</Card>
|
|
149
|
+
|
|
150
|
+
<Card title="Scalable" icon="arrow-up-right-dots" href="/v7/features/scalable">
|
|
151
|
+
From 1 test to 10,000+ with Vitest integration
|
|
152
|
+
</Card>
|
|
153
|
+
|
|
154
|
+
<Card title="AI-Native" icon="robot" href="/v7/features/ai-native">
|
|
155
|
+
Built for AI agents and autonomous testing
|
|
156
|
+
</Card>
|
|
157
|
+
|
|
158
|
+
<Card title="Powerful" icon="wand-magic-sparkles" href="/v7/features/powerful">
|
|
159
|
+
Test web, desktop, mobile, extensions, and more
|
|
160
|
+
</Card>
|
|
161
|
+
|
|
162
|
+
<Card title="Observable" icon="microscope" href="/v7/features/observable">
|
|
163
|
+
Video replays, logs, and complete debugging tools
|
|
164
|
+
</Card>
|
|
165
|
+
|
|
166
|
+
<Card title="Enterprise Ready" icon="building" href="/v7/features/enterprise">
|
|
167
|
+
Security, compliance, and on-premise deployment
|
|
168
|
+
</Card>
|
|
169
|
+
</CardGroup>
|
|
170
|
+
|
|
171
|
+
## What Can You Test?
|
|
172
|
+
|
|
173
|
+
TestDriver is the only platform that lets you test everything with one SDK:
|
|
174
|
+
|
|
175
|
+
<Tabs>
|
|
176
|
+
<Tab title="Web Applications">
|
|
177
|
+
```javascript
|
|
178
|
+
import { chrome } from 'testdriverai/presets';
|
|
179
|
+
|
|
180
|
+
test('web app', async (context) => {
|
|
181
|
+
const { testdriver } = await chrome(context, {
|
|
182
|
+
url: 'https://myapp.com'
|
|
183
|
+
});
|
|
184
|
+
// Test any website
|
|
185
|
+
});
|
|
186
|
+
```
|
|
187
|
+
</Tab>
|
|
188
|
+
|
|
189
|
+
<Tab title="Desktop Apps">
|
|
190
|
+
```javascript
|
|
191
|
+
import { desktop } from 'testdriverai/presets';
|
|
192
|
+
|
|
193
|
+
test('desktop app', async (context) => {
|
|
194
|
+
const { testdriver } = await desktop(context, {
|
|
195
|
+
appPath: '/Applications/MyApp.app'
|
|
196
|
+
});
|
|
197
|
+
// Test Windows, macOS, Linux apps
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
</Tab>
|
|
201
|
+
|
|
202
|
+
<Tab title="Chrome Extensions">
|
|
203
|
+
```javascript
|
|
204
|
+
import { chromeExtension } from 'testdriverai/presets';
|
|
205
|
+
|
|
206
|
+
test('extension', async (context) => {
|
|
207
|
+
const { testdriver } = await chromeExtension(context, {
|
|
208
|
+
extensionPath: './my-extension'
|
|
209
|
+
});
|
|
210
|
+
// Test browser extensions
|
|
211
|
+
});
|
|
212
|
+
```
|
|
213
|
+
</Tab>
|
|
214
|
+
|
|
215
|
+
<Tab title="VS Code Extensions">
|
|
216
|
+
```javascript
|
|
217
|
+
import { vscode } from 'testdriverai/presets';
|
|
218
|
+
|
|
219
|
+
test('vscode', async (context) => {
|
|
220
|
+
const { testdriver } = await vscode(context, {
|
|
221
|
+
workspace: '/tmp/project'
|
|
222
|
+
});
|
|
223
|
+
// Test IDE extensions
|
|
224
|
+
});
|
|
225
|
+
```
|
|
226
|
+
</Tab>
|
|
227
|
+
|
|
228
|
+
<Tab title="Electron Apps">
|
|
229
|
+
```javascript
|
|
230
|
+
import { electron } from 'testdriverai/presets';
|
|
231
|
+
|
|
232
|
+
test('electron', async (context) => {
|
|
233
|
+
const { app } = await electron(context, {
|
|
234
|
+
appPath: './dist/my-app'
|
|
235
|
+
});
|
|
236
|
+
// Test Electron applications
|
|
237
|
+
});
|
|
238
|
+
```
|
|
239
|
+
</Tab>
|
|
240
|
+
</Tabs>
|
|
241
|
+
|
|
242
|
+
## How TestDriver Compares
|
|
243
|
+
|
|
244
|
+
<AccordionGroup>
|
|
245
|
+
<Accordion title="vs. Playwright / Selenium">
|
|
246
|
+
**TestDriver Advantages:**
|
|
247
|
+
- 🎯 Natural language selectors (no CSS/XPath)
|
|
248
|
+
- 🤖 AI-powered assertions
|
|
249
|
+
- 🛡️ Built-in anti-flake technology
|
|
250
|
+
- 💻 Desktop app support
|
|
251
|
+
- ☁️ Hosted infrastructure included
|
|
252
|
+
- 📹 Automatic video recording
|
|
253
|
+
|
|
254
|
+
**When to use Playwright/Selenium:**
|
|
255
|
+
- You need low-level browser control
|
|
256
|
+
- You're testing extremely complex DOM structures
|
|
257
|
+
- You require specific browser APIs
|
|
258
|
+
</Accordion>
|
|
259
|
+
|
|
260
|
+
<Accordion title="vs. Cypress">
|
|
261
|
+
**TestDriver Advantages:**
|
|
262
|
+
- 🖥️ Cross-platform (Windows, macOS, Linux)
|
|
263
|
+
- 📱 Desktop application support
|
|
264
|
+
- 🤖 AI-powered element location
|
|
265
|
+
- ☁️ Hosted sandboxes included
|
|
266
|
+
- ⚡ No flake from timing issues
|
|
267
|
+
- 🌐 Multi-application testing
|
|
268
|
+
|
|
269
|
+
**When to use Cypress:**
|
|
270
|
+
- You only test web applications
|
|
271
|
+
- You need real-time debugging in browser
|
|
272
|
+
- You want to run tests in-browser only
|
|
273
|
+
</Accordion>
|
|
274
|
+
|
|
275
|
+
<Accordion title="vs. Manual QA">
|
|
276
|
+
**TestDriver Advantages:**
|
|
277
|
+
- ⚡ 100x faster execution
|
|
278
|
+
- 🎯 Perfect consistency
|
|
279
|
+
- 🔄 Run thousands of tests in parallel
|
|
280
|
+
- 🚫 Zero human error
|
|
281
|
+
- 🌙 24/7 execution capability
|
|
282
|
+
- 🐛 Instant regression detection
|
|
283
|
+
|
|
284
|
+
**When to use Manual QA:**
|
|
285
|
+
- Exploratory testing
|
|
286
|
+
- UX/design feedback
|
|
287
|
+
- Edge cases not worth automating
|
|
288
|
+
</Accordion>
|
|
289
|
+
</AccordionGroup>
|
|
290
|
+
|
|
291
|
+
## Architecture
|
|
292
|
+
|
|
293
|
+
TestDriver consists of three main components:
|
|
294
|
+
|
|
295
|
+
```mermaid
|
|
296
|
+
graph LR
|
|
297
|
+
A[Your Test Code] --> B[TestDriver SDK]
|
|
298
|
+
B --> C[TestDriver API]
|
|
299
|
+
C --> D[Claude AI Vision]
|
|
300
|
+
C --> E[Sandbox VM]
|
|
301
|
+
E --> F[Your Application]
|
|
302
|
+
|
|
303
|
+
style A fill:#b3d334
|
|
304
|
+
style B fill:#152a65,color:#fff
|
|
305
|
+
style C fill:#152a65,color:#fff
|
|
306
|
+
style D fill:#b3d334
|
|
307
|
+
style E fill:#152a65,color:#fff
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
1. **TestDriver SDK** - The JavaScript/TypeScript library you use in your tests
|
|
311
|
+
2. **TestDriver API** - Cloud service that orchestrates sandboxes and AI
|
|
312
|
+
3. **Sandbox VMs** - Isolated virtual machines where your application runs
|
|
313
|
+
|
|
314
|
+
[Learn more about architecture](/v7/api/sandbox)
|
|
315
|
+
|
|
316
|
+
## Pricing Model
|
|
317
|
+
|
|
318
|
+
TestDriver uses usage-based pricing:
|
|
319
|
+
|
|
320
|
+
<Card title="Pay-per-use" icon="dollar-sign">
|
|
321
|
+
**What you pay for:**
|
|
322
|
+
- AI vision analysis calls
|
|
323
|
+
- Sandbox VM time (per minute)
|
|
324
|
+
- Dashcam video storage
|
|
325
|
+
|
|
326
|
+
**What's included:**
|
|
327
|
+
- Intelligent caching (reduces costs by 90%+)
|
|
328
|
+
- Shared team cache
|
|
329
|
+
- Unlimited team members
|
|
330
|
+
- Unlimited test executions
|
|
331
|
+
|
|
332
|
+
**Typical costs:**
|
|
333
|
+
- Single test: $0.04 - $0.12
|
|
334
|
+
- 100-test suite: $4 - $12 (first run)
|
|
335
|
+
- Cached suite: $0.50 - $2 (subsequent runs)
|
|
336
|
+
</Card>
|
|
337
|
+
|
|
338
|
+
Enterprise plans available with unlimited usage, on-premise deployment, and custom SLA.
|
|
339
|
+
|
|
340
|
+
[View pricing details](https://testdriver.ai/pricing)
|
|
341
|
+
|
|
342
|
+
## Getting Started
|
|
343
|
+
|
|
344
|
+
Ready to write your first test?
|
|
345
|
+
|
|
346
|
+
<CardGroup cols={3}>
|
|
347
|
+
<Card
|
|
348
|
+
title="Quick Start"
|
|
349
|
+
icon="rocket"
|
|
350
|
+
href="/v7/getting-started/installation"
|
|
351
|
+
>
|
|
352
|
+
Install and run your first test in 2 minutes
|
|
353
|
+
</Card>
|
|
354
|
+
|
|
355
|
+
<Card
|
|
356
|
+
title="View Examples"
|
|
357
|
+
icon="code"
|
|
358
|
+
href="/v7/presets/chrome"
|
|
359
|
+
>
|
|
360
|
+
See TestDriver in action
|
|
361
|
+
</Card>
|
|
362
|
+
|
|
363
|
+
<Card
|
|
364
|
+
title="Watch Demo"
|
|
365
|
+
icon="play"
|
|
366
|
+
href="https://testdriver.ai/demo"
|
|
367
|
+
>
|
|
368
|
+
Schedule a live demo
|
|
369
|
+
</Card>
|
|
370
|
+
</CardGroup>
|
|
371
|
+
|
|
372
|
+
## Community & Support
|
|
373
|
+
|
|
374
|
+
<CardGroup cols={3}>
|
|
375
|
+
<Card
|
|
376
|
+
title="Discord Community"
|
|
377
|
+
icon="discord"
|
|
378
|
+
href="https://discord.com/invite/cWDFW8DzPm"
|
|
379
|
+
>
|
|
380
|
+
Join 1,000+ developers
|
|
381
|
+
</Card>
|
|
382
|
+
|
|
383
|
+
<Card
|
|
384
|
+
title="GitHub"
|
|
385
|
+
icon="github"
|
|
386
|
+
href="https://github.com/testdriverai"
|
|
387
|
+
>
|
|
388
|
+
View examples and contribute
|
|
389
|
+
</Card>
|
|
390
|
+
|
|
391
|
+
<Card
|
|
392
|
+
title="Documentation"
|
|
393
|
+
icon="book"
|
|
394
|
+
href="/v7/getting-started/installation"
|
|
395
|
+
>
|
|
396
|
+
Complete guides and API reference
|
|
397
|
+
</Card>
|
|
398
|
+
</CardGroup>
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Linux"
|
|
3
|
+
description: "Run TestDriver tests on Linux sandboxes (default platform)"
|
|
4
|
+
icon: "linux"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Linux is the **default platform** for TestDriver sandboxes. All tests run on Ubuntu 22.04 unless otherwise specified.
|
|
10
|
+
|
|
11
|
+
Linux sandboxes provide:
|
|
12
|
+
- Fast startup times (20-60s)
|
|
13
|
+
- Full desktop environment (XFCE)
|
|
14
|
+
- Chrome, Firefox, and other browsers pre-installed
|
|
15
|
+
- Support for all TestDriver commands
|
|
16
|
+
- VNC access for debugging
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
Linux is used automatically when you create a TestDriver instance:
|
|
21
|
+
|
|
22
|
+
```javascript
|
|
23
|
+
import { TestDriver } from '@testdriverai/testdriver';
|
|
24
|
+
|
|
25
|
+
// Linux is the default - no os parameter needed
|
|
26
|
+
const testdriver = await TestDriver.create({
|
|
27
|
+
apiKey: process.env.TD_API_KEY
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Or explicitly specify Linux:
|
|
32
|
+
|
|
33
|
+
```javascript
|
|
34
|
+
const testdriver = await TestDriver.create({
|
|
35
|
+
apiKey: process.env.TD_API_KEY,
|
|
36
|
+
os: 'linux' // Optional - this is the default
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## System Details
|
|
41
|
+
|
|
42
|
+
### Operating System
|
|
43
|
+
- **Distribution**: Ubuntu 22.04 LTS
|
|
44
|
+
- **Desktop Environment**: XFCE
|
|
45
|
+
- **Architecture**: x86_64 (amd64)
|
|
46
|
+
|
|
47
|
+
### Pre-installed Software
|
|
48
|
+
- **Browsers**: Chrome, Firefox ESR, Chrome for Testing
|
|
49
|
+
- **Languages**: Node.js 20, Python 3, build-essential (C/C++)
|
|
50
|
+
- **Development**: VS Code, Git, vim, nano
|
|
51
|
+
- **Office**: LibreOffice, Gnumeric
|
|
52
|
+
- **Graphics**: ImageMagick, xpaint, scrot, gnome-screenshot
|
|
53
|
+
- **Utilities**: xterm, xdotool, gedit, xpdf, pcmanfm (file manager), galculator
|
|
54
|
+
- **Desktop**: XFCE4 desktop environment, tint2 panel
|
|
55
|
+
- **Tools**: curl, wget, unzip, net-tools, netcat, jumpapp
|
|
56
|
+
- **Multimedia**: FFmpeg
|
|
57
|
+
- **TestDriver**: Dashcam (v1.4.11-beta.0), dashcam-chrome
|
|
58
|
+
|
|
59
|
+
### Default Resolution
|
|
60
|
+
- **1366x768** (configurable via `resolution` parameter)
|
|
61
|
+
|
|
62
|
+
## Configuration
|
|
63
|
+
|
|
64
|
+
### Custom Resolution
|
|
65
|
+
|
|
66
|
+
Set a custom screen resolution:
|
|
67
|
+
|
|
68
|
+
```javascript
|
|
69
|
+
const testdriver = await TestDriver.create({
|
|
70
|
+
apiKey: process.env.TD_API_KEY,
|
|
71
|
+
os: 'linux',
|
|
72
|
+
resolution: '1280x720' // HD
|
|
73
|
+
});
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Common resolutions:
|
|
77
|
+
- `1366x768` - Default
|
|
78
|
+
- `1920x1080` - Full HD
|
|
79
|
+
- `1280x720` - HD
|
|
80
|
+
- `2560x1440` - 2K
|
|
81
|
+
- `3840x2160` - 4K
|
|
82
|
+
|
|
83
|
+
### Environment Variables
|
|
84
|
+
|
|
85
|
+
Set environment variables in the sandbox:
|
|
86
|
+
|
|
87
|
+
```javascript
|
|
88
|
+
const testdriver = await TestDriver.create({
|
|
89
|
+
apiKey: process.env.TD_API_KEY,
|
|
90
|
+
os: 'linux',
|
|
91
|
+
env: {
|
|
92
|
+
NODE_ENV: 'test',
|
|
93
|
+
DEBUG: 'true'
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Common Use Cases
|
|
99
|
+
|
|
100
|
+
### Web Application Testing
|
|
101
|
+
|
|
102
|
+
Test web apps in Chrome or Firefox:
|
|
103
|
+
|
|
104
|
+
```javascript
|
|
105
|
+
import { chrome } from './setup/lifecycleHelpers.mjs';
|
|
106
|
+
import { test } from 'vitest';
|
|
107
|
+
|
|
108
|
+
test('login flow', async (context) => {
|
|
109
|
+
const { testdriver } = await chrome(context, {
|
|
110
|
+
url: 'https://example.com',
|
|
111
|
+
os: 'linux' // Optional
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
await testdriver.find('email field').then(el => el.click());
|
|
115
|
+
await testdriver.type('user@example.com');
|
|
116
|
+
|
|
117
|
+
await testdriver.find('password field').then(el => el.click());
|
|
118
|
+
await testdriver.type('password123');
|
|
119
|
+
|
|
120
|
+
await testdriver.find('login button').then(el => el.click());
|
|
121
|
+
await testdriver.assert('dashboard loaded');
|
|
122
|
+
});
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Desktop Application Testing
|
|
126
|
+
|
|
127
|
+
Test Electron or other desktop apps:
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
import { electron } from './setup/lifecycleHelpers.mjs';
|
|
131
|
+
import { test } from 'vitest';
|
|
132
|
+
|
|
133
|
+
test('electron app', async (context) => {
|
|
134
|
+
const { testdriver } = await electron(context, {
|
|
135
|
+
appPath: '/path/to/app',
|
|
136
|
+
os: 'linux'
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
await testdriver.find('menu button').then(el => el.click());
|
|
140
|
+
await testdriver.find('settings').then(el => el.click());
|
|
141
|
+
});
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Command-Line Tools
|
|
145
|
+
|
|
146
|
+
Run shell commands in the sandbox:
|
|
147
|
+
|
|
148
|
+
```javascript
|
|
149
|
+
test('install and test CLI tool', async (context) => {
|
|
150
|
+
const { testdriver } = await chrome(context, { os: 'linux' });
|
|
151
|
+
|
|
152
|
+
// Install tool
|
|
153
|
+
await testdriver.exec('sh', 'npm install -g my-cli-tool', 30000);
|
|
154
|
+
|
|
155
|
+
// Run tool
|
|
156
|
+
const result = await testdriver.exec('sh', 'my-cli-tool --version', 5000);
|
|
157
|
+
console.log('Tool version:', result);
|
|
158
|
+
});
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Package Management
|
|
162
|
+
|
|
163
|
+
### APT (Debian/Ubuntu)
|
|
164
|
+
|
|
165
|
+
Install system packages:
|
|
166
|
+
|
|
167
|
+
```javascript
|
|
168
|
+
// Install dependencies
|
|
169
|
+
await testdriver.exec('sh',
|
|
170
|
+
'sudo apt-get update && sudo apt-get install -y imagemagick',
|
|
171
|
+
60000
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
// Use installed package
|
|
175
|
+
await testdriver.exec('sh',
|
|
176
|
+
'convert input.png -resize 50% output.png',
|
|
177
|
+
10000
|
|
178
|
+
);
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### NPM/Node.js
|
|
182
|
+
|
|
183
|
+
Install Node.js packages:
|
|
184
|
+
|
|
185
|
+
```javascript
|
|
186
|
+
// Install package globally
|
|
187
|
+
await testdriver.exec('sh', 'npm install -g typescript', 30000);
|
|
188
|
+
|
|
189
|
+
// Or in project directory
|
|
190
|
+
await testdriver.exec('sh', 'cd /tmp/project && npm install', 60000);
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Python/Pip
|
|
194
|
+
|
|
195
|
+
Install Python packages:
|
|
196
|
+
|
|
197
|
+
```javascript
|
|
198
|
+
await testdriver.exec('sh', 'pip3 install requests', 30000);
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Debugging
|
|
202
|
+
|
|
203
|
+
### VNC Access
|
|
204
|
+
|
|
205
|
+
Connect to sandbox desktop via VNC:
|
|
206
|
+
|
|
207
|
+
```javascript
|
|
208
|
+
const instance = testdriver.getInstance();
|
|
209
|
+
console.log('VNC:', `vnc://${instance.ip}:${instance.vncPort}`);
|
|
210
|
+
|
|
211
|
+
// Use VNC client to connect and watch tests run
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Screenshots
|
|
215
|
+
|
|
216
|
+
Take screenshots for debugging:
|
|
217
|
+
|
|
218
|
+
```javascript
|
|
219
|
+
const element = await testdriver.find('error message');
|
|
220
|
+
if (element.found()) {
|
|
221
|
+
console.log('Screenshot:', element.screenshot); // base64
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Logs
|
|
226
|
+
|
|
227
|
+
Access sandbox logs:
|
|
228
|
+
|
|
229
|
+
```javascript
|
|
230
|
+
// Run command and capture output
|
|
231
|
+
const logs = await testdriver.exec('sh', 'tail -f /var/log/syslog', 5000);
|
|
232
|
+
console.log('System logs:', logs);
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Performance
|
|
236
|
+
|
|
237
|
+
### Startup Time
|
|
238
|
+
- **First test**: 20-60s (sandbox creation)
|
|
239
|
+
- **Subsequent tests**: 0s (sandbox reuse)
|
|
240
|
+
|
|
241
|
+
### Optimization Tips
|
|
242
|
+
- Reuse sandboxes across tests (use context)
|
|
243
|
+
- Enable caching for faster element finding
|
|
244
|
+
- Use parallel test execution
|
|
245
|
+
- Minimize package installations
|
|
246
|
+
|
|
247
|
+
See [Performance Guide](/v7/guides/performance) for details.
|
|
248
|
+
|
|
249
|
+
## Limitations
|
|
250
|
+
|
|
251
|
+
### No Root Access
|
|
252
|
+
Sandboxes run with limited privileges. Some operations requiring root may fail.
|
|
253
|
+
|
|
254
|
+
**Workaround**: Use `sudo` for commands that need elevation (already configured).
|
|
255
|
+
|
|
256
|
+
### Temporary Storage
|
|
257
|
+
Files are not persisted between sandbox sessions unless explicitly saved.
|
|
258
|
+
|
|
259
|
+
**Workaround**: Upload files at test start or use external storage.
|
|
260
|
+
|
|
261
|
+
### Network Restrictions
|
|
262
|
+
Some outbound ports may be blocked for security.
|
|
263
|
+
|
|
264
|
+
**Workaround**: Use standard HTTP/HTTPS (80/443) ports.
|
|
265
|
+
|
|
266
|
+
## Troubleshooting
|
|
267
|
+
|
|
268
|
+
### Package Installation Fails
|
|
269
|
+
|
|
270
|
+
```javascript
|
|
271
|
+
// Update package lists first
|
|
272
|
+
await testdriver.exec('sh', 'sudo apt-get update', 30000);
|
|
273
|
+
await testdriver.exec('sh', 'sudo apt-get install -y package-name', 60000);
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Display Issues
|
|
277
|
+
|
|
278
|
+
```javascript
|
|
279
|
+
// Set DISPLAY variable
|
|
280
|
+
await testdriver.exec('sh', 'export DISPLAY=:0', 1000);
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Permission Denied
|
|
284
|
+
|
|
285
|
+
```javascript
|
|
286
|
+
// Use sudo for system operations
|
|
287
|
+
await testdriver.exec('sh', 'sudo chmod +x /path/to/file', 5000);
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## See Also
|
|
291
|
+
|
|
292
|
+
<CardGroup cols={2}>
|
|
293
|
+
<Card title="Windows" icon="windows" href="/v7/platforms/windows">
|
|
294
|
+
Windows sandboxes (Enterprise)
|
|
295
|
+
</Card>
|
|
296
|
+
|
|
297
|
+
<Card title="macOS" icon="apple" href="/v7/platforms/macos">
|
|
298
|
+
macOS sandboxes (Beta)
|
|
299
|
+
</Card>
|
|
300
|
+
|
|
301
|
+
<Card title="Configuration" icon="gear" href="/v7/getting-started/configuration">
|
|
302
|
+
Sandbox configuration
|
|
303
|
+
</Card>
|
|
304
|
+
|
|
305
|
+
<Card title="Self-Hosting" icon="server" href="/v7/guides/self-hosting">
|
|
306
|
+
Run your own sandboxes
|
|
307
|
+
</Card>
|
|
308
|
+
</CardGroup>
|