testdriverai 7.1.0 → 7.1.2
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/agent/index.js +18 -45
- package/agent/interface.js +13 -2
- package/agent/lib/commands.js +1 -1
- package/agent/lib/redraw.js +1 -1
- package/agent/lib/sandbox.js +30 -2
- package/agent/lib/valid-version.js +2 -2
- package/debugger/index.html +1 -1
- package/docs/docs.json +140 -131
- 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/{guides → _drafts}/caching-selectors.mdx +125 -17
- package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
- package/docs/v7/_drafts/error-handling.mdx +501 -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/plugin-migration.mdx +222 -0
- package/docs/v7/_drafts/prompt-cache.mdx +200 -0
- package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
- package/docs/v7/_drafts/sdk-logging.mdx +222 -0
- package/docs/v7/_drafts/sdk-migration.mdx +474 -0
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
- package/docs/v7/{guides → _drafts}/troubleshooting.mdx +2 -2
- package/docs/v7/{guides → _drafts}/vitest-plugin.mdx +4 -4
- package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
- package/docs/v7/api/client.mdx +1 -1
- package/docs/v7/api/dashcam.mdx +2 -2
- package/docs/v7/api/elements.mdx +143 -41
- package/docs/v7/api/find.mdx +258 -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 +1 -1
- 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 +51 -5
- 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/playwright.mdx +3 -3
- package/docs/v7/presets/chrome.mdx +16 -0
- package/docs/v7/presets/electron.mdx +18 -0
- package/docs/v7/presets/vscode.mdx +19 -0
- package/examples/run-tests-with-recording.sh +70 -0
- package/examples/screenshot-example.js +63 -0
- package/examples/sdk-awesome-logs-demo.js +177 -0
- package/examples/sdk-cache-thresholds.js +96 -0
- package/examples/sdk-element-properties.js +155 -0
- package/examples/sdk-simple-example.js +65 -0
- package/examples/test-recording-example.test.js +166 -0
- package/interfaces/cli/commands/init.js +358 -0
- package/interfaces/vitest-plugin.mjs +214 -10
- package/{src → lib}/core/Dashcam.js +41 -4
- package/{src → lib}/vitest/hooks.mjs +118 -100
- package/lib/vitest/setup.mjs +44 -0
- package/package.json +9 -10
- package/sdk.d.ts +15 -2
- package/sdk.js +72 -17
- package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
- package/{testdriver/acceptance-sdk → test/manual}/test-console-logs.test.mjs +1 -1
- package/test/manual/test-find-api.js +73 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-prompt-cache.js +96 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/manual/test-sandbox-render.js +28 -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/testdriver/assert.test.mjs +41 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/auto-cache-key-demo.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +3 -3
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +3 -3
- package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +2 -2
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-text.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +1 -1
- package/{src/vitest/lifecycle.mjs → test/testdriver/setup/lifecycleHelpers.mjs} +84 -99
- package/test/testdriver/setup/testHelpers.mjs +653 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/type.test.mjs +1 -1
- package/vitest.config.mjs +8 -59
- 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/settings.json +0 -14
- package/AGENTS.md +0 -550
- package/CODEOWNERS +0 -2
- 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/docs/v7/guides/ci-cd/azure.mdx +0 -587
- package/docs/v7/guides/ci-cd/circleci.mdx +0 -523
- package/docs/v7/guides/ci-cd/github-actions.mdx +0 -457
- package/docs/v7/guides/ci-cd/gitlab.mdx +0 -498
- package/docs/v7/guides/ci-cd/jenkins.mdx +0 -664
- package/docs/v7/guides/ci-cd/travis.mdx +0 -438
- package/scripts/view-test-results.mjs +0 -96
- package/src/vitest/extended.mjs +0 -108
- package/src/vitest/index.mjs +0 -64
- package/src/vitest/utils.mjs +0 -150
- 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/dashcam.test.js +0 -137
- 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 -26
- package/testdriver/acceptance-sdk/hooks-example.test.mjs +0 -38
- package/testdriver/acceptance-sdk/presets-example.test.mjs +0 -87
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +0 -420
- package/testdriver/acceptance-sdk/sully-ai.test.mjs +0 -234
- package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
- 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/docs/v7/{guides → _drafts}/best-practices.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/caching-ai.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/caching.mdx +0 -0
- /package/docs/{MIGRATION.md → v7/_drafts/cli-to-sdk-migration.mdx} +0 -0
- /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
- /package/docs/v7/{progressive-apis/CORE.md → _drafts/core.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/debugging.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/faq.mdx +0 -0
- /package/docs/v7/{progressive-apis/HOOKS.md → _drafts/hooks.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/performance.mdx +0 -0
- /package/docs/{PRESETS.md → v7/_drafts/presets.mdx} +0 -0
- /package/docs/v7/{progressive-apis/PROGRESSIVE_DISCLOSURE.md → _drafts/progressive-disclosure.mdx} +0 -0
- /package/docs/v7/{progressive-apis/PROVISION.md → _drafts/provision.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/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/vitest.mdx +0 -0
- /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
- /package/{src → lib}/core/index.d.ts +0 -0
- /package/{src → lib}/core/index.js +0 -0
- /package/{src → lib}/presets/index.mjs +0 -0
- /package/{src → lib}/vitest/hooks.d.ts +0 -0
- /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +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}/chrome-extension.test.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
|
|
9
9
|
describe("Element Not Found Test", () => {
|
|
10
10
|
it("should handle non-existent element gracefully without timing out", async (context) => {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
|
|
9
9
|
describe("Exec JavaScript Test", () => {
|
|
10
10
|
it("should fetch user data from API and enter email", async (context) => {
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
|
|
9
|
-
describe("Exec Output Test", () => {
|
|
10
|
-
it
|
|
9
|
+
describe.skipIf(process.env.TD_OS === "linux")("Exec Output Test", () => {
|
|
10
|
+
it(
|
|
11
11
|
"should set date using PowerShell and navigate to calendar",
|
|
12
12
|
async (context) => {
|
|
13
13
|
const testdriver = TestDriver(context, { headless: true });
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
|
|
9
|
-
describe("Exec PowerShell Test", () => {
|
|
10
|
-
it
|
|
9
|
+
describe.skipIf(process.env.TD_OS === "linux")("Exec PowerShell Test", () => {
|
|
10
|
+
it(
|
|
11
11
|
"should generate random email using PowerShell and enter it",
|
|
12
12
|
async (context) => {
|
|
13
13
|
const testdriver = TestDriver(context, { headless: true });
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
|
|
9
9
|
describe("Formatted Logging Test", () => {
|
|
10
10
|
it("should demonstrate formatted logs in dashcam replay", async (context) => {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
import { performLogin } from "./setup/testHelpers.mjs";
|
|
9
9
|
|
|
10
10
|
describe("Hover Image Test", () => {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
import { performLogin } from "./setup/testHelpers.mjs";
|
|
9
9
|
|
|
10
10
|
describe("Hover Text With Description Test", () => {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
|
|
9
9
|
describe("Hover Text Test", () => {
|
|
10
10
|
it("should click Sign In and verify error message", async (context) => {
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import path, { dirname } from "path";
|
|
7
7
|
import { fileURLToPath } from "url";
|
|
8
8
|
import { describe, expect, it } from "vitest";
|
|
9
|
-
import { TestDriver } from "../../
|
|
9
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
10
10
|
import { performLogin } from "./setup/testHelpers.mjs";
|
|
11
11
|
|
|
12
12
|
// Get the directory of the current module
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
|
|
9
9
|
describe("Press Keys Test", () => {
|
|
10
10
|
it("should create tabs and navigate using keyboard shortcuts", async (context) => {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
|
|
9
9
|
describe.skip("Prompt Test", () => {
|
|
10
10
|
it("should execute AI-driven prompts", async (context) => {
|
|
@@ -25,7 +25,7 @@ describe.skip("Prompt Test", () => {
|
|
|
25
25
|
// This test is skipped as it requires explicit SDK implementation
|
|
26
26
|
// You would need to implement these as explicit SDK calls
|
|
27
27
|
|
|
28
|
-
await testdriver.
|
|
28
|
+
await testdriver.act("log in");
|
|
29
29
|
|
|
30
30
|
const result = await testdriver.assert("the testdriver sandbox is visible");
|
|
31
31
|
expect(result).toBeTruthy();
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
|
|
9
9
|
describe("Scroll Keyboard Test", () => {
|
|
10
10
|
it("should navigate to webhamster.com and scroll with keyboard", async (context) => {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
|
|
9
9
|
describe("Scroll Until Image Test", () => {
|
|
10
10
|
it("should scroll until brown colored house image appears", async (context) => {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { describe, expect, it } from "vitest";
|
|
7
|
-
import { TestDriver } from "../../
|
|
7
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
8
8
|
import { performLogin } from "./setup/testHelpers.mjs";
|
|
9
9
|
|
|
10
10
|
describe("Scroll Until Text Test", () => {
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { describe, expect, it } from "vitest";
|
|
9
|
-
import { TestDriver } from "../../
|
|
9
|
+
import { TestDriver } from "../../lib/vitest/hooks.mjs";
|
|
10
10
|
|
|
11
11
|
describe("Scroll Test", () => {
|
|
12
12
|
it("should navigate and scroll down the page", async (context) => {
|
|
@@ -1,23 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Lifecycle Helpers
|
|
2
|
+
* Lifecycle Helpers
|
|
3
|
+
* Shared lifecycle hook functions (prerun, postrun)
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
5
|
+
* LEGACY: These helpers are thin wrappers around the new Dashcam class.
|
|
6
|
+
* For new code, prefer using the Dashcam class directly:
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* test('my test', async (context) => {
|
|
11
|
-
* const testdriver = TestDriver(context);
|
|
12
|
-
* await testdriver.provision.chrome({ url: 'https://example.com' });
|
|
13
|
-
*
|
|
14
|
-
* // Or use manual lifecycle helpers
|
|
15
|
-
* await launchChrome(testdriver, 'https://other-site.com');
|
|
16
|
-
* await waitForPage(testdriver, 'Welcome');
|
|
17
|
-
* });
|
|
8
|
+
* import { Dashcam } from 'testdriverai/core';
|
|
9
|
+
* const dashcam = new Dashcam(client);
|
|
10
|
+
* await dashcam.auth();
|
|
18
11
|
*/
|
|
19
12
|
|
|
20
|
-
import Dashcam from '
|
|
13
|
+
import Dashcam from '../../../lib/core/Dashcam.js';
|
|
21
14
|
|
|
22
15
|
// Module-level cache to maintain Dashcam instance state across helper calls
|
|
23
16
|
const dashcamInstances = new WeakMap();
|
|
@@ -38,16 +31,21 @@ function getDashcam(client, options = {}) {
|
|
|
38
31
|
|
|
39
32
|
/**
|
|
40
33
|
* Authenticate dashcam with API key
|
|
34
|
+
* @deprecated Use `new Dashcam(client)` and `dashcam.auth()` instead
|
|
41
35
|
* @param {TestDriver} client - TestDriver client
|
|
42
|
-
* @param {string} apiKey - Dashcam API key (default
|
|
36
|
+
* @param {string} apiKey - Dashcam API key (default: 4e93d8bf-3886-4d26-a144-116c4063522d)
|
|
43
37
|
*/
|
|
44
|
-
export async function authDashcam(
|
|
38
|
+
export async function authDashcam(
|
|
39
|
+
client,
|
|
40
|
+
apiKey = "4e93d8bf-3886-4d26-a144-116c4063522d",
|
|
41
|
+
) {
|
|
45
42
|
const dashcam = getDashcam(client, { apiKey });
|
|
46
43
|
await dashcam.auth();
|
|
47
44
|
}
|
|
48
45
|
|
|
49
46
|
/**
|
|
50
47
|
* Add log file tracking to dashcam
|
|
48
|
+
* @deprecated Use `new Dashcam(client)` and `dashcam.addFileLog()` instead
|
|
51
49
|
* @param {TestDriver} client - TestDriver client
|
|
52
50
|
* @param {string} logName - Name for the log in dashcam (default: "TestDriver Log")
|
|
53
51
|
*/
|
|
@@ -58,11 +56,10 @@ export async function addDashcamLog(client, logName = "TestDriver Log") {
|
|
|
58
56
|
: "/tmp/testdriver.log";
|
|
59
57
|
|
|
60
58
|
// Create log file first
|
|
61
|
-
const shell = client.os === "windows" ? "pwsh" : "sh";
|
|
62
59
|
if (client.os === "windows") {
|
|
63
|
-
await client.exec(
|
|
60
|
+
await client.exec("pwsh", `New-Item -ItemType File -Path "${logPath}" -Force`, 10000, true);
|
|
64
61
|
} else {
|
|
65
|
-
await client.exec(
|
|
62
|
+
await client.exec("sh", `touch ${logPath}`, 10000, true);
|
|
66
63
|
}
|
|
67
64
|
|
|
68
65
|
await dashcam.addFileLog(logPath, logName);
|
|
@@ -70,6 +67,7 @@ export async function addDashcamLog(client, logName = "TestDriver Log") {
|
|
|
70
67
|
|
|
71
68
|
/**
|
|
72
69
|
* Start dashcam recording
|
|
70
|
+
* @deprecated Use `new Dashcam(client)` and `dashcam.start()` instead
|
|
73
71
|
* @param {TestDriver} client - TestDriver client
|
|
74
72
|
*/
|
|
75
73
|
export async function startDashcam(client) {
|
|
@@ -79,6 +77,7 @@ export async function startDashcam(client) {
|
|
|
79
77
|
|
|
80
78
|
/**
|
|
81
79
|
* Stop dashcam recording and retrieve URL
|
|
80
|
+
* @deprecated Use `new Dashcam(client)` and `dashcam.stop()` instead
|
|
82
81
|
* @param {TestDriver} client - TestDriver client
|
|
83
82
|
* @returns {Promise<string|null>} Dashcam URL if available
|
|
84
83
|
*/
|
|
@@ -98,76 +97,81 @@ export async function stopDashcam(client) {
|
|
|
98
97
|
}
|
|
99
98
|
|
|
100
99
|
/**
|
|
101
|
-
* Launch Chrome browser
|
|
100
|
+
* Launch Chrome browser with guest mode
|
|
102
101
|
* @param {TestDriver} client - TestDriver client
|
|
103
|
-
* @param {string} url - URL to open
|
|
104
|
-
* @param {object} options - Browser options
|
|
105
|
-
* @param {boolean} options.guest - Launch in guest mode (default: true)
|
|
106
|
-
* @param {boolean} options.maximized - Start maximized (default: true)
|
|
102
|
+
* @param {string} url - URL to open (default: https://testdriver-sandbox.vercel.app/)
|
|
107
103
|
*/
|
|
108
|
-
export async function launchChrome(
|
|
109
|
-
|
|
104
|
+
export async function launchChrome(
|
|
105
|
+
client,
|
|
106
|
+
url = "http://testdriver-sandbox.vercel.app/",
|
|
107
|
+
) {
|
|
110
108
|
const shell = client.os === "windows" ? "pwsh" : "sh";
|
|
111
|
-
|
|
112
|
-
const guestFlag = guest ? "--guest" : "";
|
|
113
|
-
const maxFlag = maximized ? "--start-maximized" : "";
|
|
114
109
|
|
|
115
110
|
if (client.os === "windows") {
|
|
116
|
-
const args = [maxFlag, guestFlag, `"${url}"`].filter(Boolean).join('", "');
|
|
117
111
|
await client.exec(
|
|
118
112
|
"pwsh",
|
|
119
|
-
`Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "${
|
|
113
|
+
`Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--guest", "${url}"`,
|
|
120
114
|
30000,
|
|
121
115
|
);
|
|
122
116
|
} else {
|
|
123
|
-
const flags = [maxFlag, "--disable-fre", "--no-default-browser-check", "--no-first-run", guestFlag].filter(Boolean).join(" ");
|
|
124
117
|
await client.exec(
|
|
125
118
|
shell,
|
|
126
|
-
`google-chrome
|
|
119
|
+
`google-chrome --start-maximized --disable-fre --no-default-browser-check --no-first-run --guest "${url}" >/dev/null 2>&1 &`,
|
|
127
120
|
30000,
|
|
128
121
|
);
|
|
129
122
|
}
|
|
130
123
|
}
|
|
131
124
|
|
|
132
125
|
/**
|
|
133
|
-
* Launch Chrome for Testing browser
|
|
126
|
+
* Launch Chrome for Testing browser with guest mode
|
|
134
127
|
* @param {TestDriver} client - TestDriver client
|
|
135
|
-
* @param {string} url - URL to open
|
|
136
|
-
* @param {object} options - Browser options
|
|
128
|
+
* @param {string} url - URL to open (default: https://testdriver-sandbox.vercel.app/)
|
|
137
129
|
*/
|
|
138
|
-
export async function launchChromeForTesting(
|
|
139
|
-
|
|
130
|
+
export async function launchChromeForTesting(
|
|
131
|
+
client,
|
|
132
|
+
url = "http://testdriver-sandbox.vercel.app/",
|
|
133
|
+
) {
|
|
140
134
|
const shell = client.os === "windows" ? "pwsh" : "sh";
|
|
141
|
-
|
|
142
|
-
const guestFlag = guest ? "--guest" : "";
|
|
143
|
-
const maxFlag = maximized ? "--start-maximized" : "";
|
|
144
135
|
|
|
145
136
|
if (client.os === "windows") {
|
|
146
|
-
//
|
|
147
|
-
|
|
137
|
+
// Windows Chrome for Testing path would need to be determined
|
|
138
|
+
// For now, fallback to regular Chrome on Windows
|
|
139
|
+
await client.exec(
|
|
140
|
+
"pwsh",
|
|
141
|
+
`Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--guest", "${url}"`,
|
|
142
|
+
30000,
|
|
143
|
+
);
|
|
148
144
|
} else {
|
|
149
|
-
const flags = [maxFlag, "--disable-fre", "--no-default-browser-check", "--no-first-run", guestFlag].filter(Boolean).join(" ");
|
|
150
145
|
await client.exec(
|
|
151
146
|
shell,
|
|
152
|
-
`chrome-for-testing
|
|
147
|
+
`chrome-for-testing --start-maximized --disable-fre --no-default-browser-check --no-first-run --guest "${url}" >/dev/null 2>&1 &`,
|
|
153
148
|
30000,
|
|
154
149
|
);
|
|
155
150
|
}
|
|
156
151
|
}
|
|
157
152
|
|
|
158
153
|
/**
|
|
159
|
-
* Launch Chrome with a Chrome extension loaded
|
|
154
|
+
* Launch Chrome for Testing with a Chrome extension loaded
|
|
160
155
|
* @param {TestDriver} client - TestDriver client
|
|
161
|
-
* @param {string} extensionId - Chrome Web Store extension ID
|
|
162
|
-
* @param {string} url - URL to open
|
|
156
|
+
* @param {string} extensionId - Chrome Web Store extension ID (e.g., "cjpalhdlnbpafiamejdnhcphjbkeiagm" for uBlock Origin)
|
|
157
|
+
* @param {string} url - URL to open (default: https://testdriver-sandbox.vercel.app/)
|
|
163
158
|
* @example
|
|
164
159
|
* // Launch with uBlock Origin extension
|
|
165
160
|
* await launchChromeExtension(client, "cjpalhdlnbpafiamejdnhcphjbkeiagm");
|
|
161
|
+
*
|
|
162
|
+
* // Launch with multiple extensions (comma-separated)
|
|
163
|
+
* await launchChromeExtension(client, "cjpalhdlnbpafiamejdnhcphjbkeiagm,nngceckbapebfimnlniiiahkandclblb");
|
|
166
164
|
*/
|
|
167
|
-
export async function launchChromeExtension(
|
|
165
|
+
export async function launchChromeExtension(
|
|
166
|
+
client,
|
|
167
|
+
extensionId,
|
|
168
|
+
url = "http://testdriver-sandbox.vercel.app/",
|
|
169
|
+
) {
|
|
168
170
|
const shell = client.os === "windows" ? "pwsh" : "sh";
|
|
169
171
|
|
|
170
172
|
if (client.os === "windows") {
|
|
173
|
+
// Windows Chrome for Testing path would need to be determined
|
|
174
|
+
// For now, fallback to regular Chrome on Windows
|
|
171
175
|
await client.exec(
|
|
172
176
|
"pwsh",
|
|
173
177
|
`Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--load-extension=${extensionId}", "${url}"`,
|
|
@@ -188,87 +192,68 @@ export async function launchChromeExtension(client, extensionId, url = "about:bl
|
|
|
188
192
|
* @param {string} text - Text to wait for
|
|
189
193
|
* @param {number} maxAttempts - Maximum number of attempts (default: 60)
|
|
190
194
|
* @param {number} pollInterval - Interval between polls in ms (default: 5000)
|
|
191
|
-
* @returns {Promise<boolean>} True if text was found
|
|
192
195
|
*/
|
|
193
|
-
export async function waitForPage(
|
|
196
|
+
export async function waitForPage(
|
|
197
|
+
client,
|
|
198
|
+
text,
|
|
199
|
+
maxAttempts = 60,
|
|
200
|
+
pollInterval = 5000,
|
|
201
|
+
) {
|
|
194
202
|
console.log("Waiting for page to load, looking for text:", text);
|
|
203
|
+
let element;
|
|
195
204
|
for (let i = 0; i < maxAttempts; i++) {
|
|
196
|
-
|
|
197
|
-
if (element.found())
|
|
198
|
-
return true;
|
|
199
|
-
}
|
|
205
|
+
element = await client.find(text);
|
|
206
|
+
if (element.found()) break;
|
|
200
207
|
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
201
208
|
}
|
|
202
|
-
return false;
|
|
203
209
|
}
|
|
204
210
|
|
|
205
211
|
/**
|
|
206
|
-
* Run
|
|
207
|
-
*
|
|
212
|
+
* Run prerun lifecycle hooks
|
|
213
|
+
* Implements lifecycle/prerun.yaml functionality
|
|
208
214
|
* @param {TestDriver} client - TestDriver client
|
|
209
|
-
* @param {object} options - Options
|
|
210
|
-
* @param {string} options.url - URL to open (default: sandbox)
|
|
211
|
-
* @param {string} options.waitForText - Text to wait for after page load
|
|
212
215
|
*/
|
|
213
|
-
export async function runPrerun(client
|
|
214
|
-
const {
|
|
215
|
-
url = "http://testdriver-sandbox.vercel.app/",
|
|
216
|
-
waitForText = "TestDriver.ai Sandbox"
|
|
217
|
-
} = options;
|
|
218
|
-
|
|
216
|
+
export async function runPrerun(client) {
|
|
219
217
|
await authDashcam(client);
|
|
220
218
|
await addDashcamLog(client);
|
|
221
219
|
await startDashcam(client);
|
|
222
|
-
await launchChrome(client
|
|
223
|
-
|
|
224
|
-
await waitForPage(client, waitForText);
|
|
225
|
-
}
|
|
220
|
+
await launchChrome(client);
|
|
221
|
+
await waitForPage(client, "TestDriver.ai Sandbox");
|
|
226
222
|
}
|
|
227
223
|
|
|
228
224
|
/**
|
|
229
|
-
* Run prerun with Chrome for Testing
|
|
225
|
+
* Run prerun lifecycle hooks with Chrome for Testing
|
|
226
|
+
* Implements lifecycle/prerun.yaml functionality using Chrome for Testing
|
|
230
227
|
* @param {TestDriver} client - TestDriver client
|
|
231
|
-
* @param {object} options - Options
|
|
232
228
|
*/
|
|
233
|
-
export async function runPrerunChromeForTesting(client
|
|
234
|
-
const {
|
|
235
|
-
url = "http://testdriver-sandbox.vercel.app/",
|
|
236
|
-
waitForText = "TestDriver.ai Sandbox"
|
|
237
|
-
} = options;
|
|
238
|
-
|
|
229
|
+
export async function runPrerunChromeForTesting(client) {
|
|
239
230
|
await authDashcam(client);
|
|
240
231
|
await addDashcamLog(client);
|
|
241
232
|
await startDashcam(client);
|
|
242
|
-
await launchChromeForTesting(client
|
|
243
|
-
|
|
244
|
-
await waitForPage(client, waitForText);
|
|
245
|
-
}
|
|
233
|
+
await launchChromeForTesting(client);
|
|
234
|
+
await waitForPage(client, "TestDriver.ai Sandbox");
|
|
246
235
|
}
|
|
247
236
|
|
|
248
237
|
/**
|
|
249
|
-
* Run prerun with Chrome extension
|
|
238
|
+
* Run prerun lifecycle hooks with Chrome extension loaded
|
|
239
|
+
* Implements lifecycle/prerun.yaml functionality with a Chrome extension
|
|
250
240
|
* @param {TestDriver} client - TestDriver client
|
|
251
|
-
* @param {string} extensionId - Chrome extension ID
|
|
252
|
-
* @
|
|
241
|
+
* @param {string} extensionId - Chrome Web Store extension ID to load
|
|
242
|
+
* @example
|
|
243
|
+
* // Launch with uBlock Origin extension
|
|
244
|
+
* await runPrerunChromeExtension(client, "cjpalhdlnbpafiamejdnhcphjbkeiagm");
|
|
253
245
|
*/
|
|
254
|
-
export async function runPrerunChromeExtension(client, extensionId
|
|
255
|
-
const {
|
|
256
|
-
url = "http://testdriver-sandbox.vercel.app/",
|
|
257
|
-
waitForText = "TestDriver.ai Sandbox"
|
|
258
|
-
} = options;
|
|
259
|
-
|
|
246
|
+
export async function runPrerunChromeExtension(client, extensionId) {
|
|
260
247
|
await authDashcam(client);
|
|
261
248
|
await addDashcamLog(client);
|
|
262
249
|
await startDashcam(client);
|
|
263
|
-
await launchChromeExtension(client, extensionId
|
|
264
|
-
|
|
265
|
-
await waitForPage(client, waitForText);
|
|
266
|
-
}
|
|
250
|
+
await launchChromeExtension(client, extensionId);
|
|
251
|
+
await waitForPage(client, "TestDriver.ai Sandbox");
|
|
267
252
|
}
|
|
268
253
|
|
|
269
254
|
/**
|
|
270
|
-
* Run
|
|
271
|
-
*
|
|
255
|
+
* Run postrun lifecycle hooks
|
|
256
|
+
* Implements lifecycle/postrun.yaml functionality
|
|
272
257
|
* @param {TestDriver} client - TestDriver client
|
|
273
258
|
* @returns {Promise<string|null>} Dashcam URL if available
|
|
274
259
|
*/
|