testdriverai 7.0.0 → 7.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +2 -0
- package/.github/workflows/linux-tests.yml +28 -0
- package/README.md +126 -0
- package/agent/index.js +7 -9
- package/agent/interface.js +13 -2
- package/agent/lib/commands.js +795 -136
- package/agent/lib/redraw.js +124 -39
- package/agent/lib/sandbox.js +40 -3
- package/agent/lib/sdk.js +21 -0
- package/agent/lib/valid-version.js +2 -2
- package/debugger/index.html +1 -1
- package/docs/docs.json +86 -71
- package/docs/guide/best-practices-polling.mdx +154 -0
- package/docs/v6/getting-started/self-hosting.mdx +3 -2
- package/docs/v7/_drafts/agents.mdx +852 -0
- package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
- package/docs/v7/_drafts/best-practices.mdx +486 -0
- package/docs/v7/_drafts/caching-ai.mdx +215 -0
- package/docs/v7/_drafts/caching-selectors.mdx +400 -0
- package/docs/v7/_drafts/caching.mdx +366 -0
- package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
- package/docs/v7/_drafts/core.mdx +459 -0
- package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
- package/docs/v7/_drafts/debugging.mdx +349 -0
- package/docs/v7/_drafts/error-handling.mdx +501 -0
- package/docs/v7/_drafts/faq.mdx +393 -0
- package/docs/v7/_drafts/hooks.mdx +360 -0
- package/docs/v7/_drafts/implementation-plan.mdx +994 -0
- package/docs/v7/_drafts/init-command.mdx +95 -0
- package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
- package/docs/v7/_drafts/performance.mdx +517 -0
- package/docs/v7/_drafts/presets.mdx +210 -0
- package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
- package/docs/v7/_drafts/provision.mdx +266 -0
- package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
- package/docs/v7/_drafts/troubleshooting.mdx +526 -0
- package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
- package/docs/v7/_drafts/vitest.mdx +535 -0
- package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
- package/docs/v7/api/client.mdx +1 -1
- package/docs/v7/api/dashcam.mdx +497 -0
- package/docs/v7/api/doubleClick.mdx +102 -0
- package/docs/v7/api/elements.mdx +143 -41
- package/docs/v7/api/find.mdx +258 -0
- package/docs/v7/api/mouseDown.mdx +161 -0
- package/docs/v7/api/mouseUp.mdx +164 -0
- package/docs/v7/api/rightClick.mdx +123 -0
- package/docs/v7/api/type.mdx +51 -7
- package/docs/v7/features/ai-native.mdx +427 -0
- package/docs/v7/features/easy-to-write.mdx +351 -0
- package/docs/v7/features/enterprise.mdx +540 -0
- package/docs/v7/features/fast.mdx +424 -0
- package/docs/v7/features/observable.mdx +623 -0
- package/docs/v7/features/powerful.mdx +531 -0
- package/docs/v7/features/scalable.mdx +417 -0
- package/docs/v7/features/stable.mdx +514 -0
- package/docs/v7/getting-started/configuration.mdx +380 -0
- package/docs/v7/getting-started/generating-tests.mdx +525 -0
- package/docs/v7/getting-started/installation.mdx +486 -0
- package/docs/v7/getting-started/quickstart.mdx +320 -141
- package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
- package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
- package/docs/v7/getting-started/writing-tests.mdx +535 -0
- package/docs/v7/overview/what-is-testdriver.mdx +398 -0
- package/docs/v7/platforms/linux.mdx +308 -0
- package/docs/v7/platforms/macos.mdx +433 -0
- package/docs/v7/platforms/windows.mdx +430 -0
- package/docs/v7/playwright.mdx +3 -3
- package/docs/v7/presets/chrome-extension.mdx +223 -0
- package/docs/v7/presets/chrome.mdx +303 -0
- package/docs/v7/presets/electron.mdx +453 -0
- package/docs/v7/presets/vscode.mdx +417 -0
- package/docs/v7/presets/webapp.mdx +396 -0
- package/examples/run-tests-with-recording.sh +2 -2
- package/interfaces/cli/commands/init.js +358 -0
- package/interfaces/vitest-plugin.mjs +393 -103
- package/lib/core/Dashcam.js +506 -0
- package/lib/core/index.d.ts +150 -0
- package/lib/core/index.js +12 -0
- package/lib/presets/index.mjs +331 -0
- package/lib/vitest/hooks.d.ts +119 -0
- package/lib/vitest/hooks.mjs +316 -0
- package/lib/vitest/setup.mjs +44 -0
- package/package.json +13 -3
- package/sdk.d.ts +350 -44
- package/sdk.js +818 -105
- package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
- package/test/manual/test-console-logs.test.mjs +42 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/testdriver/assert.test.mjs +41 -0
- package/test/testdriver/auto-cache-key-demo.test.mjs +56 -0
- package/test/testdriver/chrome-extension.test.mjs +89 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +6 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +6 -18
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +9 -21
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +14 -26
- package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +8 -20
- package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +5 -20
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +10 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +5 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +5 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +6 -20
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +6 -18
- package/test/testdriver/scroll-until-text.test.mjs +28 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +12 -21
- package/test/testdriver/setup/lifecycleHelpers.mjs +262 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/setup/testHelpers.mjs +25 -20
- package/test/testdriver/type.test.mjs +45 -0
- package/vitest.config.mjs +11 -56
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/acceptance-linux.yml +0 -75
- package/.github/workflows/acceptance-sdk-tests.yml +0 -133
- package/.github/workflows/acceptance-tests.yml +0 -130
- package/.github/workflows/lint.yml +0 -27
- package/.github/workflows/publish-canary.yml +0 -40
- package/.github/workflows/publish-latest.yml +0 -61
- package/.github/workflows/test-install.yml +0 -29
- package/.vscode/extensions.json +0 -3
- package/.vscode/launch.json +0 -22
- package/.vscode/mcp.json +0 -9
- package/.vscode/settings.json +0 -14
- package/CODEOWNERS +0 -3
- package/MIGRATION.md +0 -389
- package/SDK_README.md +0 -1122
- package/_testdriver/acceptance/assert.yaml +0 -7
- package/_testdriver/acceptance/dashcam.yaml +0 -9
- package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
- package/_testdriver/acceptance/embed.yaml +0 -9
- package/_testdriver/acceptance/exec-js.yaml +0 -29
- package/_testdriver/acceptance/exec-output.yaml +0 -43
- package/_testdriver/acceptance/exec-shell.yaml +0 -40
- package/_testdriver/acceptance/focus-window.yaml +0 -16
- package/_testdriver/acceptance/hover-image.yaml +0 -18
- package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
- package/_testdriver/acceptance/hover-text.yaml +0 -14
- package/_testdriver/acceptance/if-else.yaml +0 -31
- package/_testdriver/acceptance/match-image.yaml +0 -15
- package/_testdriver/acceptance/press-keys.yaml +0 -35
- package/_testdriver/acceptance/prompt.yaml +0 -11
- package/_testdriver/acceptance/remember.yaml +0 -27
- package/_testdriver/acceptance/screenshots/cart.png +0 -0
- package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
- package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
- package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
- package/_testdriver/acceptance/scroll.yaml +0 -33
- package/_testdriver/acceptance/snippets/login.yaml +0 -29
- package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
- package/_testdriver/acceptance/type.yaml +0 -29
- package/_testdriver/behavior/failure.yaml +0 -7
- package/_testdriver/behavior/hover-text.yaml +0 -13
- package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
- package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
- package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
- package/_testdriver/behavior/secrets.yaml +0 -7
- package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
- package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
- package/_testdriver/edge-cases/js-exception.yaml +0 -8
- package/_testdriver/edge-cases/js-promise.yaml +0 -19
- package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
- package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
- package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
- package/_testdriver/edge-cases/success-test.yaml +0 -9
- package/_testdriver/examples/android/example.yaml +0 -12
- package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
- package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
- package/_testdriver/examples/android/readme.md +0 -7
- package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
- package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
- package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
- package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
- package/_testdriver/lifecycle/postrun.yaml +0 -8
- package/_testdriver/lifecycle/prerun.yaml +0 -15
- package/_testdriver/lifecycle/provision.yaml +0 -25
- package/debug-screenshot-1763401388589.png +0 -0
- package/mcp-server/AI_GUIDELINES.md +0 -57
- package/scripts/view-test-results.mjs +0 -96
- package/styles/.vale-config/2-MDX.ini +0 -5
- package/styles/Microsoft/AMPM.yml +0 -9
- package/styles/Microsoft/Accessibility.yml +0 -30
- package/styles/Microsoft/Acronyms.yml +0 -64
- package/styles/Microsoft/Adverbs.yml +0 -272
- package/styles/Microsoft/Auto.yml +0 -11
- package/styles/Microsoft/Avoid.yml +0 -14
- package/styles/Microsoft/Contractions.yml +0 -50
- package/styles/Microsoft/Dashes.yml +0 -13
- package/styles/Microsoft/DateFormat.yml +0 -8
- package/styles/Microsoft/DateNumbers.yml +0 -40
- package/styles/Microsoft/DateOrder.yml +0 -8
- package/styles/Microsoft/Ellipses.yml +0 -9
- package/styles/Microsoft/FirstPerson.yml +0 -16
- package/styles/Microsoft/Foreign.yml +0 -13
- package/styles/Microsoft/Gender.yml +0 -8
- package/styles/Microsoft/GenderBias.yml +0 -42
- package/styles/Microsoft/GeneralURL.yml +0 -11
- package/styles/Microsoft/HeadingAcronyms.yml +0 -7
- package/styles/Microsoft/HeadingColons.yml +0 -8
- package/styles/Microsoft/HeadingPunctuation.yml +0 -13
- package/styles/Microsoft/Headings.yml +0 -28
- package/styles/Microsoft/Hyphens.yml +0 -14
- package/styles/Microsoft/Negative.yml +0 -13
- package/styles/Microsoft/Ordinal.yml +0 -13
- package/styles/Microsoft/OxfordComma.yml +0 -8
- package/styles/Microsoft/Passive.yml +0 -183
- package/styles/Microsoft/Percentages.yml +0 -7
- package/styles/Microsoft/Plurals.yml +0 -7
- package/styles/Microsoft/Quotes.yml +0 -7
- package/styles/Microsoft/RangeTime.yml +0 -13
- package/styles/Microsoft/Semicolon.yml +0 -8
- package/styles/Microsoft/SentenceLength.yml +0 -6
- package/styles/Microsoft/Spacing.yml +0 -8
- package/styles/Microsoft/Suspended.yml +0 -7
- package/styles/Microsoft/Terms.yml +0 -42
- package/styles/Microsoft/URLFormat.yml +0 -9
- package/styles/Microsoft/Units.yml +0 -16
- package/styles/Microsoft/Vocab.yml +0 -25
- package/styles/Microsoft/We.yml +0 -11
- package/styles/Microsoft/Wordiness.yml +0 -127
- package/styles/Microsoft/meta.json +0 -4
- package/styles/alex/Ablist.yml +0 -274
- package/styles/alex/Condescending.yml +0 -16
- package/styles/alex/Gendered.yml +0 -110
- package/styles/alex/LGBTQ.yml +0 -55
- package/styles/alex/OCD.yml +0 -10
- package/styles/alex/Press.yml +0 -12
- package/styles/alex/ProfanityLikely.yml +0 -1289
- package/styles/alex/ProfanityMaybe.yml +0 -282
- package/styles/alex/ProfanityUnlikely.yml +0 -251
- package/styles/alex/README.md +0 -27
- package/styles/alex/Race.yml +0 -85
- package/styles/alex/Suicide.yml +0 -26
- package/styles/alex/meta.json +0 -4
- package/styles/config/vocabularies/Docs/accept.txt +0 -47
- package/styles/config/vocabularies/Docs/reject.txt +0 -4
- package/styles/proselint/Airlinese.yml +0 -8
- package/styles/proselint/AnimalLabels.yml +0 -48
- package/styles/proselint/Annotations.yml +0 -9
- package/styles/proselint/Apologizing.yml +0 -8
- package/styles/proselint/Archaisms.yml +0 -52
- package/styles/proselint/But.yml +0 -8
- package/styles/proselint/Cliches.yml +0 -782
- package/styles/proselint/CorporateSpeak.yml +0 -30
- package/styles/proselint/Currency.yml +0 -5
- package/styles/proselint/Cursing.yml +0 -15
- package/styles/proselint/DateCase.yml +0 -7
- package/styles/proselint/DateMidnight.yml +0 -7
- package/styles/proselint/DateRedundancy.yml +0 -10
- package/styles/proselint/DateSpacing.yml +0 -7
- package/styles/proselint/DenizenLabels.yml +0 -52
- package/styles/proselint/Diacritical.yml +0 -95
- package/styles/proselint/GenderBias.yml +0 -45
- package/styles/proselint/GroupTerms.yml +0 -39
- package/styles/proselint/Hedging.yml +0 -8
- package/styles/proselint/Hyperbole.yml +0 -6
- package/styles/proselint/Jargon.yml +0 -11
- package/styles/proselint/LGBTOffensive.yml +0 -13
- package/styles/proselint/LGBTTerms.yml +0 -15
- package/styles/proselint/Malapropisms.yml +0 -8
- package/styles/proselint/Needless.yml +0 -358
- package/styles/proselint/Nonwords.yml +0 -38
- package/styles/proselint/Oxymorons.yml +0 -22
- package/styles/proselint/P-Value.yml +0 -6
- package/styles/proselint/RASSyndrome.yml +0 -30
- package/styles/proselint/README.md +0 -12
- package/styles/proselint/Skunked.yml +0 -13
- package/styles/proselint/Spelling.yml +0 -17
- package/styles/proselint/Typography.yml +0 -11
- package/styles/proselint/Uncomparables.yml +0 -50
- package/styles/proselint/Very.yml +0 -6
- package/styles/proselint/meta.json +0 -15
- package/styles/write-good/Cliches.yml +0 -702
- package/styles/write-good/E-Prime.yml +0 -32
- package/styles/write-good/Illusions.yml +0 -11
- package/styles/write-good/Passive.yml +0 -183
- package/styles/write-good/README.md +0 -27
- package/styles/write-good/So.yml +0 -5
- package/styles/write-good/ThereIs.yml +0 -6
- package/styles/write-good/TooWordy.yml +0 -221
- package/styles/write-good/Weasel.yml +0 -29
- package/styles/write-good/meta.json +0 -4
- package/test/mcp-example-test.yaml +0 -27
- package/test/test_parser.js +0 -47
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
- package/testdriver/acceptance-sdk/README.md +0 -128
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
- package/testdriver/acceptance-sdk/assert.test.mjs +0 -44
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +0 -42
- package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
- package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
- package/testdriver/acceptance-sdk/type.test.mjs +0 -84
- package/vale.ini +0 -18
- package/vitest.config.example.js +0 -19
- package/vitest.config.mjs.bak +0 -44
- /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
- /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
- /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
- /package/{PLUGIN_MIGRATION.md → docs/v7/_drafts/plugin-migration.mdx} +0 -0
- /package/{PROMPT_CACHE.md → docs/v7/_drafts/prompt-cache.mdx} +0 -0
- /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
- /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
- /package/{SDK_LOGGING.md → docs/v7/_drafts/sdk-logging.mdx} +0 -0
- /package/{SDK_MIGRATION.md → docs/v7/_drafts/sdk-migration.mdx} +0 -0
- /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
- /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
- /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
- /package/{test-find-api.js → test/manual/test-find-api.js} +0 -0
- /package/{test-prompt-cache.js → test/manual/test-prompt-cache.js} +0 -0
- /package/{test-sandbox-render.js → test/manual/test-sandbox-render.js} +0 -0
- /package/{test-sdk-methods.js → test/manual/test-sdk-methods.js} +0 -0
- /package/{test-sdk-refactor.js → test/manual/test-sdk-refactor.js} +0 -0
- /package/{test-stack-trace.mjs → test/manual/test-stack-trace.mjs} +0 -0
- /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
- /package/{verify-types.js → test/manual/verify-types.js} +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
|
@@ -78,7 +78,7 @@ jobs:
|
|
|
78
78
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
79
79
|
AWS_REGION: us-east-2
|
|
80
80
|
AWS_LAUNCH_TEMPLATE_ID: lt-00d02f31cfc602f27
|
|
81
|
-
AMI_ID: ami-
|
|
81
|
+
AMI_ID: ami-086b5b4b86d78987c
|
|
82
82
|
RESOLUTION: 1920x1080
|
|
83
83
|
- name: Run TestDriver
|
|
84
84
|
run: node bin/testdriverai.js run testdriver/acceptance/${{ matrix.test }} --ip="${{ steps.aws-setup.outputs.public-ip }}" --junit=out.xml
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestDriver SDK - Console Log Test
|
|
3
|
+
* Tests that console.log statements are captured and sent to dashcam
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
|
+
|
|
9
|
+
describe("Console Log Test", () => {
|
|
10
|
+
it("should capture console logs and send them to dashcam", async (context) => {
|
|
11
|
+
console.log("🎬 Test starting - this should appear in dashcam");
|
|
12
|
+
|
|
13
|
+
const testdriver = TestDriver(context, { headless: true });
|
|
14
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
15
|
+
|
|
16
|
+
console.log("✅ Chrome launched successfully");
|
|
17
|
+
|
|
18
|
+
// Give Chrome a moment to fully render the UI
|
|
19
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
20
|
+
|
|
21
|
+
console.log("🔍 Looking for Sign In button");
|
|
22
|
+
|
|
23
|
+
// Find and click the sign in button
|
|
24
|
+
const signInButton = await testdriver.find(
|
|
25
|
+
"Sign In, black button below the password field",
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
console.log("👆 Clicking Sign In button");
|
|
29
|
+
await signInButton.click();
|
|
30
|
+
|
|
31
|
+
console.log("🧪 Asserting error message appears");
|
|
32
|
+
|
|
33
|
+
// Assert error shows
|
|
34
|
+
const result = await testdriver.assert(
|
|
35
|
+
"an error shows that fields are required",
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
console.log("✅ Test completed successfully - all logs should be in dashcam");
|
|
39
|
+
|
|
40
|
+
expect(result).toBeTruthy();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Test script for the init command
|
|
4
|
+
# Usage: ./test-init.sh
|
|
5
|
+
|
|
6
|
+
set -e
|
|
7
|
+
|
|
8
|
+
echo "🧪 Testing testdriverai init command..."
|
|
9
|
+
echo ""
|
|
10
|
+
|
|
11
|
+
# Cleanup function
|
|
12
|
+
cleanup() {
|
|
13
|
+
echo "🧹 Cleaning up test directories..."
|
|
14
|
+
rm -rf /tmp/testdriver-test-*
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
trap cleanup EXIT
|
|
18
|
+
|
|
19
|
+
# Test 1: Full init with all features
|
|
20
|
+
echo "1️⃣ Testing full initialization (package.json, tests, workflow, npm install)..."
|
|
21
|
+
cd /tmp
|
|
22
|
+
mkdir -p testdriver-test-init
|
|
23
|
+
cd testdriver-test-init
|
|
24
|
+
node /Users/ianjennings/Development/cli/bin/testdriverai.js init
|
|
25
|
+
echo ""
|
|
26
|
+
echo "✅ Files created:"
|
|
27
|
+
find . -type f -not -path "./node_modules/*" | sort
|
|
28
|
+
echo ""
|
|
29
|
+
echo "📄 package.json:"
|
|
30
|
+
cat package.json
|
|
31
|
+
echo ""
|
|
32
|
+
echo "📄 vitest.config.js:"
|
|
33
|
+
cat vitest.config.js
|
|
34
|
+
echo ""
|
|
35
|
+
echo "📄 GitHub workflow:"
|
|
36
|
+
cat .github/workflows/testdriver.yml
|
|
37
|
+
echo ""
|
|
38
|
+
echo "📄 First 15 lines of tests/example.test.js:"
|
|
39
|
+
head -15 tests/example.test.js
|
|
40
|
+
echo ""
|
|
41
|
+
echo "📦 Installed dependencies:"
|
|
42
|
+
npm list --depth=0
|
|
43
|
+
echo ""
|
|
44
|
+
echo "---"
|
|
45
|
+
echo ""
|
|
46
|
+
|
|
47
|
+
# Test 2: Help command
|
|
48
|
+
echo "2️⃣ Testing help command..."
|
|
49
|
+
node /Users/ianjennings/Development/cli/bin/testdriverai.js init --help
|
|
50
|
+
echo ""
|
|
51
|
+
echo "---"
|
|
52
|
+
echo ""
|
|
53
|
+
|
|
54
|
+
echo "✅ All tests passed!"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quick test to verify provision() authentication works
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { test } from 'vitest';
|
|
6
|
+
import { provision } from '../../lib/presets/index.mjs';
|
|
7
|
+
|
|
8
|
+
test('provision auth test', async (context) => {
|
|
9
|
+
console.log('Starting provision...');
|
|
10
|
+
|
|
11
|
+
const { testdriver, dashcam } = await provision('chrome', {
|
|
12
|
+
url: 'http://testdriver-sandbox.vercel.app/',
|
|
13
|
+
}, context);
|
|
14
|
+
|
|
15
|
+
console.log('✅ Provision complete!');
|
|
16
|
+
console.log('TestDriver:', testdriver);
|
|
17
|
+
console.log('Dashcam:', dashcam);
|
|
18
|
+
|
|
19
|
+
// Try a simple find
|
|
20
|
+
const result = await testdriver.find('any element');
|
|
21
|
+
console.log('Find result:', result);
|
|
22
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestDriver SDK - Assert Test (Vitest)
|
|
3
|
+
* Converted from: testdriver/acceptance/assert.yaml
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
|
+
|
|
9
|
+
describe("Assert Test", () => {
|
|
10
|
+
it("should assert the testdriver login page shows", async (context) => {
|
|
11
|
+
const testdriver = TestDriver(context, { newSandbox: true });
|
|
12
|
+
|
|
13
|
+
// provision.chrome() automatically calls ready() and starts dashcam
|
|
14
|
+
await testdriver.provision.chrome({
|
|
15
|
+
url: 'http://testdriver-sandbox.vercel.app/login',
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
// Assert the TestDriver.ai Sandbox login page is displayed
|
|
19
|
+
const result = await testdriver.assert(
|
|
20
|
+
"the TestDriver.ai Sandbox login page is displayed",
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
expect(result).toBeTruthy();
|
|
24
|
+
});
|
|
25
|
+
// it("should assert the testdriver login page shows 2", async (context) => {
|
|
26
|
+
// const testdriver = TestDriver(context, { newSandbox: true });
|
|
27
|
+
|
|
28
|
+
// // provision.chrome() automatically calls ready() and starts dashcam
|
|
29
|
+
// await testdriver.provision.chrome({
|
|
30
|
+
// url: 'http://testdriver-sandbox.vercel.app/login',
|
|
31
|
+
// });
|
|
32
|
+
|
|
33
|
+
// // Assert the TestDriver.ai Sandbox login page is displayed
|
|
34
|
+
// const result = await testdriver.assert(
|
|
35
|
+
// "the TestDriver.ai Sandbox login page is displayed",
|
|
36
|
+
// );
|
|
37
|
+
|
|
38
|
+
// expect(result).toBeTruthy();
|
|
39
|
+
// });
|
|
40
|
+
});
|
|
41
|
+
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestDriver SDK - Auto Cache Key Demo
|
|
3
|
+
*
|
|
4
|
+
* This test demonstrates the auto-generated cache key feature.
|
|
5
|
+
* When no cacheKey is provided, TestDriver will automatically generate
|
|
6
|
+
* one based on the hash of this test file.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, expect, it } from "vitest";
|
|
10
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
11
|
+
|
|
12
|
+
describe("Auto Cache Key Demo", () => {
|
|
13
|
+
it("should use auto-generated cache key based on file hash", async (context) => {
|
|
14
|
+
// NOTE: No cacheKey is provided here!
|
|
15
|
+
// TestDriver will automatically generate one from the hash of this file
|
|
16
|
+
const testdriver = TestDriver(context, {
|
|
17
|
+
headless: true,
|
|
18
|
+
newSandbox: true
|
|
19
|
+
// cacheKey NOT specified - will be auto-generated
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// The cache key should be auto-generated
|
|
23
|
+
console.log('Auto-generated cache key:', testdriver.options.cacheKey);
|
|
24
|
+
expect(testdriver.options.cacheKey).toBeTruthy();
|
|
25
|
+
expect(testdriver.options.cacheKey).toMatch(/^[0-9a-f]{16}$/); // 16 hex chars
|
|
26
|
+
|
|
27
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
28
|
+
|
|
29
|
+
// First find - will be cached with auto-generated key
|
|
30
|
+
const signInButton1 = await testdriver.find(
|
|
31
|
+
"Sign In, black button below the password field"
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
// Second find - should hit cache because it's the same file (same cache key)
|
|
35
|
+
const signInButton2 = await testdriver.find(
|
|
36
|
+
"Sign In, black button below the password field"
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
expect(signInButton1.found()).toBe(true);
|
|
40
|
+
expect(signInButton2.found()).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("should use same auto-generated cache key for multiple tests in the same file", async (context) => {
|
|
44
|
+
// This test is in the same file, so it should get the same auto-generated cache key
|
|
45
|
+
const testdriver = TestDriver(context, {
|
|
46
|
+
headless: true,
|
|
47
|
+
newSandbox: true
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
console.log('Auto-generated cache key (test 2):', testdriver.options.cacheKey);
|
|
51
|
+
expect(testdriver.options.cacheKey).toBeTruthy();
|
|
52
|
+
|
|
53
|
+
// If you modify this file, the hash (and therefore cache key) will change,
|
|
54
|
+
// invalidating the cache for this test file
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chrome Extension Loading Demo
|
|
3
|
+
* Demonstrates how to load Chrome extensions using Chrome for Testing
|
|
4
|
+
*
|
|
5
|
+
* This test shows how to launch Chrome with a specific extension loaded
|
|
6
|
+
* by using its Chrome Web Store extension ID.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
10
|
+
import TestDriver from "../../sdk.js";
|
|
11
|
+
import {
|
|
12
|
+
runPostrun,
|
|
13
|
+
runPrerunChromeExtension
|
|
14
|
+
} from "./setup/lifecycleHelpers.mjs";
|
|
15
|
+
|
|
16
|
+
describe("Chrome Extension Loading", () => {
|
|
17
|
+
let client;
|
|
18
|
+
let dashcamUrl;
|
|
19
|
+
|
|
20
|
+
beforeAll(async () => {
|
|
21
|
+
// Initialize TestDriver client
|
|
22
|
+
client = await TestDriver.create({
|
|
23
|
+
apiKey: process.env.TD_API_KEY,
|
|
24
|
+
apiRoot: process.env.TD_API_ROOT,
|
|
25
|
+
os: "linux",
|
|
26
|
+
verbosity: 1,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Run prerun with uBlock Origin extension loaded
|
|
30
|
+
// Extension ID: cjpalhdlnbpafiamejdnhcphjbkeiagm
|
|
31
|
+
await runPrerunChromeExtension(client, "cjpalhdlnbpafiamejdnhcphjbkeiagm");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
afterAll(async () => {
|
|
35
|
+
if (client) {
|
|
36
|
+
dashcamUrl = await runPostrun(client);
|
|
37
|
+
await client.cleanup();
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("should load Chrome with extension and verify functionality", async () => {
|
|
42
|
+
// Focus Chrome browser
|
|
43
|
+
await client.focusApplication("Google Chrome");
|
|
44
|
+
|
|
45
|
+
// Verify the page loaded
|
|
46
|
+
const pageElement = await client.find("TestDriver.ai Sandbox");
|
|
47
|
+
expect(pageElement.found()).toBe(true);
|
|
48
|
+
|
|
49
|
+
// Test basic interaction to ensure Chrome is working with the extension
|
|
50
|
+
const signInButton = await client.find(
|
|
51
|
+
"Sign In, black button below the password field",
|
|
52
|
+
);
|
|
53
|
+
await signInButton.click();
|
|
54
|
+
|
|
55
|
+
// Verify error message appears
|
|
56
|
+
const result = await client.assert(
|
|
57
|
+
"an error shows that fields are required",
|
|
58
|
+
);
|
|
59
|
+
expect(result).toBeTruthy();
|
|
60
|
+
|
|
61
|
+
console.log("✅ Chrome extension loaded successfully!");
|
|
62
|
+
if (dashcamUrl) {
|
|
63
|
+
console.log("🎥 Dashcam URL:", dashcamUrl);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("should demonstrate extension interaction", async () => {
|
|
68
|
+
// You can add specific tests here to interact with the extension
|
|
69
|
+
// For example, if testing uBlock Origin, you might:
|
|
70
|
+
// 1. Navigate to a page with ads
|
|
71
|
+
// 2. Verify ads are blocked
|
|
72
|
+
// 3. Access the extension's popup or settings
|
|
73
|
+
|
|
74
|
+
await client.focusApplication("Google Chrome");
|
|
75
|
+
|
|
76
|
+
// Example: Navigate to extension management page to verify it's loaded
|
|
77
|
+
await client.exec(
|
|
78
|
+
"sh",
|
|
79
|
+
`xdotool key --clearmodifiers ctrl+shift+e`,
|
|
80
|
+
5000,
|
|
81
|
+
true
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
// Wait a moment for the extensions page to potentially load
|
|
85
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
86
|
+
|
|
87
|
+
console.log("✅ Extension interaction test completed");
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -3,31 +3,19 @@
|
|
|
3
3
|
* Converted from: testdriver/acceptance/drag-and-drop.yaml
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
createTestClient,
|
|
9
|
-
setupTest,
|
|
10
|
-
teardownTest,
|
|
11
|
-
} from "./setup/testHelpers.mjs";
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
12
8
|
|
|
13
9
|
const isLinux = (process.env.TD_OS || "linux") === "linux";
|
|
14
10
|
|
|
15
11
|
describe("Drag and Drop Test", () => {
|
|
16
|
-
let testdriver;
|
|
17
|
-
|
|
18
|
-
beforeEach(async (context) => {
|
|
19
|
-
testdriver = createTestClient({ task: context.task });
|
|
20
|
-
|
|
21
|
-
await setupTest(testdriver);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
afterEach(async (context) => {
|
|
25
|
-
await teardownTest(testdriver, { task: context.task });
|
|
26
|
-
});
|
|
27
|
-
|
|
28
12
|
it.skipIf(isLinux)(
|
|
29
13
|
'should drag "New Text Document" to "Recycle Bin"',
|
|
30
|
-
async () => {
|
|
14
|
+
async (context) => {
|
|
15
|
+
const testdriver = TestDriver(context, { headless: true });
|
|
16
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
17
|
+
|
|
18
|
+
//
|
|
31
19
|
// Show the desktop
|
|
32
20
|
await testdriver.pressKeys(["win", "d"]);
|
|
33
21
|
|
|
@@ -3,28 +3,15 @@
|
|
|
3
3
|
* Tests that finding a non-existent element returns properly without timing out
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
createTestClient,
|
|
9
|
-
setupTest,
|
|
10
|
-
teardownTest,
|
|
11
|
-
} from "./setup/testHelpers.mjs";
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
12
8
|
|
|
13
9
|
describe("Element Not Found Test", () => {
|
|
14
|
-
|
|
10
|
+
it("should handle non-existent element gracefully without timing out", async (context) => {
|
|
11
|
+
const testdriver = TestDriver(context, { headless: true });
|
|
12
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
testdriver = createTestClient({ task: context.task });
|
|
18
|
-
|
|
19
|
-
await setupTest(testdriver);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
afterEach(async (context) => {
|
|
23
|
-
await teardownTest(testdriver, { task: context.task });
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it("should handle non-existent element gracefully without timing out", async () => {
|
|
27
|
-
await testdriver.focusApplication("Google Chrome");
|
|
14
|
+
//
|
|
28
15
|
|
|
29
16
|
// Try to find an element that definitely doesn't exist
|
|
30
17
|
const element = await testdriver.find(
|
|
@@ -3,27 +3,15 @@
|
|
|
3
3
|
* Converted from: testdriver/acceptance/exec-js.yaml
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
createTestClient,
|
|
9
|
-
setupTest,
|
|
10
|
-
teardownTest,
|
|
11
|
-
} from "./setup/testHelpers.mjs";
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
12
8
|
|
|
13
9
|
describe("Exec JavaScript Test", () => {
|
|
14
|
-
|
|
10
|
+
it("should fetch user data from API and enter email", async (context) => {
|
|
11
|
+
const testdriver = TestDriver(context, { headless: true });
|
|
12
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
testdriver = createTestClient({ task: context.task });
|
|
18
|
-
|
|
19
|
-
await setupTest(testdriver);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
afterEach(async (context) => {
|
|
23
|
-
await teardownTest(testdriver, { task: context.task });
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it("should fetch user data from API and enter email", async () => {
|
|
14
|
+
//
|
|
27
15
|
// Execute JavaScript to fetch user data
|
|
28
16
|
const userEmail = await testdriver.exec(
|
|
29
17
|
"js",
|
|
@@ -3,29 +3,17 @@
|
|
|
3
3
|
* Converted from: testdriver/acceptance/exec-output.yaml
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
createTestClient,
|
|
9
|
-
setupTest,
|
|
10
|
-
teardownTest,
|
|
11
|
-
} from "./setup/testHelpers.mjs";
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
12
8
|
|
|
13
|
-
describe("Exec Output Test", () => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
beforeEach(async (context) => {
|
|
17
|
-
testdriver = createTestClient({ task: context.task });
|
|
18
|
-
|
|
19
|
-
await setupTest(testdriver);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
afterEach(async (context) => {
|
|
23
|
-
await teardownTest(testdriver, { task: context.task });
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it.skipIf(() => testdriver.os === "linux")(
|
|
9
|
+
describe.skipIf(process.env.TD_OS === "linux")("Exec Output Test", () => {
|
|
10
|
+
it(
|
|
27
11
|
"should set date using PowerShell and navigate to calendar",
|
|
28
|
-
async () => {
|
|
12
|
+
async (context) => {
|
|
13
|
+
const testdriver = TestDriver(context, { headless: true });
|
|
14
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
15
|
+
|
|
16
|
+
//
|
|
29
17
|
// Generate date in query string format
|
|
30
18
|
const queryString = await testdriver.exec(
|
|
31
19
|
"pwsh",
|
|
@@ -3,33 +3,21 @@
|
|
|
3
3
|
* Converted from: testdriver/acceptance/exec-shell.yaml
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
createTestClient,
|
|
9
|
-
setupTest,
|
|
10
|
-
teardownTest,
|
|
11
|
-
} from "./setup/testHelpers.mjs";
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
12
8
|
|
|
13
|
-
describe("Exec PowerShell Test", () => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
beforeEach(async (context) => {
|
|
17
|
-
testdriver = createTestClient({ task: context.task });
|
|
18
|
-
|
|
19
|
-
await setupTest(testdriver);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
afterEach(async (context) => {
|
|
23
|
-
await teardownTest(testdriver, { task: context.task });
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it.skipIf(() => testdriver.os === "linux")(
|
|
9
|
+
describe.skipIf(process.env.TD_OS === "linux")("Exec PowerShell Test", () => {
|
|
10
|
+
it(
|
|
27
11
|
"should generate random email using PowerShell and enter it",
|
|
28
|
-
async () => {
|
|
12
|
+
async (context) => {
|
|
13
|
+
const testdriver = TestDriver(context, { headless: true });
|
|
14
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
15
|
+
|
|
16
|
+
//
|
|
29
17
|
// Generate random email using PowerShell
|
|
30
|
-
const randomEmail = await testdriver.exec(
|
|
31
|
-
"pwsh",
|
|
32
|
-
`
|
|
18
|
+
const randomEmail = await testdriver.exec({
|
|
19
|
+
language: "pwsh",
|
|
20
|
+
code: `
|
|
33
21
|
# Random email generator in PowerShell
|
|
34
22
|
|
|
35
23
|
# Arrays of possible names and domains
|
|
@@ -49,8 +37,8 @@ $email = "$first.$last$number@$domain".ToLower()
|
|
|
49
37
|
# Output
|
|
50
38
|
Write-Output "$email"
|
|
51
39
|
`,
|
|
52
|
-
10000,
|
|
53
|
-
);
|
|
40
|
+
timeout: 10000,
|
|
41
|
+
});
|
|
54
42
|
|
|
55
43
|
// Enter the email in username field
|
|
56
44
|
const usernameField = await testdriver.find(
|
|
@@ -3,29 +3,17 @@
|
|
|
3
3
|
* Converted from: testdriver/acceptance/focus-window.yaml
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
createTestClient,
|
|
9
|
-
setupTest,
|
|
10
|
-
teardownTest,
|
|
11
|
-
} from "./setup/testHelpers.mjs";
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
12
8
|
|
|
13
9
|
describe("Focus Window Test", () => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
beforeEach(async (context) => {
|
|
17
|
-
testdriver = createTestClient({ task: context.task });
|
|
18
|
-
|
|
19
|
-
await setupTest(testdriver);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
afterEach(async (context) => {
|
|
23
|
-
await teardownTest(testdriver, { task: context.task });
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it.skipIf(() => testdriver.os === "linux")(
|
|
10
|
+
it.skipIf(process.env.TD_OS === "linux")(
|
|
27
11
|
"should click Microsoft Edge icon and focus Google Chrome",
|
|
28
|
-
async () => {
|
|
12
|
+
async (context) => {
|
|
13
|
+
const testdriver = TestDriver(context, { headless: true });
|
|
14
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
15
|
+
|
|
16
|
+
//
|
|
29
17
|
// Show desktop
|
|
30
18
|
await testdriver.pressKeys(["winleft", "d"]);
|
|
31
19
|
|
|
@@ -3,28 +3,13 @@
|
|
|
3
3
|
* Demonstrates nice Vitest-style formatted logs for Dashcam replay
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
createTestClient,
|
|
9
|
-
setupTest,
|
|
10
|
-
teardownTest,
|
|
11
|
-
} from "./setup/testHelpers.mjs";
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
12
8
|
|
|
13
9
|
describe("Formatted Logging Test", () => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
testdriver = createTestClient({ task: context.task });
|
|
18
|
-
|
|
19
|
-
await setupTest(testdriver);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
afterEach(async (context) => {
|
|
23
|
-
await teardownTest(testdriver, { task: context.task });
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it("should demonstrate formatted logs in dashcam replay", async () => {
|
|
27
|
-
await testdriver.focusApplication("Google Chrome");
|
|
10
|
+
it("should demonstrate formatted logs in dashcam replay", async (context) => {
|
|
11
|
+
const testdriver = TestDriver(context, { headless: true });
|
|
12
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
28
13
|
|
|
29
14
|
// Find and click - logs will be nicely formatted
|
|
30
15
|
const signInButton = await testdriver.find(
|
|
@@ -3,28 +3,19 @@
|
|
|
3
3
|
* Converted from: testdriver/acceptance/hover-image.yaml
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
performLogin,
|
|
10
|
-
setupTest,
|
|
11
|
-
teardownTest,
|
|
12
|
-
} from "./setup/testHelpers.mjs";
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
|
+
import { performLogin } from "./setup/testHelpers.mjs";
|
|
13
9
|
|
|
14
10
|
describe("Hover Image Test", () => {
|
|
15
|
-
|
|
11
|
+
it("should click on shopping cart icon and verify empty cart", async (context) => {
|
|
12
|
+
const testdriver = TestDriver(context, { headless: true });
|
|
13
|
+
|
|
14
|
+
// provision.chrome() automatically calls ready() and starts dashcam
|
|
15
|
+
await testdriver.provision.chrome({
|
|
16
|
+
url: 'http://testdriver-sandbox.vercel.app/login',
|
|
17
|
+
});
|
|
16
18
|
|
|
17
|
-
beforeEach(async (context) => {
|
|
18
|
-
testdriver = createTestClient({ task: context.task });
|
|
19
|
-
|
|
20
|
-
await setupTest(testdriver);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
afterEach(async (context) => {
|
|
24
|
-
await teardownTest(testdriver, { task: context.task });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it("should click on shopping cart icon and verify empty cart", async () => {
|
|
28
19
|
// Perform login first
|
|
29
20
|
await performLogin(testdriver);
|
|
30
21
|
|
|
@@ -3,28 +3,16 @@
|
|
|
3
3
|
* Converted from: testdriver/acceptance/hover-text-with-description.yaml
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
performLogin,
|
|
10
|
-
setupTest,
|
|
11
|
-
teardownTest,
|
|
12
|
-
} from "./setup/testHelpers.mjs";
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
|
+
import { performLogin } from "./setup/testHelpers.mjs";
|
|
13
9
|
|
|
14
10
|
describe("Hover Text With Description Test", () => {
|
|
15
|
-
|
|
11
|
+
it("should add TestDriver Hat to cart and verify", async (context) => {
|
|
12
|
+
const testdriver = TestDriver(context, { headless: true });
|
|
13
|
+
await testdriver.provision.chrome({ url: 'http://testdriver-sandbox.vercel.app/login' });
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
testdriver = createTestClient({ task: context.task });
|
|
19
|
-
|
|
20
|
-
await setupTest(testdriver);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
afterEach(async (context) => {
|
|
24
|
-
await teardownTest(testdriver, { task: context.task });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it("should add TestDriver Hat to cart and verify", async () => {
|
|
15
|
+
//
|
|
28
16
|
// Perform login first
|
|
29
17
|
await performLogin(testdriver);
|
|
30
18
|
|