@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,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "wait-for-image"
|
|
3
|
+
sidebarTitle: "wait-for-image"
|
|
4
|
+
description: "Wait until an image matching the description is detected on the screen."
|
|
5
|
+
icon: "clock-three-thirty"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
import Replay from "/snippets/tests/wait-for-image-replay.mdx";
|
|
10
|
+
import Example from "/snippets/tests/wait-for-image-yaml.mdx";
|
|
11
|
+
|
|
12
|
+
<Replay />
|
|
13
|
+
<Example />
|
|
14
|
+
|
|
15
|
+
## Description
|
|
16
|
+
|
|
17
|
+
The `wait-for-image` command waits until the specified image is detected on the screen. This is useful for ensuring that visual elements are present before proceeding with the next steps in a test.
|
|
18
|
+
|
|
19
|
+
## Arguments
|
|
20
|
+
|
|
21
|
+
| Argument | Type | Description |
|
|
22
|
+
| :-----------: | :-------: | :---------------------------------------------------------------------------------------------------------------- |
|
|
23
|
+
| `description` | `string` | A description of the image. |
|
|
24
|
+
| `timeout` | `number` | (Optional) The duration in milliseconds to wait for the image to appear. Default is `10000` (10 seconds). |
|
|
25
|
+
| `invert` | `boolean` | (Optional) If set to `true`, the command will wait until the specified image is NOT detected. Default is `false`. |
|
|
26
|
+
|
|
27
|
+
## Example usage
|
|
28
|
+
|
|
29
|
+
```yaml
|
|
30
|
+
command: wait-for-image
|
|
31
|
+
description: trash icon
|
|
32
|
+
timeout: 5000
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Protips
|
|
36
|
+
|
|
37
|
+
- Use clear and concise descriptions for the image to improve detection accuracy.
|
|
38
|
+
- Adjust the `timeout` value based on the expected load time of the image to avoid unnecessary delays.
|
|
39
|
+
|
|
40
|
+
<Tip>
|
|
41
|
+
If you are unable to land on an accurate description or experiencing flaky
|
|
42
|
+
results, try to upload the image to [chatgpt](https://chatgpt.com) and ask it
|
|
43
|
+
to describe the image and use the generated `description` to get better
|
|
44
|
+
accuracy and determinism.
|
|
45
|
+
</Tip>
|
|
46
|
+
|
|
47
|
+
## Gotchas
|
|
48
|
+
|
|
49
|
+
- If the image doesn't appear within the specified `timeout`, the command will fail.
|
|
50
|
+
- Ensure the description accurately represents the image to avoid detection issues.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
The `wait-for-image` command is ideal for synchronizing tests with visual elements that may take time to load.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "wait-for-text"
|
|
3
|
+
sidebarTitle: "wait-for-text"
|
|
4
|
+
description: "Wait until the specified text is detected on the screen."
|
|
5
|
+
icon: "clock-nine"
|
|
6
|
+
mode: "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
import Replay from "/snippets/tests/wait-for-text-replay.mdx";
|
|
10
|
+
import Example from "/snippets/tests/wait-for-text-yaml.mdx";
|
|
11
|
+
|
|
12
|
+
<Replay />
|
|
13
|
+
<Example />
|
|
14
|
+
|
|
15
|
+
## Description
|
|
16
|
+
|
|
17
|
+
The `wait-for-text` command waits until the specified text is detected on the screen. This is useful for ensuring that textual elements are present before proceeding with the next steps in a test.
|
|
18
|
+
|
|
19
|
+
## Arguments
|
|
20
|
+
|
|
21
|
+
| Argument | Type | Description |
|
|
22
|
+
| :-------: | :-------: | :--------------------------------------------------------------------------------------------------------------- |
|
|
23
|
+
| `text` | `string` | The text to find on the screen. |
|
|
24
|
+
| `timeout` | `number` | (Optional) The duration in milliseconds to wait for the text to appear. Default is `5000` (5 seconds). |
|
|
25
|
+
| `method` | `enum` | (Optional) The matching algorithm to use. Possible values are `ai` and `turbo`. Default is `turbo` |
|
|
26
|
+
| `invert` | `boolean` | (Optional) If set to `true`, the command will wait until the specified text is NOT detected. Default is `false`. |
|
|
27
|
+
|
|
28
|
+
## Example usage
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
command: wait-for-text
|
|
32
|
+
text: Copyright 2024
|
|
33
|
+
timeout: 5000
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Protips
|
|
37
|
+
|
|
38
|
+
- Use unique and specific text to improve detection accuracy.
|
|
39
|
+
- Adjust the `timeout` value based on the expected load time of the text to avoid unnecessary delays.
|
|
40
|
+
|
|
41
|
+
## Gotchas
|
|
42
|
+
|
|
43
|
+
- If the text doesn't appear within the specified `timeout`, the command will fail.
|
|
44
|
+
- Ensure the text matches exactly, as variations in font size, style, or screen resolution may affect detection accuracy.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
The `wait-for-text` command is ideal for synchronizing tests with textual elements that may take time to load.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "wait"
|
|
3
|
+
sidebarTitle: "wait"
|
|
4
|
+
description: "Pause the execution of the script for a specified duration."
|
|
5
|
+
icon: "clock"
|
|
6
|
+
"mode": "wide"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
import Replay from "/snippets/tests/wait-replay.mdx";
|
|
10
|
+
import Example from "/snippets/tests/wait-yaml.mdx";
|
|
11
|
+
|
|
12
|
+
<Replay />
|
|
13
|
+
<Example />
|
|
14
|
+
|
|
15
|
+
## Description
|
|
16
|
+
|
|
17
|
+
The `wait` command pauses the execution of the script for a specified number of milliseconds before continuing. This is useful for adding delays between commands or waiting for certain conditions to stabilize.
|
|
18
|
+
|
|
19
|
+
## Arguments
|
|
20
|
+
|
|
21
|
+
| Argument | Type | Description |
|
|
22
|
+
| --------- | -------- | ------------------------------------- |
|
|
23
|
+
| `timeout` | `number` | The duration in milliseconds to wait. |
|
|
24
|
+
|
|
25
|
+
## Example usage
|
|
26
|
+
|
|
27
|
+
```yaml
|
|
28
|
+
command: wait
|
|
29
|
+
timeout: 5000
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Protips
|
|
33
|
+
|
|
34
|
+
- Use the `wait` command to handle timing issues, such as waiting for animations to complete or elements to load.
|
|
35
|
+
- Avoid using excessively long timeouts to keep tests efficient.
|
|
36
|
+
|
|
37
|
+
## Gotchas
|
|
38
|
+
|
|
39
|
+
- Overusing the `wait` command can slow down test execution. Use it only when necessary.
|
|
40
|
+
- Ensure the timeout value is appropriate for the scenario to avoid unnecessary delays.
|
|
41
|
+
|
|
42
|
+
## Notes
|
|
43
|
+
|
|
44
|
+
- The `wait` command is ideal for introducing controlled pauses in your test scripts.
|
|
45
|
+
- Whenever you are waiting for something to load, use the [wait-for-text](/commands/wait-for-text) or [wait-for-image](/commands/wait-for-image) commands instead to make the test more efficient.
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "JUnit XML Reports"
|
|
3
|
+
sidebarTitle: "JUnit"
|
|
4
|
+
description: "Generate JUnit XML test reports for seamless integration with CI/CD pipelines and test reporting tools."
|
|
5
|
+
icon: "file-xml"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
TestDriver supports generating **JUnit XML reports** that are compatible with most CI/CD systems, test reporting tools, and IDEs. This feature enables you to integrate TestDriver tests into your existing test infrastructure and get detailed test results in a standardized format.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
JUnit XML reports provide structured test results that include:
|
|
15
|
+
|
|
16
|
+
- **Test Suite Information**: Organized by folder structure from your `testdriver` directory
|
|
17
|
+
- **Test Case Details**: Individual test files with execution status
|
|
18
|
+
- **Step-by-Step Results**: Each step in your test with pass/fail status
|
|
19
|
+
- **System Output**: Complete logs from test execution (ANSI codes stripped)
|
|
20
|
+
- **Error Information**: Detailed failure messages and stack traces
|
|
21
|
+
- **Timing Data**: Execution duration for tests and individual steps
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Basic Usage
|
|
26
|
+
|
|
27
|
+
Enable JUnit reporting by adding the `--junit` flag to your TestDriver command:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npx testdriverai@latest run path/to/test.yaml --junit=test-results.xml
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
This will:
|
|
34
|
+
|
|
35
|
+
1. Execute your TestDriver test normally
|
|
36
|
+
2. Generate a JUnit XML report at the specified file path
|
|
37
|
+
3. Include all test execution details in the report
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Command Line Options
|
|
42
|
+
|
|
43
|
+
| Flag | Description | Example |
|
|
44
|
+
| ---------------- | ------------------------------------------- | ---------------------------------- |
|
|
45
|
+
| `--junit=<path>` | Generate JUnit XML report to specified file | `--junit=reports/test-results.xml` |
|
|
46
|
+
|
|
47
|
+
### Examples
|
|
48
|
+
|
|
49
|
+
**Basic usage:**
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npx testdriverai@latest run testdriver/login.yaml --junit=junit-report.xml
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Report Structure
|
|
58
|
+
|
|
59
|
+
### Test Suite Hierarchy
|
|
60
|
+
|
|
61
|
+
JUnit reports organize your tests using the following structure:
|
|
62
|
+
|
|
63
|
+
- **Test Suite**: Named after the folder path from your `testdriver` directory
|
|
64
|
+
- **Test Case**: Individual test files (`.yaml` files)
|
|
65
|
+
- **Properties**: Each step in your test with its status and prompt
|
|
66
|
+
|
|
67
|
+
### Example Report Structure
|
|
68
|
+
|
|
69
|
+
For a test file at `testdriver/features/login.yaml`:
|
|
70
|
+
|
|
71
|
+
```xml
|
|
72
|
+
<testsuites tests="1" failures="0" errors="0" skipped="0">
|
|
73
|
+
<testsuite name="testdriver/features" tests="1" failures="0" errors="0" skipped="0">
|
|
74
|
+
<testcase classname="testdriver/features" name="login.yaml" time="12.543">
|
|
75
|
+
<properties>
|
|
76
|
+
<property name="step1[passed]" value="Navigate to login page"/>
|
|
77
|
+
<property name="step2[passed]" value="Enter username and password"/>
|
|
78
|
+
<property name="step3[passed]" value="Click login button"/>
|
|
79
|
+
<property name="step4[passed]" value="Verify dashboard appears"/>
|
|
80
|
+
</properties>
|
|
81
|
+
<system-out><![CDATA[
|
|
82
|
+
Complete test execution logs...
|
|
83
|
+
]]></system-out>
|
|
84
|
+
</testcase>
|
|
85
|
+
</testsuite>
|
|
86
|
+
</testsuites>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## CI/CD Integration
|
|
92
|
+
|
|
93
|
+
### GitHub Actions
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
name: TestDriver Tests
|
|
97
|
+
|
|
98
|
+
on: [push, pull_request]
|
|
99
|
+
|
|
100
|
+
jobs:
|
|
101
|
+
test:
|
|
102
|
+
runs-on: ubuntu-latest
|
|
103
|
+
steps:
|
|
104
|
+
- uses: actions/checkout@v4
|
|
105
|
+
|
|
106
|
+
- name: Run TestDriver Tests
|
|
107
|
+
run: npx testdriverai@latest run testdriver/test.yaml --junit=test-results.xml
|
|
108
|
+
env:
|
|
109
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
110
|
+
|
|
111
|
+
- name: Publish Test Results
|
|
112
|
+
uses: dorny/test-reporter@v1
|
|
113
|
+
if: always()
|
|
114
|
+
with:
|
|
115
|
+
name: TestDriver Tests
|
|
116
|
+
path: test-results.xml
|
|
117
|
+
reporter: java-junit
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Jenkins
|
|
121
|
+
|
|
122
|
+
```groovy
|
|
123
|
+
pipeline {
|
|
124
|
+
agent any
|
|
125
|
+
|
|
126
|
+
stages {
|
|
127
|
+
stage('Test') {
|
|
128
|
+
steps {
|
|
129
|
+
script {
|
|
130
|
+
sh 'npx testdriverai@latest run testdriver/test.yaml --junit=junit-results.xml'
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
post {
|
|
134
|
+
always {
|
|
135
|
+
junit 'junit-results.xml'
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### GitLab CI
|
|
144
|
+
|
|
145
|
+
```yaml
|
|
146
|
+
test:
|
|
147
|
+
script:
|
|
148
|
+
- npx testdriverai@latest run testdriver/test.yaml --junit=test-results.xml
|
|
149
|
+
artifacts:
|
|
150
|
+
when: always
|
|
151
|
+
reports:
|
|
152
|
+
junit: test-results.xml
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Test Result Details
|
|
158
|
+
|
|
159
|
+
### Successful Tests
|
|
160
|
+
|
|
161
|
+
For passing tests, the report includes:
|
|
162
|
+
|
|
163
|
+
- Test execution time
|
|
164
|
+
- All step prompts with `[passed]` status
|
|
165
|
+
- Complete system output logs
|
|
166
|
+
- Command execution details
|
|
167
|
+
|
|
168
|
+
### Failed Tests
|
|
169
|
+
|
|
170
|
+
For failing tests, the report includes:
|
|
171
|
+
|
|
172
|
+
- Detailed failure messages
|
|
173
|
+
- Failed assertion information
|
|
174
|
+
- Failed step prompts with `[failed]` status
|
|
175
|
+
- Error logs in `<system-err>` section
|
|
176
|
+
- Exit code information
|
|
177
|
+
|
|
178
|
+
### Example Failure Report
|
|
179
|
+
|
|
180
|
+
```xml
|
|
181
|
+
<testcase classname="testdriver/features" name="login.yaml" time="8.234">
|
|
182
|
+
<failure message="Failed assertions: user should see welcome message"/>
|
|
183
|
+
<properties>
|
|
184
|
+
<property name="step1[passed]" value="Navigate to login page"/>
|
|
185
|
+
<property name="step2[failed]" value="Verify welcome message appears"/>
|
|
186
|
+
</properties>
|
|
187
|
+
<system-err><![CDATA[
|
|
188
|
+
Assertion failed: Expected welcome message not found
|
|
189
|
+
]]></system-err>
|
|
190
|
+
</testcase>
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Integration with Test Viewers
|
|
196
|
+
|
|
197
|
+
### JUnit Viewer
|
|
198
|
+
|
|
199
|
+
Generate HTML reports from your XML:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Install junit-viewer
|
|
203
|
+
npm install -g junit-viewer
|
|
204
|
+
|
|
205
|
+
# Generate HTML report
|
|
206
|
+
junit-viewer --results=test-results.xml --save=report.html
|
|
207
|
+
|
|
208
|
+
# Serve the report
|
|
209
|
+
npx http-server . -p 8080 -o report.html
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### IDE Integration
|
|
213
|
+
|
|
214
|
+
Most IDEs support JUnit XML reports:
|
|
215
|
+
|
|
216
|
+
- **VS Code**: Use test result extensions
|
|
217
|
+
- **IntelliJ IDEA**: Import test results directly
|
|
218
|
+
- **Eclipse**: Built-in JUnit viewer support
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Playwright Export"
|
|
3
|
+
sidebarTitle: "Playwright"
|
|
4
|
+
description: "A comprehensive guide to integrating TestDriver with Playwright for automated test generation."
|
|
5
|
+
icon: "masks-theater"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
This guide explains how to use **TestDriver CLI** to generate Playwright test scripts and integrate them into your repository using a GitHub Actions workflow. The workflow automates the process of generating Playwright tests using TestDriver's execution capabilities and can create pull requests with the generated tests.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Workflow overview
|
|
13
|
+
|
|
14
|
+
1. **Run TestDriver CLI**: Execute a TestDriver test file.
|
|
15
|
+
2. **Lifecycle Prerun**: Automatically install Playwright and generate test scripts via `lifecycle/prerun.yaml`.
|
|
16
|
+
3. **Execute Test**: Run the main test logic to verify or use the generated Playwright tests.
|
|
17
|
+
4. **Create Pull Request**: Optional additional steps can commit changes and create a pull request for review.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Prerequisites
|
|
22
|
+
|
|
23
|
+
1. **GitHub Repository**: Ensure your project is hosted on GitHub.
|
|
24
|
+
2. **TestDriver API Key**: Store your API key as a GitHub secret (for example, `TD_API_KEY`).
|
|
25
|
+
3. **Lifecycle Files**: Create `lifecycle/prerun.yaml` for Playwright installation and generation.
|
|
26
|
+
4. **TestDriver Test File**: Create a test file (`testdriver/test.yaml`) for your main test logic.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## GitHub Actions workflow
|
|
31
|
+
|
|
32
|
+
Here's the GitHub Actions workflow to automate the process:
|
|
33
|
+
|
|
34
|
+
### Workflow file: `.github/workflows/playwright.yaml`
|
|
35
|
+
|
|
36
|
+
```yaml [expandable]
|
|
37
|
+
name: TestDriver / Playwright
|
|
38
|
+
|
|
39
|
+
on:
|
|
40
|
+
push:
|
|
41
|
+
branches: ["main"]
|
|
42
|
+
pull_request:
|
|
43
|
+
workflow_dispatch:
|
|
44
|
+
|
|
45
|
+
permissions:
|
|
46
|
+
actions: write
|
|
47
|
+
contents: write
|
|
48
|
+
statuses: write
|
|
49
|
+
pull-requests: write
|
|
50
|
+
|
|
51
|
+
jobs:
|
|
52
|
+
test:
|
|
53
|
+
steps:
|
|
54
|
+
- name: Check out repository
|
|
55
|
+
uses: actions/checkout@v4
|
|
56
|
+
with:
|
|
57
|
+
ref: ${{ github.event.ref }}
|
|
58
|
+
|
|
59
|
+
- name: Run TestDriver
|
|
60
|
+
run: npx testdriverai@latest run testdriver/test.yaml
|
|
61
|
+
env:
|
|
62
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
63
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
64
|
+
FORCE_COLOR: "3"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Workflow steps explained
|
|
70
|
+
|
|
71
|
+
### 1. **Check out repository**
|
|
72
|
+
|
|
73
|
+
The workflow checks out the repository to ensure the latest code is available for the test generation process.
|
|
74
|
+
|
|
75
|
+
```yaml
|
|
76
|
+
- name: Check out repository
|
|
77
|
+
uses: actions/checkout@v4
|
|
78
|
+
with:
|
|
79
|
+
ref: ${{ github.event.ref }}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
### 2. **Run TestDriver**
|
|
85
|
+
|
|
86
|
+
TestDriver CLI executes the test file in headless mode. The test file should contain commands to install Playwright and generate the test scripts.
|
|
87
|
+
|
|
88
|
+
```yaml
|
|
89
|
+
- name: Run TestDriver
|
|
90
|
+
run: npx testdriverai@latest run testdriver/test.yaml
|
|
91
|
+
env:
|
|
92
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
93
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
94
|
+
FORCE_COLOR: "3"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
### 3. **Lifecycle configuration**
|
|
100
|
+
|
|
101
|
+
Use `lifecycle/prerun.yaml` to install and launch Playwright before your test runs. This keeps the setup separate from your actual test logic:
|
|
102
|
+
|
|
103
|
+
```yaml
|
|
104
|
+
# lifecycle/prerun.yaml
|
|
105
|
+
version: 5.1.1
|
|
106
|
+
steps:
|
|
107
|
+
- prompt: install and launch playwright
|
|
108
|
+
commands:
|
|
109
|
+
- command: exec
|
|
110
|
+
lang: pwsh
|
|
111
|
+
code: |
|
|
112
|
+
npm install playwright -g
|
|
113
|
+
playwright install --with-deps chromium
|
|
114
|
+
npx playwright codegen --target playwright-test -o testdriver/pw-test.spec.js https://airbnb.com
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Your main `testdriver/test.yaml` file can then focus on the actual test logic:
|
|
118
|
+
|
|
119
|
+
```yaml
|
|
120
|
+
# testdriver/test.yaml
|
|
121
|
+
version: 5.1.1
|
|
122
|
+
steps:
|
|
123
|
+
- prompt: verify playwright test was generated
|
|
124
|
+
commands:
|
|
125
|
+
- command: exec
|
|
126
|
+
lang: pwsh
|
|
127
|
+
code: |
|
|
128
|
+
if (Test-Path "testdriver/pw-test.spec.js") {
|
|
129
|
+
Write-Host "Playwright test generated successfully"
|
|
130
|
+
} else {
|
|
131
|
+
throw "Playwright test generation failed"
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
### 4. **Commit and create pull request**
|
|
138
|
+
|
|
139
|
+
After TestDriver generates the Playwright test files, you can use additional GitHub Actions steps to commit the changes and create a pull request:
|
|
140
|
+
|
|
141
|
+
```yaml
|
|
142
|
+
- name: Commit changes
|
|
143
|
+
run: |
|
|
144
|
+
git config --local user.email "action@github.com"
|
|
145
|
+
git config --local user.name "GitHub Action"
|
|
146
|
+
git add testdriver/pw-test.spec.js
|
|
147
|
+
git commit -m "Generate Playwright test" || exit 0
|
|
148
|
+
|
|
149
|
+
- name: Create Pull Request
|
|
150
|
+
uses: peter-evans/create-pull-request@v5
|
|
151
|
+
with:
|
|
152
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
153
|
+
commit-message: "Generate Playwright test"
|
|
154
|
+
title: "TestDriver / Generate Playwright Test"
|
|
155
|
+
branch: generate-playwright
|
|
156
|
+
base: main
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Running the workflow
|
|
162
|
+
|
|
163
|
+
<Steps>
|
|
164
|
+
<Step title="Trigger the Workflow">
|
|
165
|
+
- Push changes to the `main` branch.
|
|
166
|
+
- Open a pull request.
|
|
167
|
+
- Manually trigger the workflow using the **workflow_dispatch** event.
|
|
168
|
+
</Step>
|
|
169
|
+
<Step title="Review the Pull Request">
|
|
170
|
+
- Navigate to the **Pull Requests** tab in your GitHub repository.
|
|
171
|
+
- Review the generated Playwright test script (`pw-test.spec.js`).
|
|
172
|
+
</Step>
|
|
173
|
+
|
|
174
|
+
<Step title="Merge the Pull Request">
|
|
175
|
+
- Once reviewed, merge the pull request to include the generated test in your repository.
|
|
176
|
+
</Step>
|
|
177
|
+
</Steps>
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Example output
|
|
181
|
+
|
|
182
|
+
- **Generated Test File**: `testdriver/pw-test.spec.js`
|
|
183
|
+
- **Pull Request**: A new pull request titled `TestDriver / Generate Playwright Test` will be created.
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Best practices
|
|
188
|
+
|
|
189
|
+
1. **Secure API Key**: Store the TestDriver API key as a GitHub secret to avoid exposing sensitive information.
|
|
190
|
+
2. **Review Generated Tests**: Always review the generated Playwright test scripts to ensure they meet your requirements.
|
|
191
|
+
3. **Use Lifecycle Files**: Use `lifecycle/prerun.yaml` for Playwright installation and setup to separate concerns from your main test logic.
|
|
192
|
+
4. **Error Handling**: Include error handling in both lifecycle and test files to manage installation and generation failures gracefully.
|
|
193
|
+
5. **File Organization**: Keep generated Playwright tests in a dedicated directory for better organization.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
By following this guide, you can use TestDriver CLI to generate and manage Playwright tests in your GitHub repository through automated workflows.
|