@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,232 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Reporting Failed Tests to Jira"
|
|
3
|
+
sidebarTitle: "Jira"
|
|
4
|
+
description: "Step-by-step instructions to integrate TestDriver with Jira for automated test failure tracking in CI/CD workflows."
|
|
5
|
+
icon: "jira"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Automating Jira ticket creation for test failures using TestDriver CLI and Jira GitHub Actions
|
|
9
|
+
|
|
10
|
+
This guide explains how to integrate the **TestDriver CLI** with the **Jira GitHub Action** to automatically create a Jira ticket whenever a TestDriver test fails. This workflow ensures that test failures are tracked in Jira, enabling teams to address issues promptly.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Workflow overview
|
|
15
|
+
|
|
16
|
+
<Steps>
|
|
17
|
+
<Step title="Run Tests with TestDriver CLI">
|
|
18
|
+
Use the TestDriver CLI with the --headless flag to execute your test suite
|
|
19
|
+
in a headless environment.
|
|
20
|
+
</Step>
|
|
21
|
+
<Step title="Check for Test Failures">
|
|
22
|
+
Capture the test results and determine if any tests failed.
|
|
23
|
+
</Step>
|
|
24
|
+
<Step title="Create a Jira Ticket">
|
|
25
|
+
Use the Jira GitHub Action to create a new ticket for each test failure,
|
|
26
|
+
including relevant details such as the test name, failure reason, and logs.
|
|
27
|
+
</Step>
|
|
28
|
+
</Steps>
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Prerequisites
|
|
32
|
+
|
|
33
|
+
1. **TestDriver API Key**: Store your API key as a GitHub secret (for example, `TD_API_KEY`).
|
|
34
|
+
2. **Jira API Token**: Generate an API token from your Jira account and store it as a GitHub secret (for example, `JIRA_API_TOKEN`).
|
|
35
|
+
3. **Jira Base URL**: Your Jira instance URL (for example, `https://yourcompany.atlassian.net`).
|
|
36
|
+
4. **Jira Project Key**: The key of the Jira project where tickets will be created (for example, `TEST`).
|
|
37
|
+
5. **TestDriver CLI**: The TestDriver CLI must be installed and configured in your workflow.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## GitHub Actions workflow
|
|
42
|
+
|
|
43
|
+
Here's a complete workflow that integrates TestDriver and Jira:
|
|
44
|
+
|
|
45
|
+
### Workflow File:
|
|
46
|
+
|
|
47
|
+
```yaml .github/workflows/testdriver-jira.yaml [expandable]
|
|
48
|
+
name: TestDriver with Jira Integration
|
|
49
|
+
|
|
50
|
+
on:
|
|
51
|
+
push:
|
|
52
|
+
branches:
|
|
53
|
+
- main
|
|
54
|
+
pull_request:
|
|
55
|
+
workflow_dispatch:
|
|
56
|
+
|
|
57
|
+
jobs:
|
|
58
|
+
run-tests:
|
|
59
|
+
name: Run Tests with TestDriver
|
|
60
|
+
runs-on: windows-latest
|
|
61
|
+
steps:
|
|
62
|
+
- name: Check out repository
|
|
63
|
+
uses: actions/checkout@v4
|
|
64
|
+
|
|
65
|
+
- name: Setup Node.js
|
|
66
|
+
uses: actions/setup-node@v4
|
|
67
|
+
with:
|
|
68
|
+
node-version: "18"
|
|
69
|
+
|
|
70
|
+
- name: Run TestDriver
|
|
71
|
+
id: testdriver
|
|
72
|
+
shell: powershell
|
|
73
|
+
run: |
|
|
74
|
+
$exitCode = 0
|
|
75
|
+
try {
|
|
76
|
+
npx testdriverai@latest run testdriver/test.yaml --summary="testdriver-summary.txt"
|
|
77
|
+
} catch {
|
|
78
|
+
$exitCode = $LASTEXITCODE
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
# Set outputs for next steps
|
|
82
|
+
echo "exit_code=$exitCode" >> $env:GITHUB_OUTPUT
|
|
83
|
+
if ($exitCode -ne 0) {
|
|
84
|
+
echo "success=false" >> $env:GITHUB_OUTPUT
|
|
85
|
+
} else {
|
|
86
|
+
echo "success=true" >> $env:GITHUB_OUTPUT
|
|
87
|
+
}
|
|
88
|
+
env:
|
|
89
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
90
|
+
|
|
91
|
+
- name: Check for Test Failures
|
|
92
|
+
id: check-failures
|
|
93
|
+
shell: powershell
|
|
94
|
+
run: |
|
|
95
|
+
if ("${{ steps.testdriver.outputs.success }}" -eq "false") {
|
|
96
|
+
echo "TestDriver tests failed."
|
|
97
|
+
echo "failure=true" >> $env:GITHUB_ENV
|
|
98
|
+
|
|
99
|
+
# Copy the output file for Jira ticket
|
|
100
|
+
Copy-Item testdriver-summary.txt failure-details.txt
|
|
101
|
+
} else {
|
|
102
|
+
echo "All tests passed."
|
|
103
|
+
echo "failure=false" >> $env:GITHUB_ENV
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
- name: Upload test results
|
|
107
|
+
if: always()
|
|
108
|
+
uses: actions/upload-artifact@v4
|
|
109
|
+
with:
|
|
110
|
+
name: testdriver-results
|
|
111
|
+
path: |
|
|
112
|
+
testdriver-summary.txt
|
|
113
|
+
failure-details.txt
|
|
114
|
+
|
|
115
|
+
create-jira-ticket:
|
|
116
|
+
name: Create Jira Ticket for Test Failures
|
|
117
|
+
needs: run-tests
|
|
118
|
+
runs-on: ubuntu-latest
|
|
119
|
+
if: needs.run-tests.outputs.failure == 'true'
|
|
120
|
+
steps:
|
|
121
|
+
- name: Download test results
|
|
122
|
+
uses: actions/download-artifact@v4
|
|
123
|
+
with:
|
|
124
|
+
name: testdriver-results
|
|
125
|
+
|
|
126
|
+
- name: Create Jira Ticket
|
|
127
|
+
uses: atlassian/gajira-create@v3
|
|
128
|
+
with:
|
|
129
|
+
url: ${{ secrets.JIRA_BASE_URL }}
|
|
130
|
+
user: ${{ secrets.JIRA_USERNAME }}
|
|
131
|
+
api-token: ${{ secrets.JIRA_API_TOKEN }}
|
|
132
|
+
project: TEST # Replace with your Jira project key
|
|
133
|
+
summary: "TestDriver Test Failure in ${{ github.repository }}"
|
|
134
|
+
description: |
|
|
135
|
+
A test failure occurred during the TestDriver workflow.
|
|
136
|
+
|
|
137
|
+
**Repository**: ${{ github.repository }}
|
|
138
|
+
**Branch**: ${{ github.ref }}
|
|
139
|
+
**Commit**: ${{ github.sha }}
|
|
140
|
+
**Workflow Run**: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
|
141
|
+
|
|
142
|
+
**Failure Details**:
|
|
143
|
+
$(cat failure-details.txt)
|
|
144
|
+
|
|
145
|
+
Please investigate the issue and resolve it promptly.
|
|
146
|
+
issuetype: Bug
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Workflow steps explained
|
|
152
|
+
|
|
153
|
+
### 1. **Run Tests with TestDriver CLI**
|
|
154
|
+
|
|
155
|
+
This step runs the TestDriver CLI with the `testdriver/test.yaml` file.
|
|
156
|
+
|
|
157
|
+
```yaml testdriver/test.yaml
|
|
158
|
+
- name: Run TestDriver
|
|
159
|
+
id: testdriver
|
|
160
|
+
run: npx testdriverai@latest run testdriver/test.yaml
|
|
161
|
+
env:
|
|
162
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
### 2. **Check for test failures**
|
|
168
|
+
|
|
169
|
+
This step checks the exit code and success status from the TestDriver CLI run. If the tests failed, it sets an environment variable (`failure=true`) to trigger the Jira ticket creation step and prepares the output file for the Jira ticket.
|
|
170
|
+
|
|
171
|
+
```yaml testdriver/test.yaml
|
|
172
|
+
- name: Check for Test Failures
|
|
173
|
+
id: check-failures
|
|
174
|
+
run: |
|
|
175
|
+
if ("${{ steps.testdriver.outputs.success }}" -eq "false") {
|
|
176
|
+
echo "TestDriver tests failed."
|
|
177
|
+
echo "failure=true" >> $env:GITHUB_ENV
|
|
178
|
+
|
|
179
|
+
# Copy the output file for Jira ticket
|
|
180
|
+
Copy-Item testdriver-output.txt failure-details.txt
|
|
181
|
+
} else {
|
|
182
|
+
echo "All tests passed."
|
|
183
|
+
echo "failure=false" >> $env:GITHUB_ENV
|
|
184
|
+
}
|
|
185
|
+
shell: powershell
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
### 3. **Create a Jira ticket**
|
|
191
|
+
|
|
192
|
+
If any tests failed, the `create-jira-ticket` job uses the `atlassian/gajira-create` action to create a new Jira ticket. The ticket includes:
|
|
193
|
+
|
|
194
|
+
- **Summary**: A brief description of the failure with repository information.
|
|
195
|
+
- **Description**: Detailed information about the failure, including repository details, workflow run links, and the captured test output.
|
|
196
|
+
|
|
197
|
+
```yaml testdriver/test.yaml
|
|
198
|
+
- name: Create Jira Ticket
|
|
199
|
+
uses: atlassian/gajira-create@v3
|
|
200
|
+
with:
|
|
201
|
+
url: ${{ secrets.JIRA_BASE_URL }}
|
|
202
|
+
user: ${{ secrets.JIRA_USERNAME }}
|
|
203
|
+
api-token: ${{ secrets.JIRA_API_TOKEN }}
|
|
204
|
+
project: TEST # Replace with your Jira project key
|
|
205
|
+
summary: "TestDriver Test Failure in ${{ github.repository }}"
|
|
206
|
+
description: |
|
|
207
|
+
A test failure occurred during the TestDriver workflow.
|
|
208
|
+
|
|
209
|
+
**Repository**: ${{ github.repository }}
|
|
210
|
+
**Branch**: ${{ github.ref }}
|
|
211
|
+
**Commit**: ${{ github.sha }}
|
|
212
|
+
**Workflow Run**: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
|
213
|
+
|
|
214
|
+
**Failure Details**:
|
|
215
|
+
$(cat failure-details.txt)
|
|
216
|
+
|
|
217
|
+
Please investigate the issue and resolve it promptly.
|
|
218
|
+
issuetype: Bug
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Secrets configuration
|
|
224
|
+
|
|
225
|
+
Add the following secrets to your GitHub repository:
|
|
226
|
+
|
|
227
|
+
1. **`TD_API_KEY`**: Your TestDriver API key.
|
|
228
|
+
2. **`JIRA_API_TOKEN`**: Your Jira API token.
|
|
229
|
+
3. **`JIRA_BASE_URL`**: Your Jira instance URL (for example, `https://yourcompany.atlassian.net`).
|
|
230
|
+
4. **`JIRA_USERNAME`**: Your Jira account email.
|
|
231
|
+
|
|
232
|
+
---
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "TestDriver CLI Flags"
|
|
3
|
+
sidebarTitle: "Flags"
|
|
4
|
+
description: "Learn about the TestDriver CLI, its commands, and how to use it effectively."
|
|
5
|
+
icon: "flag"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
The `testdriverai` CLI is the primary interface for running, managing, and debugging TestDriver scripts. It provides commands to execute tests, validate configurations, and interact with the TestDriver framework.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npx testdriverai@latest <command> [options]
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Available commands
|
|
17
|
+
|
|
18
|
+
| Command | Description |
|
|
19
|
+
| :----------------------: | :----------------------------------------------------------- |
|
|
20
|
+
| [`run`](/commands/run) | Executes a TestDriver test. |
|
|
21
|
+
| [`edit`](/commands/edit) | Launch interactive mode. |
|
|
22
|
+
| [`help`](/commands/help) | Displays help information for the CLI or a specific command. |
|
|
23
|
+
|
|
24
|
+
## Available Flags
|
|
25
|
+
|
|
26
|
+
| Flag | Description |
|
|
27
|
+
| :------------------ | :----------------------------------------------------------------------------------------- |
|
|
28
|
+
| `--heal` | Launch exploratory mode and attemp to recover if an error or failing state is encountered. |
|
|
29
|
+
| `--write` | Ovewrite test file with new commands resulting from agentic testing |
|
|
30
|
+
| `--new` | Create a new sandbox environment for the test run. |
|
|
31
|
+
| `--summary=<value>` | Output file where AI summary should be saved. |
|
|
32
|
+
| `--junit=<value>` | Output file where junit report should be saved. |
|
|
33
|
+
|
|
34
|
+
## Example usage
|
|
35
|
+
|
|
36
|
+
### Running a test script
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npx testdriverai@latest run path/to/testdriver.yaml
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
This command runs the specified TestDriver script, executing all steps defined in the file.
|
|
43
|
+
|
|
44
|
+
### Initializing a new project
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npx testdriverai@latest init
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
This command sets up a new TestDriver project in the current directory, creating the necessary folder structure and configuration files.
|
|
51
|
+
|
|
52
|
+
### Getting help
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx testdriverai@latest help
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
This command displays general help information. To get help for a specific command, use:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npx testdriverai@latest help <command>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Protips
|
|
65
|
+
|
|
66
|
+
- Combine [`run`](/commands/run) and `--headless` with CI/CD pipelines to automate test execution.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "assert"
|
|
3
|
+
sidebarTitle: "assert"
|
|
4
|
+
description: "Validate conditions during a test using the assert command."
|
|
5
|
+
icon: "check"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
import Replay from "/snippets/tests/assert-replay.mdx";
|
|
10
|
+
import Example from "/snippets/tests/assert-yaml.mdx";
|
|
11
|
+
|
|
12
|
+
<Replay />
|
|
13
|
+
<Example />
|
|
14
|
+
|
|
15
|
+
## Description
|
|
16
|
+
|
|
17
|
+
The `assert` command validates that a specific condition is true. It ensures that a task completed successfully by checking the screen for the expected outcome. If the condition isn't met, the test will fail.
|
|
18
|
+
|
|
19
|
+
## Arguments
|
|
20
|
+
|
|
21
|
+
| Argument | Type | Description |
|
|
22
|
+
| -------- | --------- | ------------------------------------------------------------------------------------------------------------------ |
|
|
23
|
+
| `expect` | `string` | The condition to check. This should describe what you expect to see on the screen. |
|
|
24
|
+
| `async` | `boolean` | (Optional) If set to `true`, the test will continue without waiting for the assertion to pass. Default is `false`. |
|
|
25
|
+
| `invert` | `boolean` | (Optional) If set to `true`, will fail if the assertion passes. |
|
|
26
|
+
|
|
27
|
+
## Example usage
|
|
28
|
+
|
|
29
|
+
```yaml
|
|
30
|
+
command: assert
|
|
31
|
+
expect: the video is playing
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Example with `async`
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
command: assert
|
|
38
|
+
expect: There is no error message
|
|
39
|
+
async: true
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Notes
|
|
43
|
+
|
|
44
|
+
- Use `async: true` to speed up tests by allowing non-blocking assertions. However, the test will still fail if the condition isn't met.
|
|
45
|
+
- Ensure the `expect` string clearly describes the condition to avoid ambiguity.
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "exec"
|
|
3
|
+
sidebarTitle: "exec"
|
|
4
|
+
description: "Execute custom shell or PowerShell scripts within your tests."
|
|
5
|
+
icon: "code"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
import Replay from "/snippets/tests/exec-shell-replay.mdx";
|
|
10
|
+
import Example from "/snippets/tests/exec-shell-yaml.mdx";
|
|
11
|
+
|
|
12
|
+
<Replay />
|
|
13
|
+
<Example />
|
|
14
|
+
|
|
15
|
+
## Description
|
|
16
|
+
|
|
17
|
+
The `exec` command allows you to execute shell commands (Linux) or PowerShell commands (Windows) within your TestDriver tests. This is useful for launching applications, file operations, or performing system commands during a test.
|
|
18
|
+
|
|
19
|
+
## Arguments
|
|
20
|
+
|
|
21
|
+
| Argument | Type | Description |
|
|
22
|
+
| :------: | :------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
23
|
+
| `lang` | `string` | The language of the script to execute. Supported values are `sh` (Shell/Linux) or `pwsh` (PowerShell/Windows). |
|
|
24
|
+
| `output` | `string` | The variable name to store the result of the script. This variable can be accessed as `${OUTPUT.<var>}` in future steps. |
|
|
25
|
+
| `code` | `string` | The script to execute. |
|
|
26
|
+
| `silent` | `string` | Defaults to `false`. The command will print the output of the script. This is useful for suppressing unnecessary or private output in the test logs and it's useful for debugging. |
|
|
27
|
+
|
|
28
|
+
## Example usage
|
|
29
|
+
|
|
30
|
+
This example demonstrates how to use the `exec` command to launch a calculator application.
|
|
31
|
+
|
|
32
|
+
```yaml calculator.yaml
|
|
33
|
+
version: 6.0.0
|
|
34
|
+
steps:
|
|
35
|
+
- commands:
|
|
36
|
+
- command: exec
|
|
37
|
+
lang: pwsh
|
|
38
|
+
code: |
|
|
39
|
+
start /B calc.exe
|
|
40
|
+
timeout /t 5
|
|
41
|
+
- command: wait-for-text
|
|
42
|
+
text: "calculator"
|
|
43
|
+
timeout: 30000
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Additional details
|
|
47
|
+
|
|
48
|
+
- Supported `lang` values are `sh` or `pwsh`:
|
|
49
|
+
- `sh` code is executed in the shell on Linux sandboxes.
|
|
50
|
+
- `pwsh` code is executed in PowerShell on Windows sandboxes.
|
|
51
|
+
- **Note:** You can also use `pwsh` in [lifecycle](/guide/lifecycle) scripts to install npm packages if you need them.
|
|
52
|
+
- Otherwise, the `pwsh` code can be used within test steps to launch applications or perform simple commands (like writing text to a file on the machine to perform a simple file upload).
|
|
53
|
+
- The `output` argument captures stdout from your script.
|
|
54
|
+
|
|
55
|
+
## Protips
|
|
56
|
+
|
|
57
|
+
- The `result` variable is already available in your script, overwrite it to store the output as shown in the examples.
|
|
58
|
+
- Do any handling of arrays or nested objects within your `js` script:
|
|
59
|
+
- ✅ `result = users[1].profile.firstName`
|
|
60
|
+
- ✅ `result = data.length > 0 ? data[0].userEmail : 'no user found'` if no data is found the value of output will be `null`
|
|
61
|
+
- ✅ `result = someTestUserEmail`
|
|
62
|
+
- ✅ `result = someTextToAssert`
|
|
63
|
+
- ✅ `result = someDescriptionOfAnImageToScrollTo`
|
|
64
|
+
- Don't try to pass any non-string values to `output`:
|
|
65
|
+
- ❌ `result = [...users, ...values]`
|
|
66
|
+
- ❌ `result = {name: "Dale Earnhardt", starts: 676, wins: 76}`
|
|
67
|
+
- ❌ `result = [{user1: ...}, {user2: ...}]`
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Ways to use `exec`
|
|
72
|
+
|
|
73
|
+
Here is an example using both `pwsh` and `js` contexts within a `prerun.yaml` script which creates a temporary email account and automatically clicks links found in received emails.
|
|
74
|
+
|
|
75
|
+
```yaml ./lifecycle/prerun.yaml [expandable]
|
|
76
|
+
version: 6.0.0
|
|
77
|
+
steps:
|
|
78
|
+
- commands:
|
|
79
|
+
- command: exec
|
|
80
|
+
lang: pwsh
|
|
81
|
+
code: |
|
|
82
|
+
npm install @sendgrid/mail
|
|
83
|
+
- command: exec
|
|
84
|
+
lang: js
|
|
85
|
+
output: accountData
|
|
86
|
+
code: |
|
|
87
|
+
const Mailjs = require("@cemalgnlts/mailjs");
|
|
88
|
+
const mailjs = new Mailjs();
|
|
89
|
+
let account = await mailjs.createOneAccount()
|
|
90
|
+
console.log("Account created:", account);
|
|
91
|
+
result = JSON.stringify(account.data)
|
|
92
|
+
- command: exec
|
|
93
|
+
lang: js
|
|
94
|
+
output: emailAddress
|
|
95
|
+
code: |
|
|
96
|
+
const accountData = ${OUTPUT.accountData};
|
|
97
|
+
result = accountData.username
|
|
98
|
+
- prompt: Enter the generated email into the email field
|
|
99
|
+
commands:
|
|
100
|
+
- command: hover-text
|
|
101
|
+
text: standard_user
|
|
102
|
+
description: email input field label
|
|
103
|
+
action: click
|
|
104
|
+
- command: type
|
|
105
|
+
text: ${OUTPUT.emailAddress}
|
|
106
|
+
- prompt: Wait for an email, extract links, and open each link
|
|
107
|
+
commands:
|
|
108
|
+
- command: exec
|
|
109
|
+
lang: js
|
|
110
|
+
code: |
|
|
111
|
+
const Mailjs = require("@cemalgnlts/mailjs");
|
|
112
|
+
const { JSDOM } = require('jsdom'); // To parse HTML and extract links
|
|
113
|
+
|
|
114
|
+
const accountData = ${OUTPUT.accountData};
|
|
115
|
+
|
|
116
|
+
const getLatestEmailAndClickLinks = async () => {
|
|
117
|
+
try {
|
|
118
|
+
// Initialize the Mailjs client
|
|
119
|
+
const mailjs = new Mailjs();
|
|
120
|
+
|
|
121
|
+
// Login to your account
|
|
122
|
+
await mailjs.login(accountData.username, accountData.password);
|
|
123
|
+
|
|
124
|
+
// Fetch list of messages
|
|
125
|
+
const messages = await mailjs.getMessages();
|
|
126
|
+
|
|
127
|
+
if (messages.length === 0) {
|
|
128
|
+
console.log('No emails found.');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Assuming the latest email is the first one in the list
|
|
133
|
+
const latestMessage = messages[0];
|
|
134
|
+
|
|
135
|
+
// Fetch the full details of the latest email
|
|
136
|
+
const fullMessage = await mailjs.getMessage(latestMessage.id);
|
|
137
|
+
|
|
138
|
+
console.log('Latest Email Details:', fullMessage);
|
|
139
|
+
|
|
140
|
+
// Parse the HTML content to extract links
|
|
141
|
+
const dom = new JSDOM(fullMessage.html);
|
|
142
|
+
const links = Array.from(dom.window.document.querySelectorAll('a')).map(a => a.href);
|
|
143
|
+
|
|
144
|
+
console.log('Found Links:', links);
|
|
145
|
+
|
|
146
|
+
// Click (fetch) every link using native fetch
|
|
147
|
+
for (const link of links) {
|
|
148
|
+
try {
|
|
149
|
+
const response = await fetch(link);
|
|
150
|
+
console.log('Clicked ${link}: ${response.status}');
|
|
151
|
+
} catch (linkError) {
|
|
152
|
+
console.error('Error clicking ${link}:', linkError);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
} catch (error) {
|
|
157
|
+
console.error('Error fetching latest email or clicking links:', error);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
getLatestEmailAndClickLinks();
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Using `exec` pwsh commands in a test file
|
|
165
|
+
|
|
166
|
+
In a test file, you can use the `pwsh` context directly:
|
|
167
|
+
|
|
168
|
+
```yaml calculator.yaml highlight={5-8} [expandable]
|
|
169
|
+
version: 6.0.0
|
|
170
|
+
steps:
|
|
171
|
+
- prompt: launch a calculator
|
|
172
|
+
commands:
|
|
173
|
+
- command: exec
|
|
174
|
+
lang: pwsh
|
|
175
|
+
code: |
|
|
176
|
+
start /B calc.exe
|
|
177
|
+
timeout /t 5
|
|
178
|
+
- command: wait-for-text
|
|
179
|
+
text: "calculator"
|
|
180
|
+
timeout: 30000
|
|
181
|
+
- prompt: performing the operation 2 + 2 = on the calculator that is opened
|
|
182
|
+
commands:
|
|
183
|
+
- command: focus-application
|
|
184
|
+
name: galculator
|
|
185
|
+
- command: hover-image
|
|
186
|
+
description: button with number 2 on the calculator
|
|
187
|
+
action: click
|
|
188
|
+
- command: hover-image
|
|
189
|
+
description: plus button on the calculator
|
|
190
|
+
action: click
|
|
191
|
+
- command: hover-image
|
|
192
|
+
description: button with number 2 on the calculator
|
|
193
|
+
action: click
|
|
194
|
+
- command: hover-image
|
|
195
|
+
description: equals button on the calculator
|
|
196
|
+
action: click
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### One more option
|
|
200
|
+
|
|
201
|
+
You can also save reusable snippets (like launching the calculator) to be inserted into a script later with the [`run`](/commands/run) command. That version would look something like this:
|
|
202
|
+
|
|
203
|
+
```yaml snippets/launch-calculator.yaml [expandable]
|
|
204
|
+
version: 6.0.0
|
|
205
|
+
steps:
|
|
206
|
+
- prompt: launch a calculator
|
|
207
|
+
commands:
|
|
208
|
+
- command: exec
|
|
209
|
+
lang: pwsh
|
|
210
|
+
code: |
|
|
211
|
+
start /B calc.exe
|
|
212
|
+
timeout /t 5
|
|
213
|
+
- command: wait-for-text
|
|
214
|
+
text: "calculator"
|
|
215
|
+
timeout: 30000
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Then in the test:
|
|
219
|
+
|
|
220
|
+
```yaml calculator.yaml highlight={5-6} [expandable]
|
|
221
|
+
version: 6.0.0
|
|
222
|
+
steps:
|
|
223
|
+
- prompt: launch a calculator
|
|
224
|
+
commands:
|
|
225
|
+
- command: run
|
|
226
|
+
file: snippets/launch-calculator.yaml
|
|
227
|
+
- prompt: performing the operation 2 + 2 = on the calculator that is opened
|
|
228
|
+
commands:
|
|
229
|
+
- command: focus-application
|
|
230
|
+
name: galculator
|
|
231
|
+
- command: hover-image
|
|
232
|
+
description: button with number 2 on the calculator
|
|
233
|
+
action: click
|
|
234
|
+
- command: hover-image
|
|
235
|
+
description: plus button on the calculator
|
|
236
|
+
action: click
|
|
237
|
+
- command: hover-image
|
|
238
|
+
description: button with number 2 on the calculator
|
|
239
|
+
action: click
|
|
240
|
+
- command: hover-image
|
|
241
|
+
description: equals button on the calculator
|
|
242
|
+
action: click
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Don't try to run `js` within a test field
|
|
246
|
+
|
|
247
|
+
This example will fail at runtime, so don't try to execute `js` context directly in a test file. Remember - use this in `prerun` to setup your test!
|
|
248
|
+
|
|
249
|
+
```yaml badtestfile.yaml [expandable]
|
|
250
|
+
version: 6.0.0
|
|
251
|
+
commands:
|
|
252
|
+
- command: exec
|
|
253
|
+
lang: pwsh
|
|
254
|
+
code: |
|
|
255
|
+
npm install -g axios json2csv
|
|
256
|
+
- prompt: fetch user data from API
|
|
257
|
+
commands:
|
|
258
|
+
- command: exec
|
|
259
|
+
output: user
|
|
260
|
+
lang: js
|
|
261
|
+
code: |
|
|
262
|
+
const axios = require('axios');
|
|
263
|
+
const { Parser } = require('json2csv');
|
|
264
|
+
const fs = require('fs');
|
|
265
|
+
|
|
266
|
+
const response = await axios.get('https://jsonplaceholder.typicode.com/users');
|
|
267
|
+
const parser = new Parser();
|
|
268
|
+
const csv = parser.parse(response.data);
|
|
269
|
+
fs.writeFileSync('users.csv', csv);
|
|
270
|
+
const user = response.data[0].name;
|
|
271
|
+
result = user;
|
|
272
|
+
console.log('username', user);
|
|
273
|
+
...
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
This example will produce errors in the TestDriver output or CLI since the runner won't have access to the Node.js VM context.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "focus-application"
|
|
3
|
+
sidebarTitle: "focus-application"
|
|
4
|
+
description: "Bring a specific application window to the foreground."
|
|
5
|
+
icon: "window-restore"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Description
|
|
10
|
+
|
|
11
|
+
The `focus-application` command displays a specific application window to the foreground. This ensures that subsequent commands interact with the correct application during a test.
|
|
12
|
+
|
|
13
|
+
## Arguments
|
|
14
|
+
|
|
15
|
+
| Argument | Type | Description |
|
|
16
|
+
| -------- | -------- | --------------------------------------------------------------------------------------- |
|
|
17
|
+
| `name` | `string` | The name of the application to focus. This should match the application's display name. |
|
|
18
|
+
|
|
19
|
+
## Example usage
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
command: focus-application
|
|
23
|
+
name: Google Chrome
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Protips
|
|
27
|
+
|
|
28
|
+
- Ensure the application name matches the exact name displayed in your operating system's task manager.
|
|
29
|
+
- Use this command at the start of a test or before interacting with an application to avoid focus-related issues.
|
|
30
|
+
|
|
31
|
+
<Note>
|
|
32
|
+
If the specified application isn't running, the command will fail. Ensure the application is open before using this command.
|
|
33
|
+
For example, to launch chrome try using the exec command:
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
- command: exec
|
|
37
|
+
lang: pwsh
|
|
38
|
+
code: start chrome
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
</Note>
|
|
42
|
+
## Notes
|
|
43
|
+
|
|
44
|
+
- The `focus-application` command is useful for multi-application workflows where you need to switch between different apps during a test.
|