@testdriverai/agent 7.8.0-canary.10
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,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestDriver SDK - Installer Test (Vitest)
|
|
3
|
+
* Tests the provision.installer() method for downloading and installing apps
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../lib/vitest/hooks.mjs";
|
|
8
|
+
import { getDefaults } from "./config.mjs";
|
|
9
|
+
|
|
10
|
+
const isLinux = (process.env.TD_OS || "linux") === "linux";
|
|
11
|
+
|
|
12
|
+
describe("Provision Installer", () => {
|
|
13
|
+
it.skipIf(!isLinux)(
|
|
14
|
+
"should download and install a .deb package on Linux",
|
|
15
|
+
async (context) => {
|
|
16
|
+
const testdriver = TestDriver(context, { ...getDefaults(context) });
|
|
17
|
+
|
|
18
|
+
// Install bat (a cat clone with syntax highlighting) using provision.installer
|
|
19
|
+
const filePath = await testdriver.provision.installer({
|
|
20
|
+
url: 'https://github.com/sharkdp/bat/releases/download/v0.24.0/bat_0.24.0_amd64.deb',
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Verify the file was downloaded
|
|
24
|
+
expect(filePath).toContain('bat');
|
|
25
|
+
|
|
26
|
+
// Verify bat was installed by running it
|
|
27
|
+
await testdriver.exec('sh', 'bat --version', 10000);
|
|
28
|
+
},
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
it.skipIf(!isLinux)(
|
|
32
|
+
"should download a shell script and verify it exists",
|
|
33
|
+
async (context) => {
|
|
34
|
+
const testdriver = TestDriver(context, { ...getDefaults(context) });
|
|
35
|
+
|
|
36
|
+
// Download a shell script (nvm installer)
|
|
37
|
+
const filePath = await testdriver.provision.installer({
|
|
38
|
+
url: 'https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh',
|
|
39
|
+
launch: false, // Don't auto-run the script
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Verify the file was downloaded
|
|
43
|
+
expect(filePath).toContain('install.sh');
|
|
44
|
+
|
|
45
|
+
// Verify the file is executable
|
|
46
|
+
const result = await testdriver.exec('sh', `ls -la "${filePath}"`, 10000);
|
|
47
|
+
expect(result).toBeTruthy();
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { TestDriver } from "../lib/vitest/hooks.mjs";
|
|
3
|
+
import { getDefaults } from "./config.mjs";
|
|
4
|
+
|
|
5
|
+
const isLinux = (process.env.TD_OS || "linux") === "linux";
|
|
6
|
+
|
|
7
|
+
describe("Launch VS Code on Linux", () => {
|
|
8
|
+
it.skipIf(!isLinux)(
|
|
9
|
+
"should launch VS Code on Debian/Ubuntu",
|
|
10
|
+
async (context) => {
|
|
11
|
+
const testdriver = TestDriver(context, { ...getDefaults(context) });
|
|
12
|
+
|
|
13
|
+
// provision.vscode() automatically calls ready() and starts dashcam
|
|
14
|
+
await testdriver.provision.vscode();
|
|
15
|
+
|
|
16
|
+
// Wait for VS Code to launch (polls every 5s until found or timeout)
|
|
17
|
+
const vsCodeWindow = await testdriver.find(
|
|
18
|
+
"Visual Studio Code window",
|
|
19
|
+
{ timeout: 60000 }
|
|
20
|
+
);
|
|
21
|
+
expect(vsCodeWindow.found()).toBeTruthy();
|
|
22
|
+
},
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
it.skipIf(!isLinux)(
|
|
26
|
+
"should install and use a VS Code extension",
|
|
27
|
+
async (context) => {
|
|
28
|
+
const testdriver = TestDriver(context, { ...getDefaults(context) });
|
|
29
|
+
|
|
30
|
+
// Launch VS Code with the Prettier extension installed
|
|
31
|
+
await testdriver.provision.vscode({
|
|
32
|
+
extensions: ["esbenp.prettier-vscode"],
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const vsCodeWindow = await testdriver.find(
|
|
36
|
+
"Visual Studio Code window",
|
|
37
|
+
{ timeout: 60000 }
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
expect(vsCodeWindow.found()).toBeTruthy();
|
|
41
|
+
|
|
42
|
+
// Open the extensions panel to verify Prettier is installed
|
|
43
|
+
await testdriver.pressKeys(["ctrl", "shift", "x"]);
|
|
44
|
+
|
|
45
|
+
// Wait for extensions panel to open
|
|
46
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
47
|
+
|
|
48
|
+
// Assert that Prettier extension is visible in the installed extensions
|
|
49
|
+
const prettierVisible = await testdriver.assert(
|
|
50
|
+
"Prettier extension is visible in the extensions panel or sidebar",
|
|
51
|
+
);
|
|
52
|
+
expect(prettierVisible).toBeTruthy();
|
|
53
|
+
},
|
|
54
|
+
);
|
|
55
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestDriver SDK - Match Image Test (Vitest)
|
|
3
|
+
* Converted from: testdriver/acceptance/match-image.yaml
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import path, { dirname } from "path";
|
|
7
|
+
import { fileURLToPath } from "url";
|
|
8
|
+
import { describe, expect, it } from "vitest";
|
|
9
|
+
import { TestDriver } from "../lib/vitest/hooks.mjs";
|
|
10
|
+
import { getDefaults } from "./config.mjs";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Perform login flow for SauceLabs demo app
|
|
14
|
+
* @param {TestDriver} client - TestDriver client
|
|
15
|
+
* @param {string} username - Username (default: 'standard_user')
|
|
16
|
+
*/
|
|
17
|
+
async function performLogin(client, username = "standard_user") {
|
|
18
|
+
await client.focusApplication("Google Chrome");
|
|
19
|
+
const password = await client.extract("the password");
|
|
20
|
+
const usernameField = await client.find(
|
|
21
|
+
"username input",
|
|
22
|
+
);
|
|
23
|
+
await usernameField.click();
|
|
24
|
+
await client.type(username);
|
|
25
|
+
await client.pressKeys(["tab"]);
|
|
26
|
+
await client.type(password, { secret: true });
|
|
27
|
+
await client.pressKeys(["tab"]);
|
|
28
|
+
await client.pressKeys(["enter"]);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Get the directory of the current module
|
|
32
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
33
|
+
const __dirname = dirname(__filename);
|
|
34
|
+
|
|
35
|
+
describe("Match Image Test", () => {
|
|
36
|
+
it.skip("should match shopping cart image and verify empty cart", async (context) => {
|
|
37
|
+
const testdriver = TestDriver(context, { ...getDefaults(context), headless: true });
|
|
38
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
39
|
+
|
|
40
|
+
//
|
|
41
|
+
// Perform login first
|
|
42
|
+
await performLogin(testdriver);
|
|
43
|
+
|
|
44
|
+
// Match and click the shopping cart icon
|
|
45
|
+
const cartImagePath = path.resolve(
|
|
46
|
+
__dirname,
|
|
47
|
+
"../../_testdriver/acceptance/screenshots/cart.png",
|
|
48
|
+
);
|
|
49
|
+
await testdriver.matchImage(cartImagePath, "click");
|
|
50
|
+
|
|
51
|
+
// Assert that you see an empty shopping cart
|
|
52
|
+
const result = await testdriver.assert("Your cart is empty");
|
|
53
|
+
expect(result).toBeTruthy();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestDriver SDK - Parse Test (Vitest)
|
|
3
|
+
* Opens Airbnb and runs the .parse() SDK command to analyze the screen.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../lib/vitest/hooks.mjs";
|
|
8
|
+
import { getDefaults } from "./config.mjs";
|
|
9
|
+
|
|
10
|
+
describe("Parse Test", () => {
|
|
11
|
+
it("should open Airbnb and parse the screen", async (context) => {
|
|
12
|
+
const testdriver = TestDriver(context, { ...getDefaults(context) });
|
|
13
|
+
await testdriver.provision.chrome({ url: "https://www.airbnb.com" });
|
|
14
|
+
|
|
15
|
+
// The SDK automatically outputs elements as a formatted table
|
|
16
|
+
const result = await testdriver.parse();
|
|
17
|
+
console.log(`Found ${result.elements?.length || 0} elements`);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestDriver SDK - Press Keys Test (Vitest)
|
|
3
|
+
* Converted from: testdriver/acceptance/press-keys.yaml
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../lib/vitest/hooks.mjs";
|
|
8
|
+
import { getDefaults } from "./config.mjs";
|
|
9
|
+
|
|
10
|
+
describe("Press Keys Test", () => {
|
|
11
|
+
it("should create tabs and navigate using keyboard shortcuts", async (context) => {
|
|
12
|
+
const testdriver = TestDriver(context, { ...getDefaults(context), headless: true });
|
|
13
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
14
|
+
|
|
15
|
+
const signInButton = await testdriver.find(
|
|
16
|
+
"Sign In, black button below the password field",
|
|
17
|
+
);
|
|
18
|
+
await signInButton.click();
|
|
19
|
+
|
|
20
|
+
// Open new tab
|
|
21
|
+
await testdriver.pressKeys(["ctrl", "t"]);
|
|
22
|
+
|
|
23
|
+
// Poll for "Learn more" to appear
|
|
24
|
+
let imagesLink = await testdriver.find("Images", {timeout: 5000});
|
|
25
|
+
|
|
26
|
+
expect(imagesLink.found()).toBeTruthy();
|
|
27
|
+
|
|
28
|
+
// Open DevTools
|
|
29
|
+
await testdriver.pressKeys(["ctrl", "shift", "i"]);
|
|
30
|
+
|
|
31
|
+
// Poll for "Elements" to appear
|
|
32
|
+
let elements = await testdriver.find("Elements", {timeout: 5000});
|
|
33
|
+
expect(elements.found()).toBeTruthy();
|
|
34
|
+
|
|
35
|
+
// Open another tab and navigate
|
|
36
|
+
await testdriver.pressKeys(["ctrl", "t"]);
|
|
37
|
+
await testdriver.type("google.com");
|
|
38
|
+
await testdriver.pressKeys(["enter"]);
|
|
39
|
+
|
|
40
|
+
// Assert Google appears
|
|
41
|
+
const result = await testdriver.assert("google appears");
|
|
42
|
+
expect(result).toBeTruthy();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestDriver SDK - Prompt Test (Vitest)
|
|
3
|
+
* Converted from: testdriver/acceptance/prompt.yaml
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../lib/vitest/hooks.mjs";
|
|
8
|
+
import { getDefaults } from "./config.mjs";
|
|
9
|
+
|
|
10
|
+
describe.skip("Prompt Test", () => {
|
|
11
|
+
it("should execute AI-driven prompts", async (context) => {
|
|
12
|
+
const testdriver = TestDriver(context, { ...getDefaults(context), headless: true });
|
|
13
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
14
|
+
|
|
15
|
+
//
|
|
16
|
+
// Note: The SDK doesn't have a direct equivalent to YAML prompts without commands.
|
|
17
|
+
// This would typically be handled by the AI agent interpreting natural language.
|
|
18
|
+
// For SDK usage, you need to use explicit commands.
|
|
19
|
+
|
|
20
|
+
// Original prompts were:
|
|
21
|
+
// 1. "log in"
|
|
22
|
+
// 2. "add an item to the cart"
|
|
23
|
+
// 3. "click on the cart icon"
|
|
24
|
+
// 4. "complete checkout"
|
|
25
|
+
|
|
26
|
+
// This test is skipped as it requires explicit SDK implementation
|
|
27
|
+
// You would need to implement these as explicit SDK calls
|
|
28
|
+
|
|
29
|
+
await testdriver.act("log in");
|
|
30
|
+
|
|
31
|
+
const result = await testdriver.assert("the testdriver sandbox is visible");
|
|
32
|
+
expect(result).toBeTruthy();
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestDriver SDK - Scroll Keyboard Test (Vitest)
|
|
3
|
+
* Converted from: testdriver/acceptance/scroll-keyboard.yaml
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../lib/vitest/hooks.mjs";
|
|
8
|
+
import { getDefaults } from "./config.mjs";
|
|
9
|
+
|
|
10
|
+
describe("Scroll Keyboard Test", () => {
|
|
11
|
+
it("should navigate to webhamster.com and scroll with keyboard", async (context) => {
|
|
12
|
+
const testdriver = TestDriver(context, { ...getDefaults(context), headless: true });
|
|
13
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
14
|
+
|
|
15
|
+
//
|
|
16
|
+
// Navigate to https://www.webhamster.com/
|
|
17
|
+
await testdriver.focusApplication("Google Chrome");
|
|
18
|
+
const urlBar = await testdriver.find(
|
|
19
|
+
"testdriver-sandbox.vercel.app/login, the URL in the omnibox showing the current page", {zoom: true}
|
|
20
|
+
);
|
|
21
|
+
await urlBar.click();
|
|
22
|
+
await testdriver.pressKeys(["ctrl", "a"]);
|
|
23
|
+
await testdriver.type("https://www.webhamster.com/");
|
|
24
|
+
await testdriver.pressKeys(["enter"]);
|
|
25
|
+
|
|
26
|
+
// Scroll down with keyboard 1000 pixels
|
|
27
|
+
const heading = await testdriver.find(
|
|
28
|
+
"The Hamster Dance, large heading at top of page",
|
|
29
|
+
);
|
|
30
|
+
await heading.click();
|
|
31
|
+
await testdriver.scroll("down", { amount: 1000 });
|
|
32
|
+
|
|
33
|
+
// Assert the page is scrolled down
|
|
34
|
+
const result = await testdriver.assert("The text 'The Hamster Dance' is not visible on the webpage content. It's ok if it's visible in the tab title.");
|
|
35
|
+
|
|
36
|
+
expect(result).toBeTruthy();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestDriver SDK - Scroll Until Image Test (Vitest)
|
|
3
|
+
* Converted from: testdriver/acceptance/scroll-until-image.yaml
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../lib/vitest/hooks.mjs";
|
|
8
|
+
import { getDefaults } from "./config.mjs";
|
|
9
|
+
|
|
10
|
+
describe("Scroll Until Image Test", () => {
|
|
11
|
+
it.skip("should scroll until brown colored house image appears", async (context) => {
|
|
12
|
+
const testdriver = TestDriver(context, { ...getDefaults(context), headless: true });
|
|
13
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
14
|
+
|
|
15
|
+
//
|
|
16
|
+
// Navigate to Wikipedia page
|
|
17
|
+
await testdriver.pressKeys(["ctrl", "l"]);
|
|
18
|
+
await testdriver.type("https://en.wikipedia.org/wiki/Leonardo_da_Vinci");
|
|
19
|
+
await testdriver.pressKeys(["enter"]);
|
|
20
|
+
|
|
21
|
+
// sleep for 5 seconds
|
|
22
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
23
|
+
|
|
24
|
+
// Click on heading
|
|
25
|
+
const heading = await testdriver.find(
|
|
26
|
+
"Leonardo Da Vinci, the page heading",
|
|
27
|
+
0,
|
|
28
|
+
);
|
|
29
|
+
await heading.click();
|
|
30
|
+
|
|
31
|
+
// Scroll until image appears
|
|
32
|
+
await testdriver.scrollUntilImage("a brown colored house", "down", 10000);
|
|
33
|
+
|
|
34
|
+
// Assert image of brown colored house appears on screen
|
|
35
|
+
const result = await testdriver.assert(
|
|
36
|
+
"image of brown colored house appears on screen",
|
|
37
|
+
);
|
|
38
|
+
expect(result).toBeTruthy();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestDriver SDK - Scroll Test (Vitest)
|
|
3
|
+
* Converted from: testdriver/acceptance/scroll.yaml
|
|
4
|
+
*
|
|
5
|
+
* UPDATED: Now using chrome preset for automatic setup
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { describe, expect, it } from "vitest";
|
|
9
|
+
import { TestDriver } from "../lib/vitest/hooks.mjs";
|
|
10
|
+
import { getDefaults } from "./config.mjs";
|
|
11
|
+
|
|
12
|
+
describe("Scroll Test", () => {
|
|
13
|
+
it("should navigate and scroll down the page", async (context) => {
|
|
14
|
+
const testdriver = TestDriver(context, { ...getDefaults(context), headless: true });
|
|
15
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
16
|
+
|
|
17
|
+
// Give Chrome a moment to fully render the UI
|
|
18
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
19
|
+
|
|
20
|
+
// Navigate to webhamster.com - just look for the domain, not the full path
|
|
21
|
+
const urlBar = await testdriver.find(
|
|
22
|
+
"testdriver-sandbox.vercel.app, the URL in the address bar",
|
|
23
|
+
);
|
|
24
|
+
await urlBar.click();
|
|
25
|
+
await testdriver.pressKeys(["ctrl", "a"]);
|
|
26
|
+
await testdriver.type("https://www.webhamster.com/");
|
|
27
|
+
await testdriver.pressKeys(["enter"]);
|
|
28
|
+
|
|
29
|
+
// Wait for page to load and click heading
|
|
30
|
+
const heading = await testdriver.find(
|
|
31
|
+
"The Hamster Dance, large heading at top of page",
|
|
32
|
+
);
|
|
33
|
+
await heading.click();
|
|
34
|
+
|
|
35
|
+
// Scroll down
|
|
36
|
+
await testdriver.scroll("down", { amount: 1000 });
|
|
37
|
+
|
|
38
|
+
// Assert page is scrolled
|
|
39
|
+
const result = await testdriver.assert("The text 'The Hamster Dance' is not visible on the webpage content. It's ok if it's visible in the tab title.");
|
|
40
|
+
expect(result).toBeTruthy();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { TestDriver } from "../lib/vitest/hooks.mjs";
|
|
3
|
+
import { getDefaults } from "./config.mjs";
|
|
4
|
+
|
|
5
|
+
describe("Type Test", () => {
|
|
6
|
+
it("should enter standard_user in username field", async (context) => {
|
|
7
|
+
const testdriver = TestDriver(context, { ...getDefaults(context), headless: true });
|
|
8
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
9
|
+
|
|
10
|
+
//
|
|
11
|
+
const usernameField = await testdriver.find(
|
|
12
|
+
"Username, input field for username",
|
|
13
|
+
);
|
|
14
|
+
await usernameField.click();
|
|
15
|
+
await testdriver.type("standard_user");
|
|
16
|
+
|
|
17
|
+
const result = await testdriver.assert(
|
|
18
|
+
'the username field contains "standard_user"',
|
|
19
|
+
);
|
|
20
|
+
expect(result).toBeTruthy();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should show validation message when clicking Sign In without password", async (context) => {
|
|
24
|
+
const testdriver = TestDriver(context, { ...getDefaults(context), headless: true });
|
|
25
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
26
|
+
|
|
27
|
+
// First fill in username
|
|
28
|
+
const usernameField = await testdriver.find(
|
|
29
|
+
"Username, input field for username",
|
|
30
|
+
);
|
|
31
|
+
await usernameField.click();
|
|
32
|
+
await testdriver.type("standard_user");
|
|
33
|
+
|
|
34
|
+
//
|
|
35
|
+
const signInButton = await testdriver.find(
|
|
36
|
+
"Sign in, black button below the password field",
|
|
37
|
+
);
|
|
38
|
+
await signInButton.click();
|
|
39
|
+
|
|
40
|
+
await testdriver.focusApplication("Google Chrome");
|
|
41
|
+
const result = await testdriver.assert(
|
|
42
|
+
"Please fill out this field is visible near the password field",
|
|
43
|
+
);
|
|
44
|
+
expect(result).toBeTruthy();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestDriver SDK - Windows Installer Example (Vitest)
|
|
3
|
+
*
|
|
4
|
+
* This example demonstrates how to download and install a Windows application
|
|
5
|
+
* using PowerShell commands, then launch and interact with it.
|
|
6
|
+
*
|
|
7
|
+
* Based on the v6 GitButler provisioning workflow.
|
|
8
|
+
*
|
|
9
|
+
* Run: TD_OS=windows vitest run examples/windows-installer.test.mjs
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { describe, it } from "vitest";
|
|
13
|
+
import { TestDriver } from "../lib/vitest/hooks.mjs";
|
|
14
|
+
import { getDefaults } from "./config.mjs";
|
|
15
|
+
|
|
16
|
+
const isLinux = (process.env.TD_OS || "linux") === "linux";
|
|
17
|
+
|
|
18
|
+
describe("Windows App Installation", () => {
|
|
19
|
+
|
|
20
|
+
it.skipIf(isLinux)("should download, install, and launch GitButler on Windows", async (context) => {
|
|
21
|
+
// Alternative approach using provision.installer helper
|
|
22
|
+
const testdriver = TestDriver(context, {
|
|
23
|
+
...getDefaults(context),
|
|
24
|
+
os: 'windows'
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// Download the MSI installer
|
|
28
|
+
const installerPath = await testdriver.provision.installer({
|
|
29
|
+
url: 'https://app.gitbutler.com/downloads/release/windows/x86_64/msi',
|
|
30
|
+
launch: false, // Don't auto-launch, we'll install manually
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
console.log('Installer downloaded to:', installerPath);
|
|
34
|
+
|
|
35
|
+
// Install the MSI silently (the file might not have an extension, so we try MSI first)
|
|
36
|
+
await testdriver.exec('pwsh',
|
|
37
|
+
`Start-Process msiexec.exe -ArgumentList "/i \`"${installerPath}\`" /qn /norestart" -Wait`,
|
|
38
|
+
120000
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
// Verify installation by checking if executable exists
|
|
42
|
+
const verifyScript = `
|
|
43
|
+
$exePath = "C:\\Program Files\\GitButler\\gitbutler-tauri.exe"
|
|
44
|
+
if (Test-Path $exePath) {
|
|
45
|
+
Write-Host "GitButler installed successfully at $exePath"
|
|
46
|
+
} else {
|
|
47
|
+
Write-Error "GitButler not found"
|
|
48
|
+
exit 1
|
|
49
|
+
}
|
|
50
|
+
`;
|
|
51
|
+
|
|
52
|
+
await testdriver.exec('pwsh', verifyScript, 5000);
|
|
53
|
+
});
|
|
54
|
+
});
|
package/index.js
ADDED