@testdriverai/agent 7.8.0-test.38
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/.claude/settings.local.json +7 -0
- package/.env.example +4 -0
- package/.prettierignore +4 -0
- package/.prettierrc +1 -0
- package/CHANGELOG.md +953 -0
- package/README.md +81 -0
- package/agent/events.js +135 -0
- package/agent/index.js +2450 -0
- package/agent/interface.js +35 -0
- package/agent/lib/analytics.js +22 -0
- package/agent/lib/censorship.js +75 -0
- package/agent/lib/commander.js +246 -0
- package/agent/lib/commands.js +1684 -0
- package/agent/lib/config.js +60 -0
- package/agent/lib/generator.js +91 -0
- package/agent/lib/http.js +144 -0
- package/agent/lib/logger.js +56 -0
- package/agent/lib/outputs.js +29 -0
- package/agent/lib/parser.js +209 -0
- package/agent/lib/redraw.js +386 -0
- package/agent/lib/resources/cursor-2.png +0 -0
- package/agent/lib/sandbox.js +1104 -0
- package/agent/lib/sdk.js +633 -0
- package/agent/lib/session.js +25 -0
- package/agent/lib/source-mapper.js +342 -0
- package/agent/lib/subimage/index.js +77 -0
- package/agent/lib/subimage/opencv.js +69 -0
- package/agent/lib/system.js +204 -0
- package/agent/lib/theme.js +14 -0
- package/agent/lib/valid-version.js +21 -0
- package/agent/lib/validation.js +169 -0
- package/ai/.claude-plugin/plugin.json +9 -0
- package/ai/agents/testdriver.md +638 -0
- package/ai/skills/testdriver-ai/SKILL.md +204 -0
- package/ai/skills/testdriver-assert/SKILL.md +315 -0
- package/ai/skills/testdriver-aws-setup/SKILL.md +448 -0
- package/ai/skills/testdriver-cache/SKILL.md +221 -0
- package/ai/skills/testdriver-caching/SKILL.md +124 -0
- package/ai/skills/testdriver-captcha/SKILL.md +158 -0
- package/ai/skills/testdriver-ci-cd/SKILL.md +602 -0
- package/ai/skills/testdriver-click/SKILL.md +286 -0
- package/ai/skills/testdriver-client/SKILL.md +477 -0
- package/ai/skills/testdriver-cloud/SKILL.md +119 -0
- package/ai/skills/testdriver-customizing-devices/SKILL.md +319 -0
- package/ai/skills/testdriver-dashcam/SKILL.md +418 -0
- package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +401 -0
- package/ai/skills/testdriver-device-config/SKILL.md +317 -0
- package/ai/skills/testdriver-double-click/SKILL.md +102 -0
- package/ai/skills/testdriver-elements/SKILL.md +605 -0
- package/ai/skills/testdriver-enterprise/SKILL.md +114 -0
- package/ai/skills/testdriver-errors/SKILL.md +246 -0
- package/ai/skills/testdriver-events/SKILL.md +356 -0
- package/ai/skills/testdriver-examples/SKILL.md +7 -0
- package/ai/skills/testdriver-exec/SKILL.md +317 -0
- package/ai/skills/testdriver-find/SKILL.md +829 -0
- package/ai/skills/testdriver-focus-application/SKILL.md +293 -0
- package/ai/skills/testdriver-generating-tests/SKILL.md +36 -0
- package/ai/skills/testdriver-hover/SKILL.md +278 -0
- package/ai/skills/testdriver-locating-elements/SKILL.md +71 -0
- package/ai/skills/testdriver-making-assertions/SKILL.md +32 -0
- package/ai/skills/testdriver-mcp/SKILL.md +7 -0
- package/ai/skills/testdriver-mcp-workflow/SKILL.md +410 -0
- package/ai/skills/testdriver-mouse-down/SKILL.md +161 -0
- package/ai/skills/testdriver-mouse-up/SKILL.md +164 -0
- package/ai/skills/testdriver-parse/SKILL.md +236 -0
- package/ai/skills/testdriver-performing-actions/SKILL.md +54 -0
- package/ai/skills/testdriver-press-keys/SKILL.md +348 -0
- package/ai/skills/testdriver-provision/SKILL.md +331 -0
- package/ai/skills/testdriver-quickstart/SKILL.md +144 -0
- package/ai/skills/testdriver-redraw/SKILL.md +214 -0
- package/ai/skills/testdriver-reusable-code/SKILL.md +249 -0
- package/ai/skills/testdriver-right-click/SKILL.md +123 -0
- package/ai/skills/testdriver-running-tests/SKILL.md +185 -0
- package/ai/skills/testdriver-screenshot/SKILL.md +248 -0
- package/ai/skills/testdriver-screenshots/SKILL.md +184 -0
- package/ai/skills/testdriver-scroll/SKILL.md +335 -0
- package/ai/skills/testdriver-secrets/SKILL.md +115 -0
- package/ai/skills/testdriver-self-hosted/SKILL.md +65 -0
- package/ai/skills/testdriver-test-writer/SKILL.md +448 -0
- package/ai/skills/testdriver-testdriver/SKILL.md +628 -0
- package/ai/skills/testdriver-testdriver-mechanic/SKILL.md +165 -0
- package/ai/skills/testdriver-type/SKILL.md +357 -0
- package/ai/skills/testdriver-variables/SKILL.md +111 -0
- package/ai/skills/testdriver-wait/SKILL.md +50 -0
- package/ai/skills/testdriver-waiting-for-elements/SKILL.md +90 -0
- package/ai/skills/testdriver-what-is-testdriver/SKILL.md +54 -0
- package/bin/testdriverai.js +22 -0
- package/debugger/bg.png +0 -0
- package/debugger/icon.png +0 -0
- package/debugger/index.html +469 -0
- package/debugger/td.png +0 -0
- package/debugger/tray-buffered.png +0 -0
- package/debugger/tray.png +0 -0
- package/docs/GITHUB_COMMENTS.md +330 -0
- package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +167 -0
- package/docs/QUICK-START-GITHUB-COMMENTS.md +84 -0
- package/docs/TEST-GITHUB-COMMENTS.md +129 -0
- package/docs/_data/examples-manifest.json +177 -0
- package/docs/_data/examples-manifest.schema.json +41 -0
- package/docs/_scripts/extract-example-urls.js +165 -0
- package/docs/_scripts/generate-examples.js +560 -0
- package/docs/_scripts/generate-skills.js +154 -0
- package/docs/_scripts/link-replacer.js +164 -0
- package/docs/_scripts/upload-docs-to-openai.js +284 -0
- package/docs/changelog.mdx +161 -0
- package/docs/claude-mcp-plugin.mdx +160 -0
- package/docs/docs.json +442 -0
- package/docs/github-integration-setup.md +266 -0
- package/docs/guide/best-practices-polling.mdx +174 -0
- package/docs/images/content/account/newprojectsettings.png +0 -0
- package/docs/images/content/account/projectpage.png +0 -0
- package/docs/images/content/account/projectreplays.png +0 -0
- package/docs/images/content/account/team-manage.png +0 -0
- package/docs/images/content/account/teampage.png +0 -0
- package/docs/images/content/extension/cursor.svg +1 -0
- package/docs/images/content/extension/vscode.svg +57 -0
- package/docs/images/content/extension/windsurf.svg +3 -0
- package/docs/images/content/parse/output.png +0 -0
- package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
- package/docs/images/content/side-by-side.png +0 -0
- package/docs/images/content/vscode/ide-full.png +0 -0
- package/docs/images/content/vscode/running.png +0 -0
- package/docs/images/content/vscode/v7-chat.png +0 -0
- package/docs/images/content/vscode/v7-choose-agent.png +0 -0
- package/docs/images/content/vscode/v7-full.png +0 -0
- package/docs/images/content/vscode/v7-onboarding.png +0 -0
- package/docs/images/content/vscode/vscode-2-assert.png +0 -0
- package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
- package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
- package/docs/images/content/vscode/vscode-file-creation.png +0 -0
- package/docs/images/content/vscode/vscode-install.png +0 -0
- package/docs/images/content/vscode/vscode-overview.png +0 -0
- package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
- package/docs/images/content/vscode/vscode-stopchat.png +0 -0
- package/docs/images/content/vscode/vscode-stoptest.png +0 -0
- package/docs/images/content/vscode/vscode-tdservice.png +0 -0
- package/docs/images/content/vscode/vscode-test-output.png +0 -0
- package/docs/images/content/vscode/vscode-testhistory.png +0 -0
- package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
- package/docs/images/content/vscode/vscode-testpane.png +0 -0
- package/docs/images/template/dark.png +0 -0
- package/docs/images/template/icon.png +0 -0
- package/docs/images/template/light.png +0 -0
- package/docs/snippets/calendar-link.mdx +4 -0
- package/docs/snippets/gitignore-warning.mdx +7 -0
- package/docs/snippets/lifecycle-warning.mdx +6 -0
- package/docs/snippets/test-prereqs.mdx +12 -0
- package/docs/snippets/tests/assert-replay.mdx +7 -0
- package/docs/snippets/tests/assert-yaml.mdx +8 -0
- package/docs/snippets/tests/exec-js-replay.mdx +7 -0
- package/docs/snippets/tests/exec-js-yaml.mdx +32 -0
- package/docs/snippets/tests/exec-shell-replay.mdx +7 -0
- package/docs/snippets/tests/exec-shell-yaml.mdx +15 -0
- package/docs/snippets/tests/hover-image-replay.mdx +7 -0
- package/docs/snippets/tests/hover-image-yaml.mdx +17 -0
- package/docs/snippets/tests/hover-text-replay.mdx +7 -0
- package/docs/snippets/tests/hover-text-with-description-replay.mdx +7 -0
- package/docs/snippets/tests/hover-text-with-description-yaml.mdx +24 -0
- package/docs/snippets/tests/hover-text-yaml.mdx +14 -0
- package/docs/snippets/tests/match-image-replay.mdx +7 -0
- package/docs/snippets/tests/match-image-yaml.mdx +17 -0
- package/docs/snippets/tests/press-keys-replay.mdx +7 -0
- package/docs/snippets/tests/press-keys-yaml.mdx +36 -0
- package/docs/snippets/tests/remember-replay.mdx +7 -0
- package/docs/snippets/tests/remember-yaml.mdx +28 -0
- package/docs/snippets/tests/scroll-replay.mdx +7 -0
- package/docs/snippets/tests/scroll-until-image-replay.mdx +7 -0
- package/docs/snippets/tests/scroll-until-image-yaml.mdx +14 -0
- package/docs/snippets/tests/scroll-until-text-replay.mdx +7 -0
- package/docs/snippets/tests/scroll-until-text-yaml.mdx +17 -0
- package/docs/snippets/tests/scroll-yaml.mdx +30 -0
- package/docs/snippets/tests/type-repeated-replay.mdx +7 -0
- package/docs/snippets/tests/type-repeated-yaml.mdx +22 -0
- package/docs/snippets/tests/type-replay.mdx +7 -0
- package/docs/snippets/tests/type-yaml.mdx +28 -0
- package/docs/snippets/tests/wait-for-image-replay.mdx +7 -0
- package/docs/snippets/tests/wait-for-image-yaml.mdx +18 -0
- package/docs/snippets/tests/wait-for-text-replay.mdx +7 -0
- package/docs/snippets/tests/wait-for-text-yaml.mdx +18 -0
- package/docs/snippets/tests/wait-replay.mdx +7 -0
- package/docs/snippets/tests/wait-yaml.mdx +13 -0
- package/docs/styles.css +65 -0
- package/docs/v6/account/dashboard.mdx +16 -0
- package/docs/v6/account/enterprise.mdx +110 -0
- package/docs/v6/account/pricing.mdx +33 -0
- package/docs/v6/account/projects.mdx +33 -0
- package/docs/v6/account/team.mdx +35 -0
- package/docs/v6/action/ami.mdx +109 -0
- package/docs/v6/action/performance.mdx +105 -0
- package/docs/v6/action/secrets.mdx +93 -0
- package/docs/v6/apps/chrome-extensions.mdx +48 -0
- package/docs/v6/apps/desktop-apps.mdx +93 -0
- package/docs/v6/apps/mobile-apps.mdx +26 -0
- package/docs/v6/apps/static-websites.mdx +54 -0
- package/docs/v6/apps/tauri-apps.mdx +361 -0
- package/docs/v6/bugs/jira.mdx +232 -0
- package/docs/v6/cli/overview.mdx +66 -0
- package/docs/v6/commands/assert.mdx +45 -0
- package/docs/v6/commands/exec.mdx +276 -0
- package/docs/v6/commands/focus-application.mdx +44 -0
- package/docs/v6/commands/hover-image.mdx +69 -0
- package/docs/v6/commands/hover-text.mdx +47 -0
- package/docs/v6/commands/if.mdx +53 -0
- package/docs/v6/commands/match-image.mdx +67 -0
- package/docs/v6/commands/press-keys.mdx +87 -0
- package/docs/v6/commands/remember.mdx +49 -0
- package/docs/v6/commands/run.mdx +44 -0
- package/docs/v6/commands/scroll-until-image.mdx +66 -0
- package/docs/v6/commands/scroll-until-text.mdx +60 -0
- package/docs/v6/commands/scroll.mdx +69 -0
- package/docs/v6/commands/type.mdx +45 -0
- package/docs/v6/commands/wait-for-image.mdx +54 -0
- package/docs/v6/commands/wait-for-text.mdx +48 -0
- package/docs/v6/commands/wait.mdx +45 -0
- package/docs/v6/exporting/junit.mdx +218 -0
- package/docs/v6/exporting/playwright.mdx +197 -0
- package/docs/v6/features/auto-healing.mdx +144 -0
- package/docs/v6/features/generation.mdx +116 -0
- package/docs/v6/features/parallel-testing.mdx +151 -0
- package/docs/v6/features/reusable-snippets.mdx +131 -0
- package/docs/v6/features/selectorless.mdx +80 -0
- package/docs/v6/features/visual-assertions.mdx +139 -0
- package/docs/v6/getting-started/ci.mdx +146 -0
- package/docs/v6/getting-started/cli.mdx +91 -0
- package/docs/v6/getting-started/editing.mdx +100 -0
- package/docs/v6/getting-started/playwright.mdx +342 -0
- package/docs/v6/getting-started/running.mdx +48 -0
- package/docs/v6/getting-started/self-hosting.mdx +408 -0
- package/docs/v6/getting-started/vscode.mdx +88 -0
- package/docs/v6/guide/assertions.mdx +189 -0
- package/docs/v6/guide/authentication.mdx +136 -0
- package/docs/v6/guide/code.mdx +65 -0
- package/docs/v6/guide/dashcam.mdx +118 -0
- package/docs/v6/guide/environment-variables.mdx +26 -0
- package/docs/v6/guide/lifecycle.mdx +242 -0
- package/docs/v6/guide/locating.mdx +141 -0
- package/docs/v6/guide/protips.mdx +43 -0
- package/docs/v6/guide/variables.mdx +143 -0
- package/docs/v6/guide/waiting.mdx +130 -0
- package/docs/v6/importing/csv.mdx +196 -0
- package/docs/v6/importing/gherkin.mdx +143 -0
- package/docs/v6/importing/jira.mdx +164 -0
- package/docs/v6/importing/testrail.mdx +162 -0
- package/docs/v6/integrations/electron.mdx +146 -0
- package/docs/v6/integrations/netlify.mdx +100 -0
- package/docs/v6/integrations/vercel.mdx +125 -0
- package/docs/v6/interactive/explore.mdx +99 -0
- package/docs/v6/interactive/run.mdx +52 -0
- package/docs/v6/interactive/save.mdx +63 -0
- package/docs/v6/overview/comparison.mdx +101 -0
- package/docs/v6/overview/faq.mdx +162 -0
- package/docs/v6/overview/performance.mdx +52 -0
- package/docs/v6/overview/quickstart.mdx +137 -0
- package/docs/v6/overview/what-is-testdriver.mdx +85 -0
- package/docs/v6/scenarios/ai-chatbot.mdx +28 -0
- package/docs/v6/scenarios/cookie-banner.mdx +32 -0
- package/docs/v6/scenarios/file-upload.mdx +33 -0
- package/docs/v6/scenarios/form-filling.mdx +32 -0
- package/docs/v6/scenarios/log-in.mdx +75 -0
- package/docs/v6/scenarios/pdf-generation.mdx +25 -0
- package/docs/v6/scenarios/spell-check.mdx +22 -0
- package/docs/v6/security/action.mdx +84 -0
- package/docs/v6/security/agent.mdx +73 -0
- package/docs/v6/security/platform.mdx +77 -0
- package/docs/v6/tutorials/advanced-test.mdx +81 -0
- package/docs/v6/tutorials/basic-test.mdx +45 -0
- package/docs/v7/_drafts/agents.mdx +843 -0
- package/docs/v7/_drafts/architecture.mdx +399 -0
- package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
- package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +100 -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 +424 -0
- package/docs/v7/_drafts/caching.mdx +366 -0
- package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
- package/docs/v7/_drafts/commands/assert.mdx +45 -0
- package/docs/v7/_drafts/commands/exec.mdx +276 -0
- package/docs/v7/_drafts/commands/focus-application.mdx +44 -0
- package/docs/v7/_drafts/commands/hover-image.mdx +69 -0
- package/docs/v7/_drafts/commands/hover-text.mdx +47 -0
- package/docs/v7/_drafts/commands/if.mdx +53 -0
- package/docs/v7/_drafts/commands/match-image.mdx +67 -0
- package/docs/v7/_drafts/commands/press-keys.mdx +87 -0
- package/docs/v7/_drafts/commands/remember.mdx +49 -0
- package/docs/v7/_drafts/commands/run.mdx +44 -0
- package/docs/v7/_drafts/commands/scroll-until-image.mdx +66 -0
- package/docs/v7/_drafts/commands/scroll-until-text.mdx +60 -0
- package/docs/v7/_drafts/commands/scroll.mdx +69 -0
- package/docs/v7/_drafts/commands/type.mdx +45 -0
- package/docs/v7/_drafts/commands/wait-for-image.mdx +54 -0
- package/docs/v7/_drafts/commands/wait-for-text.mdx +48 -0
- package/docs/v7/_drafts/commands/wait.mdx +45 -0
- package/docs/v7/_drafts/configuration.mdx +378 -0
- package/docs/v7/_drafts/contributing.mdx +174 -0
- package/docs/v7/_drafts/core.mdx +458 -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/init-command.mdx +95 -0
- package/docs/v7/_drafts/installation.mdx +420 -0
- package/docs/v7/_drafts/migration.mdx +562 -0
- package/docs/v7/_drafts/observable.mdx +604 -0
- package/docs/v7/_drafts/playwright.mdx +342 -0
- package/docs/v7/_drafts/plugin-migration.mdx +220 -0
- package/docs/v7/_drafts/powerful.mdx +419 -0
- package/docs/v7/_drafts/presets.mdx +210 -0
- package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
- package/docs/v7/_drafts/prompt-cache.mdx +200 -0
- package/docs/v7/_drafts/provision.mdx +390 -0
- package/docs/v7/_drafts/quick-start-test-recording.mdx +214 -0
- package/docs/v7/_drafts/readme.mdx +135 -0
- package/docs/v7/_drafts/reports.mdx +414 -0
- package/docs/v7/_drafts/scalable.mdx +763 -0
- package/docs/v7/_drafts/screenshot.mdx +155 -0
- package/docs/v7/_drafts/sdk-awesome-logs.mdx +468 -0
- package/docs/v7/_drafts/sdk-browser-rendering.mdx +167 -0
- package/docs/v7/_drafts/sdk-migration.mdx +474 -0
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/_drafts/self-hosting.mdx +369 -0
- package/docs/v7/_drafts/test-recording.mdx +382 -0
- 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/_drafts/writing-tests.mdx +25 -0
- package/docs/v7/ai.mdx +205 -0
- package/docs/v7/assert.mdx +316 -0
- package/docs/v7/aws-setup.mdx +449 -0
- package/docs/v7/cache.mdx +223 -0
- package/docs/v7/caching.mdx +128 -0
- package/docs/v7/captcha.mdx +159 -0
- package/docs/v7/ci-cd.mdx +603 -0
- package/docs/v7/click.mdx +287 -0
- package/docs/v7/client.mdx +478 -0
- package/docs/v7/copilot/auto-healing.mdx +265 -0
- package/docs/v7/copilot/creating-tests.mdx +156 -0
- package/docs/v7/copilot/github.mdx +143 -0
- package/docs/v7/copilot/running-tests.mdx +149 -0
- package/docs/v7/copilot/setup.mdx +143 -0
- package/docs/v7/customizing-devices.mdx +319 -0
- package/docs/v7/dashcam.mdx +419 -0
- package/docs/v7/debugging-with-screenshots.mdx +402 -0
- package/docs/v7/device-config.mdx +317 -0
- package/docs/v7/double-click.mdx +102 -0
- package/docs/v7/elements.mdx +606 -0
- package/docs/v7/enterprise.mdx +9 -0
- package/docs/v7/errors.mdx +248 -0
- package/docs/v7/events.mdx +358 -0
- package/docs/v7/examples/ai.mdx +72 -0
- package/docs/v7/examples/assert.mdx +72 -0
- package/docs/v7/examples/captcha-api.mdx +92 -0
- package/docs/v7/examples/chrome-extension.mdx +132 -0
- package/docs/v7/examples/drag-and-drop.mdx +100 -0
- package/docs/v7/examples/element-not-found.mdx +67 -0
- package/docs/v7/examples/exec-output.mdx +85 -0
- package/docs/v7/examples/exec-pwsh.mdx +83 -0
- package/docs/v7/examples/focus-window.mdx +62 -0
- package/docs/v7/examples/hover-image.mdx +94 -0
- package/docs/v7/examples/hover-text.mdx +69 -0
- package/docs/v7/examples/installer.mdx +91 -0
- package/docs/v7/examples/launch-vscode-linux.mdx +101 -0
- package/docs/v7/examples/match-image.mdx +96 -0
- package/docs/v7/examples/press-keys.mdx +92 -0
- package/docs/v7/examples/scroll-keyboard.mdx +79 -0
- package/docs/v7/examples/scroll-until-image.mdx +81 -0
- package/docs/v7/examples/scroll-until-text.mdx +109 -0
- package/docs/v7/examples/scroll.mdx +81 -0
- package/docs/v7/examples/type.mdx +92 -0
- package/docs/v7/examples/windows-installer.mdx +89 -0
- package/docs/v7/exec.mdx +318 -0
- package/docs/v7/find.mdx +830 -0
- package/docs/v7/focus-application.mdx +294 -0
- package/docs/v7/generating-tests.mdx +36 -0
- package/docs/v7/hosted.mdx +158 -0
- package/docs/v7/hover.mdx +279 -0
- package/docs/v7/locating-elements.mdx +71 -0
- package/docs/v7/making-assertions.mdx +32 -0
- package/docs/v7/mcp.mdx +9 -0
- package/docs/v7/mouse-down.mdx +161 -0
- package/docs/v7/mouse-up.mdx +164 -0
- package/docs/v7/parse.mdx +237 -0
- package/docs/v7/performing-actions.mdx +54 -0
- package/docs/v7/press-keys.mdx +349 -0
- package/docs/v7/provision.mdx +333 -0
- package/docs/v7/quickstart.mdx +173 -0
- package/docs/v7/redraw.mdx +216 -0
- package/docs/v7/reusable-code.mdx +249 -0
- package/docs/v7/right-click.mdx +123 -0
- package/docs/v7/running-tests.mdx +185 -0
- package/docs/v7/screenshot.mdx +249 -0
- package/docs/v7/screenshots.mdx +186 -0
- package/docs/v7/scroll.mdx +336 -0
- package/docs/v7/secrets.mdx +115 -0
- package/docs/v7/self-hosted.mdx +149 -0
- package/docs/v7/type.mdx +358 -0
- package/docs/v7/variables.mdx +111 -0
- package/docs/v7/wait.mdx +52 -0
- package/docs/v7/waiting-for-elements.mdx +90 -0
- package/docs/v7/what-is-testdriver.mdx +54 -0
- package/eslint.config.js +67 -0
- package/examples/ai.test.mjs +31 -0
- package/examples/assert.test.mjs +47 -0
- package/examples/chrome-extension.test.mjs +97 -0
- package/examples/config.mjs +5 -0
- package/examples/element-not-found.test.mjs +27 -0
- package/examples/exec-output.test.mjs +60 -0
- package/examples/exec-pwsh.test.mjs +58 -0
- package/examples/findall-coffee-icons.test.mjs +42 -0
- package/examples/focus-window.test.mjs +37 -0
- package/examples/formatted-logging.test.mjs +27 -0
- package/examples/hover-image.test.mjs +53 -0
- package/examples/hover-text-with-description.test.mjs +57 -0
- package/examples/hover-text.test.mjs +28 -0
- package/examples/installer.test.mjs +50 -0
- package/examples/launch-vscode-linux.test.mjs +55 -0
- package/examples/match-image.test.mjs +55 -0
- package/examples/parse.test.mjs +19 -0
- package/examples/press-keys.test.mjs +44 -0
- package/examples/prompt.test.mjs +34 -0
- package/examples/scroll-keyboard.test.mjs +38 -0
- package/examples/scroll-until-image.test.mjs +40 -0
- package/examples/scroll.test.mjs +42 -0
- package/examples/type.test.mjs +46 -0
- package/examples/windows-installer.test.mjs +54 -0
- package/index.js +2 -0
- package/interfaces/cli/commands/init.js +438 -0
- package/interfaces/cli/commands/setup.js +382 -0
- package/interfaces/cli/lib/base.js +285 -0
- package/interfaces/cli.js +20 -0
- package/interfaces/junit-reporter.js +290 -0
- package/interfaces/logger.js +388 -0
- package/interfaces/readline.js +234 -0
- package/interfaces/shared-test-state.mjs +64 -0
- package/interfaces/vitest-plugin.d.ts +115 -0
- package/interfaces/vitest-plugin.mjs +1698 -0
- package/lib/captcha/solver.js +358 -0
- package/lib/core/Dashcam.js +533 -0
- package/lib/core/index.d.ts +172 -0
- package/lib/core/index.js +12 -0
- package/lib/environments.json +18 -0
- package/lib/github-comment-formatter.js +263 -0
- package/lib/github-comment.mjs +452 -0
- package/lib/init-project.js +575 -0
- package/lib/presets/index.mjs +331 -0
- package/lib/resolve-channel.js +46 -0
- package/lib/sentry.js +417 -0
- package/lib/vitest/hooks.d.ts +57 -0
- package/lib/vitest/hooks.mjs +674 -0
- package/lib/vitest/setup-aws.mjs +247 -0
- package/lib/vitest/setup-self-hosted.mjs +151 -0
- package/lib/vitest/setup.mjs +46 -0
- package/manual/captcha-api.test.mjs +51 -0
- package/manual/drag-and-drop.test.mjs +59 -0
- package/manual/flake-diffthreshold-001.test.mjs +9 -0
- package/manual/flake-diffthreshold-01.test.mjs +9 -0
- package/manual/flake-diffthreshold-05.test.mjs +9 -0
- package/manual/flake-noredraw-cache.test.mjs +9 -0
- package/manual/flake-noredraw-nocache.test.mjs +9 -0
- package/manual/flake-redraw-cache.test.mjs +9 -0
- package/manual/flake-redraw-nocache.test.mjs +9 -0
- package/manual/flake-rocket-match.test.mjs +30 -0
- package/manual/flake-shared.mjs +51 -0
- package/manual/no-provision.test.mjs +31 -0
- package/manual/packer-hover-image.test.mjs +176 -0
- package/manual/scroll-until-text.test.mjs +68 -0
- package/manual/test-init-command.js +223 -0
- package/mcp-server/README.md +322 -0
- package/mcp-server/dist/codegen.d.ts +9 -0
- package/mcp-server/dist/codegen.js +165 -0
- package/mcp-server/dist/mcp-app.html +114 -0
- package/mcp-server/dist/package.json +1 -0
- package/mcp-server/dist/provision-types.d.ts +290 -0
- package/mcp-server/dist/provision-types.js +174 -0
- package/mcp-server/dist/server.d.ts +6 -0
- package/mcp-server/dist/server.mjs +1925 -0
- package/mcp-server/dist/session.d.ts +85 -0
- package/mcp-server/dist/session.js +152 -0
- package/mcp-server/mcp-app.html +28 -0
- package/mcp-server/mcp-config.example.json +19 -0
- package/mcp-server/package-lock.json +4027 -0
- package/mcp-server/package.json +31 -0
- package/mcp-server/src/codegen.ts +189 -0
- package/mcp-server/src/mcp-app.css +360 -0
- package/mcp-server/src/mcp-app.ts +547 -0
- package/mcp-server/src/provision-types.ts +209 -0
- package/mcp-server/src/server.ts +2391 -0
- package/mcp-server/src/session.ts +194 -0
- package/mcp-server/tsconfig.json +16 -0
- package/mcp-server/vite.config.ts +23 -0
- package/package.json +158 -0
- package/schema.json +1046 -0
- package/scripts/generate-skills.js +94 -0
- package/sdk-log-formatter.js +1157 -0
- package/sdk.d.ts +1486 -0
- package/sdk.js +4336 -0
- package/setup/aws/cloudformation.yaml +463 -0
- package/setup/aws/disable-defender.sh +42 -0
- package/setup/aws/install-dev-runner.sh +79 -0
- package/setup/aws/spawn-runner.sh +289 -0
- package/test/captcha-solver.test.mjs +152 -0
- package/test/chrome-remote-debugging.test.mjs +66 -0
- package/test/duckduckgo/experiment.test.mjs +28 -0
- package/test/duckduckgo/setup.test.mjs +29 -0
- package/test/manual/debug-locate-response.js +82 -0
- package/test/manual/reconnect-provision.test.mjs +49 -0
- package/test/manual/test-console-logs.test.mjs +42 -0
- package/test/manual/test-find-api.js +73 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-prompt-cache.js +97 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/manual/test-sandbox-render.js +29 -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/manual/verify-element-api.js +89 -0
- package/test/manual/verify-types.js +0 -0
- package/test/manual-unawaited-promise.test.mjs +31 -0
- package/vitest.config.mjs +58 -0
- package/vitest.runner.config.mjs +33 -0
- package/vscode-extension/.vscodeignore +12 -0
- package/vscode-extension/README.md +94 -0
- package/vscode-extension/media/icon.png +0 -0
- package/vscode-extension/package-lock.json +4126 -0
- package/vscode-extension/package.json +86 -0
- package/vscode-extension/src/extension.ts +829 -0
- package/vscode-extension/testdriverai-0.1.0.vsix +0 -0
- package/vscode-extension/tsconfig.json +16 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: testdriver:press-keys
|
|
3
|
+
description: Press keyboard keys and shortcuts
|
|
4
|
+
---
|
|
5
|
+
<!-- Generated from press-keys.mdx. DO NOT EDIT. -->
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Press one or more keyboard keys simultaneously, useful for keyboard shortcuts, navigation, and special keys.
|
|
10
|
+
|
|
11
|
+
## Syntax
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
await testdriver.pressKeys(keys)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Parameters
|
|
18
|
+
|
|
19
|
+
<ParamField path="keys" type="Array<string>" required>
|
|
20
|
+
Array of keys to press simultaneously
|
|
21
|
+
</ParamField>
|
|
22
|
+
|
|
23
|
+
## Returns
|
|
24
|
+
|
|
25
|
+
`Promise<void>`
|
|
26
|
+
|
|
27
|
+
## Common Keys
|
|
28
|
+
|
|
29
|
+
### Special Keys
|
|
30
|
+
- `'enter'`, `'tab'`, `'escape'`, `'backspace'`, `'delete'`
|
|
31
|
+
- `'space'`, `'up'`, `'down'`, `'left'`, `'right'`
|
|
32
|
+
- `'home'`, `'end'`, `'pageup'`, `'pagedown'`
|
|
33
|
+
|
|
34
|
+
### Modifier Keys
|
|
35
|
+
- `'ctrl'`, `'alt'`, `'shift'`
|
|
36
|
+
- `'command'` (macOS), `'win'` (Windows)
|
|
37
|
+
- `'ctrlleft'`, `'ctrlright'`, `'shiftleft'`, `'shiftright'`
|
|
38
|
+
|
|
39
|
+
### Function Keys
|
|
40
|
+
- `'f1'` through `'f24'`
|
|
41
|
+
|
|
42
|
+
## Examples
|
|
43
|
+
|
|
44
|
+
### Navigation
|
|
45
|
+
|
|
46
|
+
```javascript
|
|
47
|
+
// Tab to next field
|
|
48
|
+
await testdriver.pressKeys(['tab']);
|
|
49
|
+
|
|
50
|
+
// Shift+Tab to previous field
|
|
51
|
+
await testdriver.pressKeys(['shift', 'tab']);
|
|
52
|
+
|
|
53
|
+
// Arrow keys
|
|
54
|
+
await testdriver.pressKeys(['down']);
|
|
55
|
+
await testdriver.pressKeys(['up']);
|
|
56
|
+
await testdriver.pressKeys(['left']);
|
|
57
|
+
await testdriver.pressKeys(['right']);
|
|
58
|
+
|
|
59
|
+
// Home/End
|
|
60
|
+
await testdriver.pressKeys(['home']); // Start of line
|
|
61
|
+
await testdriver.pressKeys(['end']); // End of line
|
|
62
|
+
|
|
63
|
+
// Page navigation
|
|
64
|
+
await testdriver.pressKeys(['pagedown']);
|
|
65
|
+
await testdriver.pressKeys(['pageup']);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Keyboard Shortcuts
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
// Copy (Ctrl+C / Cmd+C)
|
|
72
|
+
await testdriver.pressKeys(['ctrl', 'c']);
|
|
73
|
+
|
|
74
|
+
// Paste (Ctrl+V / Cmd+V)
|
|
75
|
+
await testdriver.pressKeys(['ctrl', 'v']);
|
|
76
|
+
|
|
77
|
+
// Save (Ctrl+S)
|
|
78
|
+
await testdriver.pressKeys(['ctrl', 's']);
|
|
79
|
+
|
|
80
|
+
// Select All (Ctrl+A)
|
|
81
|
+
await testdriver.pressKeys(['ctrl', 'a']);
|
|
82
|
+
|
|
83
|
+
// Undo (Ctrl+Z)
|
|
84
|
+
await testdriver.pressKeys(['ctrl', 'z']);
|
|
85
|
+
|
|
86
|
+
// Redo (Ctrl+Y)
|
|
87
|
+
await testdriver.pressKeys(['ctrl', 'y']);
|
|
88
|
+
|
|
89
|
+
// Find (Ctrl+F)
|
|
90
|
+
await testdriver.pressKeys(['ctrl', 'f']);
|
|
91
|
+
|
|
92
|
+
// New tab (Ctrl+T)
|
|
93
|
+
await testdriver.pressKeys(['ctrl', 't']);
|
|
94
|
+
|
|
95
|
+
// Close tab (Ctrl+W)
|
|
96
|
+
await testdriver.pressKeys(['ctrl', 'w']);
|
|
97
|
+
|
|
98
|
+
// Refresh (F5 or Ctrl+R)
|
|
99
|
+
await testdriver.pressKeys(['f5']);
|
|
100
|
+
await testdriver.pressKeys(['ctrl', 'r']);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### System Shortcuts
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
// Alt+Tab (Windows - switch apps)
|
|
107
|
+
await testdriver.pressKeys(['alt', 'tab']);
|
|
108
|
+
|
|
109
|
+
// Alt+F4 (Windows - close window)
|
|
110
|
+
await testdriver.pressKeys(['alt', 'f4']);
|
|
111
|
+
|
|
112
|
+
// Win+D (Windows - show desktop)
|
|
113
|
+
await testdriver.pressKeys(['winleft', 'd']);
|
|
114
|
+
|
|
115
|
+
// Win+L (Windows - lock screen)
|
|
116
|
+
await testdriver.pressKeys(['winleft', 'l']);
|
|
117
|
+
|
|
118
|
+
// Cmd+Tab (macOS - switch apps)
|
|
119
|
+
await testdriver.pressKeys(['command', 'tab']);
|
|
120
|
+
|
|
121
|
+
// Cmd+Q (macOS - quit app)
|
|
122
|
+
await testdriver.pressKeys(['command', 'q']);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Form Submission
|
|
126
|
+
|
|
127
|
+
```javascript
|
|
128
|
+
// Submit form
|
|
129
|
+
await testdriver.pressKeys(['enter']);
|
|
130
|
+
|
|
131
|
+
// Cancel/Close
|
|
132
|
+
await testdriver.pressKeys(['escape']);
|
|
133
|
+
|
|
134
|
+
// Check checkbox
|
|
135
|
+
await testdriver.pressKeys(['space']);
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Text Editing
|
|
139
|
+
|
|
140
|
+
```javascript
|
|
141
|
+
// Delete selected text
|
|
142
|
+
await testdriver.pressKeys(['delete']);
|
|
143
|
+
|
|
144
|
+
// Backspace
|
|
145
|
+
await testdriver.pressKeys(['backspace']);
|
|
146
|
+
|
|
147
|
+
// Select all and delete
|
|
148
|
+
await testdriver.pressKeys(['ctrl', 'a']);
|
|
149
|
+
await testdriver.pressKeys(['delete']);
|
|
150
|
+
|
|
151
|
+
// Cut text
|
|
152
|
+
await testdriver.pressKeys(['ctrl', 'x']);
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Best Practices
|
|
156
|
+
|
|
157
|
+
<Check>
|
|
158
|
+
**Wait after shortcuts**
|
|
159
|
+
|
|
160
|
+
Some keyboard shortcuts trigger animations or navigation:
|
|
161
|
+
|
|
162
|
+
```javascript
|
|
163
|
+
await testdriver.pressKeys(['ctrl', 't']); // New tab
|
|
164
|
+
await new Promise(r => setTimeout(r, 500)); // Wait for tab
|
|
165
|
+
await testdriver.pressKeys(['ctrl', 'l']); // Focus URL bar
|
|
166
|
+
```
|
|
167
|
+
</Check>
|
|
168
|
+
|
|
169
|
+
<Check>
|
|
170
|
+
**Use Tab for form navigation**
|
|
171
|
+
|
|
172
|
+
Tab is more reliable than clicking multiple fields:
|
|
173
|
+
|
|
174
|
+
```javascript
|
|
175
|
+
const firstField = await testdriver.find('email input');
|
|
176
|
+
await firstField.click();
|
|
177
|
+
await testdriver.type('user@example.com');
|
|
178
|
+
|
|
179
|
+
await testdriver.pressKeys(['tab']);
|
|
180
|
+
await testdriver.type('password123');
|
|
181
|
+
|
|
182
|
+
await testdriver.pressKeys(['tab']);
|
|
183
|
+
await testdriver.pressKeys(['enter']); // Submit
|
|
184
|
+
```
|
|
185
|
+
</Check>
|
|
186
|
+
|
|
187
|
+
<Warning>
|
|
188
|
+
**Platform-specific keys**
|
|
189
|
+
|
|
190
|
+
Use the appropriate modifier key for the platform:
|
|
191
|
+
- Windows/Linux: `'ctrl'`
|
|
192
|
+
- macOS: `'command'`
|
|
193
|
+
|
|
194
|
+
```javascript
|
|
195
|
+
// For cross-platform, you might need to detect OS
|
|
196
|
+
const modKey = process.platform === 'darwin' ? 'command' : 'ctrl';
|
|
197
|
+
await testdriver.pressKeys([modKey, 'c']); // Copy
|
|
198
|
+
```
|
|
199
|
+
</Warning>
|
|
200
|
+
|
|
201
|
+
## Use Cases
|
|
202
|
+
|
|
203
|
+
<AccordionGroup>
|
|
204
|
+
<Accordion title="Form Navigation">
|
|
205
|
+
```javascript
|
|
206
|
+
// Fill form using Tab
|
|
207
|
+
const firstField = await testdriver.find('name field');
|
|
208
|
+
await firstField.click();
|
|
209
|
+
await testdriver.type('John Doe');
|
|
210
|
+
|
|
211
|
+
await testdriver.pressKeys(['tab']);
|
|
212
|
+
await testdriver.type('john@example.com');
|
|
213
|
+
|
|
214
|
+
await testdriver.pressKeys(['tab']);
|
|
215
|
+
await testdriver.type('555-0123');
|
|
216
|
+
|
|
217
|
+
await testdriver.pressKeys(['tab']);
|
|
218
|
+
await testdriver.pressKeys(['enter']); // Submit
|
|
219
|
+
```
|
|
220
|
+
</Accordion>
|
|
221
|
+
|
|
222
|
+
<Accordion title="Text Manipulation">
|
|
223
|
+
```javascript
|
|
224
|
+
const textArea = await testdriver.find('comment textarea');
|
|
225
|
+
await textArea.click();
|
|
226
|
+
|
|
227
|
+
// Select all existing text
|
|
228
|
+
await testdriver.pressKeys(['ctrl', 'a']);
|
|
229
|
+
|
|
230
|
+
// Copy it
|
|
231
|
+
await testdriver.pressKeys(['ctrl', 'c']);
|
|
232
|
+
|
|
233
|
+
// Type new text
|
|
234
|
+
await testdriver.type('New comment');
|
|
235
|
+
|
|
236
|
+
// Undo if needed
|
|
237
|
+
await testdriver.pressKeys(['ctrl', 'z']);
|
|
238
|
+
```
|
|
239
|
+
</Accordion>
|
|
240
|
+
|
|
241
|
+
<Accordion title="Browser Navigation">
|
|
242
|
+
```javascript
|
|
243
|
+
// Open new tab
|
|
244
|
+
await testdriver.pressKeys(['ctrl', 't']);
|
|
245
|
+
await new Promise(r => setTimeout(r, 500));
|
|
246
|
+
|
|
247
|
+
// Focus address bar
|
|
248
|
+
await testdriver.pressKeys(['ctrl', 'l']);
|
|
249
|
+
await testdriver.type('https://example.com');
|
|
250
|
+
await testdriver.pressKeys(['enter']);
|
|
251
|
+
|
|
252
|
+
// Refresh page
|
|
253
|
+
await testdriver.pressKeys(['f5']);
|
|
254
|
+
|
|
255
|
+
// Close tab
|
|
256
|
+
await testdriver.pressKeys(['ctrl', 'w']);
|
|
257
|
+
```
|
|
258
|
+
</Accordion>
|
|
259
|
+
|
|
260
|
+
<Accordion title="Application Shortcuts">
|
|
261
|
+
```javascript
|
|
262
|
+
// Save document
|
|
263
|
+
await testdriver.pressKeys(['ctrl', 's']);
|
|
264
|
+
|
|
265
|
+
// Print
|
|
266
|
+
await testdriver.pressKeys(['ctrl', 'p']);
|
|
267
|
+
|
|
268
|
+
// Find in page
|
|
269
|
+
await testdriver.pressKeys(['ctrl', 'f']);
|
|
270
|
+
await testdriver.type('search term');
|
|
271
|
+
await testdriver.pressKeys(['escape']); // Close find
|
|
272
|
+
```
|
|
273
|
+
</Accordion>
|
|
274
|
+
</AccordionGroup>
|
|
275
|
+
|
|
276
|
+
## Complete Example
|
|
277
|
+
|
|
278
|
+
```javascript
|
|
279
|
+
import { beforeAll, afterAll, describe, it } from 'vitest';
|
|
280
|
+
import TestDriver from 'testdriverai';
|
|
281
|
+
|
|
282
|
+
describe('Keyboard Navigation', () => {
|
|
283
|
+
let testdriver;
|
|
284
|
+
|
|
285
|
+
beforeAll(async () => {
|
|
286
|
+
client = new TestDriver(process.env.TD_API_KEY);
|
|
287
|
+
await testdriver.auth();
|
|
288
|
+
await testdriver.connect();
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
afterAll(async () => {
|
|
292
|
+
await testdriver.disconnect();
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
it('should navigate form with keyboard', async () => {
|
|
296
|
+
await testdriver.focusApplication('Google Chrome');
|
|
297
|
+
|
|
298
|
+
// Find first field
|
|
299
|
+
const emailField = await testdriver.find('email input');
|
|
300
|
+
await emailField.click();
|
|
301
|
+
await testdriver.type('user@example.com');
|
|
302
|
+
|
|
303
|
+
// Tab through fields
|
|
304
|
+
await testdriver.pressKeys(['tab']);
|
|
305
|
+
await testdriver.type('John');
|
|
306
|
+
|
|
307
|
+
await testdriver.pressKeys(['tab']);
|
|
308
|
+
await testdriver.type('Doe');
|
|
309
|
+
|
|
310
|
+
await testdriver.pressKeys(['tab']);
|
|
311
|
+
await testdriver.type('password123');
|
|
312
|
+
|
|
313
|
+
// Submit with Enter
|
|
314
|
+
await testdriver.pressKeys(['tab']);
|
|
315
|
+
await testdriver.pressKeys(['enter']);
|
|
316
|
+
|
|
317
|
+
await testdriver.assert('form submitted successfully');
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
it('should use keyboard shortcuts', async () => {
|
|
321
|
+
// Open new browser tab
|
|
322
|
+
await testdriver.pressKeys(['ctrl', 't']);
|
|
323
|
+
await new Promise(r => setTimeout(r, 500));
|
|
324
|
+
|
|
325
|
+
// Focus address bar
|
|
326
|
+
await testdriver.pressKeys(['ctrl', 'l']);
|
|
327
|
+
await testdriver.type('https://example.com');
|
|
328
|
+
await testdriver.pressKeys(['enter']);
|
|
329
|
+
|
|
330
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
331
|
+
|
|
332
|
+
// Select all page content
|
|
333
|
+
await testdriver.pressKeys(['ctrl', 'a']);
|
|
334
|
+
|
|
335
|
+
// Copy
|
|
336
|
+
await testdriver.pressKeys(['ctrl', 'c']);
|
|
337
|
+
|
|
338
|
+
// Refresh page
|
|
339
|
+
await testdriver.pressKeys(['f5']);
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
## Related Methods
|
|
345
|
+
|
|
346
|
+
- [`type()`](/v7/type) - Type text
|
|
347
|
+
- [`click()`](/v7/click) - Click elements
|
|
348
|
+
- [`scroll()`](/v7/scroll) - Scroll pages
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: testdriver:provision
|
|
3
|
+
description: Launch browsers, desktop apps, and extensions in your sandbox
|
|
4
|
+
---
|
|
5
|
+
<!-- Generated from provision.mdx. DO NOT EDIT. -->
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
The Provision API sets up applications in your sandbox before tests run. It handles downloading, installing, and launching browsers, desktop apps, VS Code, Chrome extensions, and more.
|
|
10
|
+
|
|
11
|
+
Access provision methods via `testdriver.provision.*`:
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
await testdriver.provision.chrome({ url: 'https://example.com' });
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
<Note>
|
|
18
|
+
When `reconnect: true` is set on the client, **all provision methods are skipped** since the application is assumed to already be running.
|
|
19
|
+
</Note>
|
|
20
|
+
|
|
21
|
+
## Methods
|
|
22
|
+
|
|
23
|
+
### chrome()
|
|
24
|
+
|
|
25
|
+
Launch Google Chrome with an optional URL.
|
|
26
|
+
|
|
27
|
+
```javascript
|
|
28
|
+
await testdriver.provision.chrome(options?)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
<ParamField path="options" type="ProvisionChromeOptions">
|
|
32
|
+
<Expandable title="properties">
|
|
33
|
+
<ParamField path="url" type="string" default="http://testdriver-sandbox.vercel.app/">
|
|
34
|
+
URL to navigate to after launch.
|
|
35
|
+
</ParamField>
|
|
36
|
+
|
|
37
|
+
<ParamField path="maximized" type="boolean" default={true}>
|
|
38
|
+
Launch Chrome in maximized window mode.
|
|
39
|
+
</ParamField>
|
|
40
|
+
|
|
41
|
+
<ParamField path="guest" type="boolean" default={false}>
|
|
42
|
+
Launch Chrome in guest profile mode.
|
|
43
|
+
</ParamField>
|
|
44
|
+
</Expandable>
|
|
45
|
+
</ParamField>
|
|
46
|
+
|
|
47
|
+
```javascript
|
|
48
|
+
// Basic
|
|
49
|
+
await testdriver.provision.chrome({ url: 'https://example.com' });
|
|
50
|
+
|
|
51
|
+
// With guest mode
|
|
52
|
+
await testdriver.provision.chrome({
|
|
53
|
+
url: 'https://example.com',
|
|
54
|
+
guest: true,
|
|
55
|
+
maximized: true,
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### chromeExtension()
|
|
60
|
+
|
|
61
|
+
Install and launch a Chrome extension. You can install from a local unpacked directory or from the Chrome Web Store by extension ID.
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
await testdriver.provision.chromeExtension(options)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
<ParamField path="options" type="ProvisionChromeExtensionOptions" required>
|
|
68
|
+
One of `extensionPath` or `extensionId` is required.
|
|
69
|
+
|
|
70
|
+
<Expandable title="properties">
|
|
71
|
+
<ParamField path="extensionPath" type="string">
|
|
72
|
+
Local path to an unpacked extension directory. The extension files are uploaded to the sandbox.
|
|
73
|
+
</ParamField>
|
|
74
|
+
|
|
75
|
+
<ParamField path="extensionId" type="string">
|
|
76
|
+
Chrome Web Store extension ID to install.
|
|
77
|
+
</ParamField>
|
|
78
|
+
|
|
79
|
+
<ParamField path="maximized" type="boolean" default={true}>
|
|
80
|
+
Launch Chrome in maximized window mode.
|
|
81
|
+
</ParamField>
|
|
82
|
+
</Expandable>
|
|
83
|
+
</ParamField>
|
|
84
|
+
|
|
85
|
+
```javascript
|
|
86
|
+
// From local directory
|
|
87
|
+
await testdriver.provision.chromeExtension({
|
|
88
|
+
extensionPath: './my-extension',
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// From Chrome Web Store
|
|
92
|
+
await testdriver.provision.chromeExtension({
|
|
93
|
+
extensionId: 'abcdefghijklmnop',
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### vscode()
|
|
98
|
+
|
|
99
|
+
Launch Visual Studio Code with an optional workspace and extensions.
|
|
100
|
+
|
|
101
|
+
```javascript
|
|
102
|
+
await testdriver.provision.vscode(options?)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
<ParamField path="options" type="ProvisionVSCodeOptions">
|
|
106
|
+
<Expandable title="properties">
|
|
107
|
+
<ParamField path="workspace" type="string">
|
|
108
|
+
Path to a workspace folder or `.code-workspace` file to open.
|
|
109
|
+
</ParamField>
|
|
110
|
+
|
|
111
|
+
<ParamField path="extensions" type="string[]" default={[]}>
|
|
112
|
+
Array of VS Code extension IDs to install before launching.
|
|
113
|
+
</ParamField>
|
|
114
|
+
</Expandable>
|
|
115
|
+
</ParamField>
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
await testdriver.provision.vscode({
|
|
119
|
+
workspace: '/home/testdriver/project',
|
|
120
|
+
extensions: ['ms-python.python', 'esbenp.prettier-vscode'],
|
|
121
|
+
});
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### installer()
|
|
125
|
+
|
|
126
|
+
Download and run an application installer. Supports `.msi`, `.exe`, `.deb`, `.rpm`, `.appimage`, `.sh`, `.dmg`, and `.pkg` formats.
|
|
127
|
+
|
|
128
|
+
```javascript
|
|
129
|
+
await testdriver.provision.installer(options)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
<ParamField path="options" type="ProvisionInstallerOptions" required>
|
|
133
|
+
<Expandable title="properties">
|
|
134
|
+
<ParamField path="url" type="string" required>
|
|
135
|
+
Download URL for the installer.
|
|
136
|
+
</ParamField>
|
|
137
|
+
|
|
138
|
+
<ParamField path="filename" type="string">
|
|
139
|
+
Override the auto-detected filename from the URL.
|
|
140
|
+
</ParamField>
|
|
141
|
+
|
|
142
|
+
<ParamField path="appName" type="string">
|
|
143
|
+
Application name to focus after installation completes.
|
|
144
|
+
</ParamField>
|
|
145
|
+
|
|
146
|
+
<ParamField path="launch" type="boolean" default={true}>
|
|
147
|
+
Whether to focus/launch the app after installation.
|
|
148
|
+
</ParamField>
|
|
149
|
+
</Expandable>
|
|
150
|
+
</ParamField>
|
|
151
|
+
|
|
152
|
+
**Behavior:**
|
|
153
|
+
- Downloads the installer from the URL
|
|
154
|
+
- Auto-detects the install method based on file extension
|
|
155
|
+
- Runs the appropriate install command (e.g., `msiexec` for `.msi`, `dpkg` for `.deb`)
|
|
156
|
+
- Optionally focuses the installed application
|
|
157
|
+
|
|
158
|
+
```javascript
|
|
159
|
+
// Windows MSI installer
|
|
160
|
+
await testdriver.provision.installer({
|
|
161
|
+
url: 'https://example.com/app-setup.msi',
|
|
162
|
+
appName: 'MyApp',
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
// Linux DEB package
|
|
166
|
+
await testdriver.provision.installer({
|
|
167
|
+
url: 'https://example.com/app.deb',
|
|
168
|
+
appName: 'MyApp',
|
|
169
|
+
launch: true,
|
|
170
|
+
});
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### electron()
|
|
174
|
+
|
|
175
|
+
Launch an Electron application.
|
|
176
|
+
|
|
177
|
+
```javascript
|
|
178
|
+
await testdriver.provision.electron(options)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
<ParamField path="options" type="ProvisionElectronOptions" required>
|
|
182
|
+
<Expandable title="properties">
|
|
183
|
+
<ParamField path="appPath" type="string" required>
|
|
184
|
+
Path to the Electron application directory or executable.
|
|
185
|
+
</ParamField>
|
|
186
|
+
|
|
187
|
+
<ParamField path="args" type="string[]" default={[]}>
|
|
188
|
+
Additional command-line arguments to pass to the Electron app.
|
|
189
|
+
</ParamField>
|
|
190
|
+
</Expandable>
|
|
191
|
+
</ParamField>
|
|
192
|
+
|
|
193
|
+
```javascript
|
|
194
|
+
await testdriver.provision.electron({
|
|
195
|
+
appPath: '/home/testdriver/my-electron-app',
|
|
196
|
+
args: ['--no-sandbox'],
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### dashcam()
|
|
201
|
+
|
|
202
|
+
Start Dashcam recording with custom options. Usually called automatically by other provision methods, but can be called directly for custom configurations.
|
|
203
|
+
|
|
204
|
+
```javascript
|
|
205
|
+
await testdriver.provision.dashcam(options?)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
<ParamField path="options" type="ProvisionDashcamOptions">
|
|
209
|
+
<Expandable title="properties">
|
|
210
|
+
<ParamField path="logPath" type="string">
|
|
211
|
+
Path to the TestDriver log file. Defaults to `/tmp/testdriver.log` (Linux) or `C:\Users\testdriver\testdriver.log` (Windows).
|
|
212
|
+
</ParamField>
|
|
213
|
+
|
|
214
|
+
<ParamField path="logName" type="string" default="TestDriver Log">
|
|
215
|
+
Display name for the log file in the Dashcam replay.
|
|
216
|
+
</ParamField>
|
|
217
|
+
|
|
218
|
+
<ParamField path="webLogs" type="boolean" default={true}>
|
|
219
|
+
Enable web traffic log capture.
|
|
220
|
+
</ParamField>
|
|
221
|
+
|
|
222
|
+
<ParamField path="title" type="string">
|
|
223
|
+
Recording title for the Dashcam session.
|
|
224
|
+
</ParamField>
|
|
225
|
+
</Expandable>
|
|
226
|
+
</ParamField>
|
|
227
|
+
|
|
228
|
+
```javascript
|
|
229
|
+
await testdriver.provision.dashcam({
|
|
230
|
+
title: 'Login Flow Test',
|
|
231
|
+
logPath: '/tmp/my-app.log',
|
|
232
|
+
logName: 'Application Log',
|
|
233
|
+
webLogs: true,
|
|
234
|
+
});
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## Reconnect Behavior
|
|
238
|
+
|
|
239
|
+
When `reconnect: true` is set on the client, all provision methods are wrapped in a Proxy that intercepts calls and skips them silently. This is because when reconnecting to an existing sandbox, the applications are already running.
|
|
240
|
+
|
|
241
|
+
```javascript
|
|
242
|
+
const testdriver = new TestDriver({
|
|
243
|
+
reconnect: true,
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
await testdriver.ready();
|
|
247
|
+
|
|
248
|
+
// These calls are silently skipped:
|
|
249
|
+
await testdriver.provision.chrome({ url: 'https://example.com' });
|
|
250
|
+
await testdriver.provision.dashcam();
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Types
|
|
254
|
+
|
|
255
|
+
```typescript
|
|
256
|
+
interface ProvisionChromeOptions {
|
|
257
|
+
url?: string; // Default: "http://testdriver-sandbox.vercel.app/"
|
|
258
|
+
maximized?: boolean; // Default: true
|
|
259
|
+
guest?: boolean; // Default: false
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
interface ProvisionChromeExtensionOptions {
|
|
263
|
+
extensionPath?: string; // Local unpacked extension path
|
|
264
|
+
extensionId?: string; // Chrome Web Store ID
|
|
265
|
+
maximized?: boolean; // Default: true
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
interface ProvisionVSCodeOptions {
|
|
269
|
+
workspace?: string; // Workspace path
|
|
270
|
+
extensions?: string[]; // Extension IDs to install
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
interface ProvisionInstallerOptions {
|
|
274
|
+
url: string; // Download URL (required)
|
|
275
|
+
filename?: string; // Override filename
|
|
276
|
+
appName?: string; // App name to focus
|
|
277
|
+
launch?: boolean; // Default: true
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
interface ProvisionElectronOptions {
|
|
281
|
+
appPath: string; // Path to Electron app (required)
|
|
282
|
+
args?: string[]; // Additional args
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
interface ProvisionDashcamOptions {
|
|
286
|
+
logPath?: string; // Log file path
|
|
287
|
+
logName?: string; // Default: "TestDriver Log"
|
|
288
|
+
webLogs?: boolean; // Default: true
|
|
289
|
+
title?: string; // Recording title
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## Complete Example
|
|
294
|
+
|
|
295
|
+
```javascript
|
|
296
|
+
import { describe, it, beforeAll, afterAll } from 'vitest';
|
|
297
|
+
import TestDriver from 'testdriverai';
|
|
298
|
+
|
|
299
|
+
describe('Chrome Extension Test', () => {
|
|
300
|
+
let testdriver;
|
|
301
|
+
|
|
302
|
+
beforeAll(async () => {
|
|
303
|
+
testdriver = new TestDriver({
|
|
304
|
+
os: 'linux',
|
|
305
|
+
resolution: '1920x1080',
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
await testdriver.ready();
|
|
309
|
+
|
|
310
|
+
// Install extension and open Chrome
|
|
311
|
+
await testdriver.provision.chromeExtension({
|
|
312
|
+
extensionPath: './my-extension',
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
// Start Dashcam with custom logs
|
|
316
|
+
await testdriver.provision.dashcam({
|
|
317
|
+
title: 'Extension Test',
|
|
318
|
+
webLogs: true,
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
afterAll(async () => {
|
|
323
|
+
await testdriver.disconnect();
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it('tests the extension popup', async () => {
|
|
327
|
+
await testdriver.find('extension icon').click();
|
|
328
|
+
await testdriver.find('popup content').click();
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
```
|