testdriverai 7.3.12 → 7.3.13

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.
Files changed (133) hide show
  1. package/.github/skills/testdriver:ai/SKILL.md +204 -0
  2. package/.github/skills/testdriver:assert/SKILL.md +284 -0
  3. package/.github/skills/testdriver:aws-setup/SKILL.md +515 -0
  4. package/.github/skills/testdriver:caching/SKILL.md +124 -0
  5. package/.github/skills/testdriver:captcha/SKILL.md +159 -0
  6. package/.github/skills/testdriver:ci-cd/SKILL.md +602 -0
  7. package/.github/skills/testdriver:click/SKILL.md +286 -0
  8. package/.github/skills/testdriver:client/SKILL.md +339 -0
  9. package/.github/skills/testdriver:cloud/SKILL.md +119 -0
  10. package/.github/skills/testdriver:customizing-devices/SKILL.md +153 -0
  11. package/.github/skills/testdriver:dashcam/SKILL.md +418 -0
  12. package/.github/skills/testdriver:debugging-with-screenshots/SKILL.md +271 -0
  13. package/.github/skills/testdriver:device-config/SKILL.md +317 -0
  14. package/.github/skills/testdriver:double-click/SKILL.md +102 -0
  15. package/.github/skills/testdriver:elements/SKILL.md +605 -0
  16. package/.github/skills/testdriver:enterprise/SKILL.md +114 -0
  17. package/.github/skills/testdriver:examples/SKILL.md +7 -0
  18. package/.github/skills/testdriver:exec/SKILL.md +345 -0
  19. package/.github/skills/testdriver:find/SKILL.md +721 -0
  20. package/.github/skills/testdriver:focus-application/SKILL.md +293 -0
  21. package/.github/skills/testdriver:generating-tests/SKILL.md +36 -0
  22. package/.github/skills/testdriver:hover/SKILL.md +278 -0
  23. package/.github/skills/testdriver:locating-elements/SKILL.md +71 -0
  24. package/.github/skills/testdriver:making-assertions/SKILL.md +32 -0
  25. package/.github/skills/testdriver:mcp-workflow/SKILL.md +410 -0
  26. package/.github/skills/testdriver:mouse-down/SKILL.md +161 -0
  27. package/.github/skills/testdriver:mouse-up/SKILL.md +164 -0
  28. package/.github/skills/testdriver:performing-actions/SKILL.md +51 -0
  29. package/.github/skills/testdriver:press-keys/SKILL.md +348 -0
  30. package/.github/skills/testdriver:quickstart/SKILL.md +161 -0
  31. package/.github/skills/testdriver:reusable-code/SKILL.md +240 -0
  32. package/.github/skills/testdriver:right-click/SKILL.md +123 -0
  33. package/.github/skills/testdriver:running-tests/SKILL.md +181 -0
  34. package/.github/skills/testdriver:screenshot/SKILL.md +167 -0
  35. package/.github/skills/testdriver:scroll/SKILL.md +299 -0
  36. package/.github/skills/testdriver:secrets/SKILL.md +115 -0
  37. package/.github/skills/testdriver:self-hosted/SKILL.md +65 -0
  38. package/.github/skills/testdriver:test-writer/SKILL.md +451 -0
  39. package/.github/skills/testdriver:testdriver/SKILL.md +523 -0
  40. package/.github/skills/testdriver:testdriver-mechanic/SKILL.md +165 -0
  41. package/.github/skills/testdriver:type/SKILL.md +357 -0
  42. package/.github/skills/testdriver:variables/SKILL.md +111 -0
  43. package/.github/skills/testdriver:waiting-for-elements/SKILL.md +66 -0
  44. package/.github/skills/testdriver:what-is-testdriver/SKILL.md +54 -0
  45. package/.github/workflows/acceptance-windows-scheduled.yaml +6 -1
  46. package/.github/workflows/acceptance.yaml +0 -36
  47. package/.github/workflows/update-examples.yaml +53 -0
  48. package/CHANGELOG.md +4 -0
  49. package/agent/events.js +1 -0
  50. package/agent/index.js +8 -0
  51. package/agent/lib/commands.js +48 -29
  52. package/agent/lib/redraw.js +3 -1
  53. package/agent/lib/sandbox.js +166 -14
  54. package/agent/lib/sdk.js +142 -3
  55. package/agent/lib/system.js +4 -6
  56. package/ai/skills/testdriver:ai/SKILL.md +204 -0
  57. package/ai/skills/testdriver:assert/SKILL.md +315 -0
  58. package/ai/skills/testdriver:aws-setup/SKILL.md +448 -0
  59. package/ai/skills/testdriver:caching/SKILL.md +124 -0
  60. package/ai/skills/testdriver:captcha/SKILL.md +159 -0
  61. package/ai/skills/testdriver:ci-cd/SKILL.md +602 -0
  62. package/ai/skills/testdriver:click/SKILL.md +286 -0
  63. package/ai/skills/testdriver:client/SKILL.md +372 -0
  64. package/ai/skills/testdriver:cloud/SKILL.md +119 -0
  65. package/ai/skills/testdriver:customizing-devices/SKILL.md +153 -0
  66. package/ai/skills/testdriver:dashcam/SKILL.md +418 -0
  67. package/ai/skills/testdriver:debugging-with-screenshots/SKILL.md +401 -0
  68. package/ai/skills/testdriver:device-config/SKILL.md +317 -0
  69. package/ai/skills/testdriver:double-click/SKILL.md +102 -0
  70. package/ai/skills/testdriver:elements/SKILL.md +605 -0
  71. package/ai/skills/testdriver:enterprise/SKILL.md +114 -0
  72. package/ai/skills/testdriver:examples/SKILL.md +7 -0
  73. package/ai/skills/testdriver:exec/SKILL.md +345 -0
  74. package/ai/skills/testdriver:find/SKILL.md +745 -0
  75. package/ai/skills/testdriver:focus-application/SKILL.md +293 -0
  76. package/ai/skills/testdriver:generating-tests/SKILL.md +36 -0
  77. package/ai/skills/testdriver:hover/SKILL.md +278 -0
  78. package/ai/skills/testdriver:locating-elements/SKILL.md +71 -0
  79. package/ai/skills/testdriver:making-assertions/SKILL.md +32 -0
  80. package/ai/skills/testdriver:mcp-workflow/SKILL.md +410 -0
  81. package/ai/skills/testdriver:mouse-down/SKILL.md +161 -0
  82. package/ai/skills/testdriver:mouse-up/SKILL.md +164 -0
  83. package/ai/skills/testdriver:ocr/SKILL.md +235 -0
  84. package/ai/skills/testdriver:performing-actions/SKILL.md +51 -0
  85. package/ai/skills/testdriver:press-keys/SKILL.md +348 -0
  86. package/ai/skills/testdriver:quickstart/SKILL.md +146 -0
  87. package/ai/skills/testdriver:reusable-code/SKILL.md +240 -0
  88. package/ai/skills/testdriver:right-click/SKILL.md +123 -0
  89. package/ai/skills/testdriver:running-tests/SKILL.md +185 -0
  90. package/ai/skills/testdriver:screenshot/SKILL.md +248 -0
  91. package/ai/skills/testdriver:scroll/SKILL.md +335 -0
  92. package/ai/skills/testdriver:secrets/SKILL.md +115 -0
  93. package/ai/skills/testdriver:self-hosted/SKILL.md +65 -0
  94. package/ai/skills/testdriver:test-writer/SKILL.md +451 -0
  95. package/ai/skills/testdriver:testdriver/SKILL.md +631 -0
  96. package/ai/skills/testdriver:testdriver-mechanic/SKILL.md +165 -0
  97. package/ai/skills/testdriver:type/SKILL.md +357 -0
  98. package/ai/skills/testdriver:variables/SKILL.md +111 -0
  99. package/ai/skills/testdriver:waiting-for-elements/SKILL.md +66 -0
  100. package/ai/skills/testdriver:what-is-testdriver/SKILL.md +54 -0
  101. package/debugger/index.html +12 -2
  102. package/docs/v7/examples/scroll-keyboard.mdx +1 -1
  103. package/docs/v7/find.mdx +1 -0
  104. package/examples/config.mjs +1 -1
  105. package/examples/findall-coffee-icons.test.mjs +42 -0
  106. package/examples/flake-diffthreshold-001.test.mjs +9 -0
  107. package/examples/flake-diffthreshold-01.test.mjs +9 -0
  108. package/examples/flake-diffthreshold-05.test.mjs +9 -0
  109. package/examples/{z_flake-noredraw-cache.test.mjs → flake-noredraw-cache.test.mjs} +2 -2
  110. package/examples/{z_flake-noredraw-nocache.test.mjs → flake-noredraw-nocache.test.mjs} +2 -2
  111. package/examples/{z_flake-redraw-cache.test.mjs → flake-redraw-cache.test.mjs} +2 -2
  112. package/examples/{z_flake-redraw-nocache.test.mjs → flake-redraw-nocache.test.mjs} +2 -2
  113. package/examples/flake-rocket-match.test.mjs +30 -0
  114. package/examples/{z_flake-shared.mjs → flake-shared.mjs} +2 -2
  115. package/examples/parse.test.mjs +19 -0
  116. package/examples/scroll-keyboard.test.mjs +1 -1
  117. package/interfaces/cli/lib/base.js +6 -0
  118. package/interfaces/logger.js +51 -13
  119. package/interfaces/vitest-plugin.mjs +137 -0
  120. package/lib/core/index.d.ts +22 -0
  121. package/lib/init-project.js +105 -6
  122. package/lib/vitest/hooks.mjs +2 -5
  123. package/lib/vitest/setup-disable-defender.mjs +52 -0
  124. package/package.json +2 -1
  125. package/sdk-log-formatter.js +90 -0
  126. package/sdk.d.ts +88 -51
  127. package/sdk.js +126 -18
  128. package/setup/aws/disable-defender.sh +42 -0
  129. package/vitest.config.mjs +1 -3
  130. package/examples/z_flake-diffthreshold-001.test.mjs +0 -9
  131. package/examples/z_flake-diffthreshold-01.test.mjs +0 -9
  132. package/examples/z_flake-diffthreshold-05.test.mjs +0 -9
  133. /package/{examples → manual}/captcha-api.test.mjs +0 -0
package/sdk.js CHANGED
@@ -515,7 +515,7 @@ class Element {
515
515
  } else if (cacheKey) {
516
516
  // cacheKey provided - enable cache with threshold
517
517
  // Per-command thresholds > legacy cacheThreshold > global config
518
- threshold = perCommandThresholds?.screen ?? cacheThreshold ?? this.sdk.cacheConfig?.thresholds?.find?.screen ?? 0.01;
518
+ threshold = perCommandThresholds?.screen ?? cacheThreshold ?? this.sdk.cacheConfig?.thresholds?.find?.screen ?? 0.05;
519
519
  elementSimilarity = perCommandThresholds?.element ?? this.sdk.cacheConfig?.thresholds?.find?.element ?? 0.8;
520
520
  } else if (cacheThreshold !== null) {
521
521
  // Explicit threshold provided without cacheKey
@@ -1325,6 +1325,34 @@ function createChainablePromise(promise) {
1325
1325
  return chainablePromise;
1326
1326
  }
1327
1327
 
1328
+ /**
1329
+ * Normalize redraw options from new thresholds format or legacy format to internal format.
1330
+ * New: { enabled: true, thresholds: { screen: 0.05, network: true } }
1331
+ * Legacy: { enabled: true, diffThreshold: 0.1, screenRedraw: true, networkMonitor: true }
1332
+ * Internal: { enabled: true, screenRedraw: true, networkMonitor: false }
1333
+ * @param {Object} opts - raw redraw options
1334
+ * @returns {Object} normalised options the redraw subsystem expects
1335
+ */
1336
+ function normalizeRedrawOptions(opts) {
1337
+ if (!opts || typeof opts !== "object") {
1338
+ return { enabled: !!opts };
1339
+ }
1340
+
1341
+ const result = { enabled: opts.enabled !== false };
1342
+
1343
+ // New thresholds format takes precedence
1344
+ if (opts.thresholds && typeof opts.thresholds === "object") {
1345
+ result.screenRedraw = opts.thresholds.screen !== false;
1346
+ result.networkMonitor = !!opts.thresholds.network;
1347
+ } else {
1348
+ // Legacy format fallback
1349
+ result.screenRedraw = opts.screenRedraw !== undefined ? opts.screenRedraw : true;
1350
+ result.networkMonitor = opts.networkMonitor !== undefined ? opts.networkMonitor : false;
1351
+ }
1352
+
1353
+ return result;
1354
+ }
1355
+
1328
1356
  /**
1329
1357
  * TestDriver SDK
1330
1358
  *
@@ -1470,7 +1498,7 @@ class TestDriverSDK {
1470
1498
  },
1471
1499
  };
1472
1500
  } else {
1473
- // Support cache object format: { cache: { thresholds: { find: { screen: 0.01, element: 0.8 }, assert: 0.05 } } }
1501
+ // Support cache object format: { cache: { thresholds: { find: { screen: 0.05, element: 0.8 }, assert: 0.05 } } }
1474
1502
  const cacheOpts = typeof options.cache === "object" ? options.cache : {};
1475
1503
  const thresholds = cacheOpts.thresholds || {};
1476
1504
  const findThresholds = typeof thresholds.find === "object" ? thresholds.find : {};
@@ -1479,7 +1507,7 @@ class TestDriverSDK {
1479
1507
  enabled: cacheOpts.enabled !== false,
1480
1508
  thresholds: {
1481
1509
  find: {
1482
- screen: findThresholds.screen ?? 0.01, // Default: 1% pixel diff allowed
1510
+ screen: findThresholds.screen ?? 0.05, // Default: 5% pixel diff allowed
1483
1511
  element: findThresholds.element ?? 0.8, // Default: 80% OpenCV correlation
1484
1512
  },
1485
1513
  assert: thresholds.assert ?? 0.05, // Default: 5% pixel diff for assertions
@@ -1506,22 +1534,23 @@ class TestDriverSDK {
1506
1534
  } : {};
1507
1535
 
1508
1536
  // Redraw configuration
1509
- // Supports both:
1510
- // - redraw: { enabled: true, diffThreshold: 0.1, screenRedraw: true, networkMonitor: true }
1511
- // - redrawThreshold: 0.1 (legacy, sets diffThreshold)
1512
- // The `redraw` option takes precedence and matches the per-command API
1537
+ // Supports:
1538
+ // - redraw: { enabled: true, thresholds: { screen: 0.05, network: true } } (new)
1539
+ // - redraw: true/false (shorthand)
1540
+ // - redraw: { enabled: true, diffThreshold: 0.1, screenRedraw: true, networkMonitor: true } (legacy)
1541
+ // - redrawThreshold: 0.1 (legacy, deprecated)
1513
1542
  if (options.redraw !== undefined) {
1514
- // New unified API: redraw object (matches per-command options)
1515
- this.redrawOptions =
1516
- typeof options.redraw === "object"
1517
- ? options.redraw
1518
- : { enabled: options.redraw }; // Support redraw: false as shorthand
1543
+ if (typeof options.redraw === "object") {
1544
+ this.redrawOptions = normalizeRedrawOptions(options.redraw);
1545
+ } else {
1546
+ this.redrawOptions = { enabled: !!options.redraw };
1547
+ }
1519
1548
  } else if (options.redrawThreshold !== undefined) {
1520
- // Legacy API: redrawThreshold number or object
1549
+ // Legacy API: redrawThreshold number or object (deprecated)
1521
1550
  this.redrawOptions =
1522
1551
  typeof options.redrawThreshold === "object"
1523
- ? options.redrawThreshold
1524
- : { diffThreshold: options.redrawThreshold };
1552
+ ? normalizeRedrawOptions(options.redrawThreshold)
1553
+ : { enabled: true, screenRedraw: true, networkMonitor: false };
1525
1554
  } else {
1526
1555
  // Default: disabled (as of v7.3)
1527
1556
  this.redrawOptions = { enabled: false };
@@ -1647,6 +1676,24 @@ class TestDriverSDK {
1647
1676
  return "C:\\PROGRA~1\\nodejs\\node_modules\\dashcam-chrome\\build";
1648
1677
  }
1649
1678
 
1679
+ /**
1680
+ * Extract domain pattern from a URL for web log tracking
1681
+ * @param {string} url - The URL to extract domain from
1682
+ * @returns {string} Domain pattern (e.g., "*://example.com/*")
1683
+ * @private
1684
+ */
1685
+ _getUrlDomainPattern(url) {
1686
+ try {
1687
+ const parsed = new URL(url);
1688
+ // Use wildcard scheme and path to match all pages on the domain
1689
+ return `*://${parsed.hostname}*`;
1690
+ } catch (e) {
1691
+ // Fallback to ** if URL parsing fails
1692
+ console.warn(`[_getUrlDomainPattern] Failed to parse URL "${url}", using ** pattern`);
1693
+ return "**";
1694
+ }
1695
+ }
1696
+
1650
1697
  /**
1651
1698
  * Wait for Chrome DevTools Protocol debugger to be ready on port 9222,
1652
1699
  * then wait for a page to report loaded.
@@ -1711,6 +1758,9 @@ class TestDriverSDK {
1711
1758
  guest = false,
1712
1759
  } = options;
1713
1760
 
1761
+ // Store the URL for domain-specific web log tracking
1762
+ self._provisionedChromeUrl = url;
1763
+
1714
1764
  // Set up Chrome profile with preferences
1715
1765
  const shell = this.os === "windows" ? "pwsh" : "sh";
1716
1766
  const userDataDir =
@@ -1813,6 +1863,17 @@ class TestDriverSDK {
1813
1863
  // Wait for Chrome debugger port and page to be ready
1814
1864
  await this._waitForChromeDebuggerReady();
1815
1865
  await this.focusApplication("Google Chrome");
1866
+
1867
+ // Add web log tracking with domain wildcard pattern, then start dashcam
1868
+ if (this.dashcamEnabled) {
1869
+ const domainPattern = this._getUrlDomainPattern(url);
1870
+ await this.dashcam.addWebLog(domainPattern, "Web Logs");
1871
+
1872
+ // Start dashcam recording after logs are configured
1873
+ if (!(await this.dashcam.isRecording())) {
1874
+ await this.dashcam.start();
1875
+ }
1876
+ }
1816
1877
  },
1817
1878
 
1818
1879
  /**
@@ -2071,6 +2132,11 @@ with zipfile.ZipFile(io.BytesIO(zip_data)) as zf:
2071
2132
  // Wait for Chrome debugger port and page to be ready
2072
2133
  await this._waitForChromeDebuggerReady();
2073
2134
  await this.focusApplication("Google Chrome");
2135
+
2136
+ // Start dashcam recording
2137
+ if (this.dashcamEnabled && !(await this.dashcam.isRecording())) {
2138
+ await this.dashcam.start();
2139
+ }
2074
2140
  },
2075
2141
 
2076
2142
  /**
@@ -2121,6 +2187,11 @@ with zipfile.ZipFile(io.BytesIO(zip_data)) as zf:
2121
2187
 
2122
2188
  // Wait for VS Code to be ready
2123
2189
  await this.focusApplication("Visual Studio Code");
2190
+
2191
+ // Start dashcam recording
2192
+ if (this.dashcamEnabled && !(await this.dashcam.isRecording())) {
2193
+ await this.dashcam.start();
2194
+ }
2124
2195
  },
2125
2196
 
2126
2197
  /**
@@ -2270,6 +2341,11 @@ with zipfile.ZipFile(io.BytesIO(zip_data)) as zf:
2270
2341
  await this.focusApplication(appName);
2271
2342
  }
2272
2343
 
2344
+ // Start dashcam recording
2345
+ if (this.dashcamEnabled && !(await this.dashcam.isRecording())) {
2346
+ await this.dashcam.start();
2347
+ }
2348
+
2273
2349
  return actualFilePath;
2274
2350
  },
2275
2351
 
@@ -2306,6 +2382,11 @@ with zipfile.ZipFile(io.BytesIO(zip_data)) as zf:
2306
2382
  }
2307
2383
 
2308
2384
  await this.focusApplication("Electron");
2385
+
2386
+ // Start dashcam recording
2387
+ if (this.dashcamEnabled && !(await this.dashcam.isRecording())) {
2388
+ await this.dashcam.start();
2389
+ }
2309
2390
  },
2310
2391
 
2311
2392
  /**
@@ -2348,8 +2429,12 @@ with zipfile.ZipFile(io.BytesIO(zip_data)) as zf:
2348
2429
  await this.dashcam.addFileLog(actualLogPath, logName);
2349
2430
 
2350
2431
  // Add web log tracking if enabled
2432
+ // Use domain pattern from provisioned Chrome URL if available
2351
2433
  if (webLogs) {
2352
- await this.dashcam.addWebLog("**", "Web Logs");
2434
+ const pattern = this._provisionedChromeUrl
2435
+ ? this._getUrlDomainPattern(this._provisionedChromeUrl)
2436
+ : "**";
2437
+ await this.dashcam.addWebLog(pattern, "Web Logs");
2353
2438
  }
2354
2439
 
2355
2440
  // Start recording if not already recording
@@ -2766,14 +2851,37 @@ CAPTCHA_SOLVER_EOF`,
2766
2851
  this.analytics.track("sdk.disconnect");
2767
2852
  }
2768
2853
 
2854
+ // Clean up redraw interval if active
2855
+ if (this.agent?.redraw?.cleanup) {
2856
+ try {
2857
+ this.agent.redraw.cleanup();
2858
+ } catch (err) {
2859
+ // Ignore cleanup errors
2860
+ }
2861
+ }
2862
+
2863
+ // Stop the debugger server (HTTP + WebSocket server) to release the port
2864
+ try {
2865
+ const { stopDebugger } = require("./agent/lib/debugger-server.js");
2866
+ stopDebugger();
2867
+ } catch (err) {
2868
+ // Ignore if debugger wasn't started
2869
+ }
2870
+
2769
2871
  // Always close the sandbox WebSocket connection to clean up resources
2770
2872
  // This ensures we don't leave orphaned connections even if connect() failed
2771
2873
  if (this.sandbox && typeof this.sandbox.close === "function") {
2772
2874
  this.sandbox.close();
2773
2875
  }
2774
2876
 
2877
+ // Remove all event listeners on the emitter to release references
2878
+ if (this.emitter && typeof this.emitter.removeAllListeners === "function") {
2879
+ this.emitter.removeAllListeners();
2880
+ }
2881
+
2775
2882
  this.connected = false;
2776
2883
  this.instance = null;
2884
+ this.commands = null;
2777
2885
  }
2778
2886
 
2779
2887
  /**
@@ -2820,7 +2928,7 @@ CAPTCHA_SOLVER_EOF`,
2820
2928
  *
2821
2929
  * @example
2822
2930
  * // Find with custom cache threshold (legacy)
2823
- * const element = await client.find('login button', 0.01);
2931
+ * const element = await client.find('login button', 0.05);
2824
2932
  *
2825
2933
  * @example
2826
2934
  * // Poll until element is found
@@ -2986,7 +3094,7 @@ CAPTCHA_SOLVER_EOF`,
2986
3094
  cacheKey = null; // Clear any cacheKey to ensure cache is truly disabled
2987
3095
  } else if (cacheKey) {
2988
3096
  // cacheKey provided - enable cache with threshold (findAll only uses screen, no element)
2989
- threshold = perCommandThresholds?.screen ?? cacheThreshold ?? this.cacheConfig?.thresholds?.find?.screen ?? 0.01;
3097
+ threshold = perCommandThresholds?.screen ?? cacheThreshold ?? this.cacheConfig?.thresholds?.find?.screen ?? 0.05;
2990
3098
  } else if (cacheThreshold !== null) {
2991
3099
  // Explicit threshold provided without cacheKey
2992
3100
  threshold = perCommandThresholds?.screen ?? cacheThreshold;
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # --- Disable Windows Defender ---
5
+ # This script disables Windows Defender on a running AWS instance via SSM.
6
+ # Requires: AWS_REGION, INSTANCE_ID environment variables
7
+
8
+ : "${AWS_REGION:?Set AWS_REGION}"
9
+ : "${INSTANCE_ID:?Set INSTANCE_ID}"
10
+
11
+ echo "Disabling Windows Defender..."
12
+ DEFENDER_CMD=$(aws ssm send-command \
13
+ --region "$AWS_REGION" \
14
+ --instance-ids "$INSTANCE_ID" \
15
+ --document-name "AWS-RunPowerShellScript" \
16
+ --parameters 'commands=["Set-MpPreference -DisableRealtimeMonitoring $true", "Set-MpPreference -DisableIOAVProtection $true", "Set-MpPreference -DisableBehaviorMonitoring $true", "Set-MpPreference -DisableBlockAtFirstSeen $true", "Set-MpPreference -DisableScriptScanning $true", "Write-Output \"Windows Defender disabled successfully\""]' \
17
+ --output json)
18
+
19
+ DEFENDER_CMD_ID=$(jq -r '.Command.CommandId' <<<"$DEFENDER_CMD")
20
+ echo "Defender disable command ID: $DEFENDER_CMD_ID"
21
+
22
+ echo "Waiting for Defender disable command to complete..."
23
+ if aws ssm wait command-executed --region "$AWS_REGION" --command-id "$DEFENDER_CMD_ID" --instance-id "$INSTANCE_ID" 2>/dev/null; then
24
+ DEFENDER_STATUS=$(aws ssm get-command-invocation \
25
+ --region "$AWS_REGION" \
26
+ --command-id "$DEFENDER_CMD_ID" \
27
+ --instance-id "$INSTANCE_ID" \
28
+ --output json)
29
+ DEFENDER_OUTPUT=$(jq -r '.StandardOutputContent // ""' <<<"$DEFENDER_STATUS")
30
+ DEFENDER_ERROR=$(jq -r '.StandardErrorContent // ""' <<<"$DEFENDER_STATUS")
31
+ DEFENDER_CMD_STATUS=$(jq -r '.Status // ""' <<<"$DEFENDER_STATUS")
32
+
33
+ echo "Defender disable status: $DEFENDER_CMD_STATUS"
34
+ if [ -n "$DEFENDER_OUTPUT" ] && [ "$DEFENDER_OUTPUT" != "null" ]; then
35
+ echo "✓ $DEFENDER_OUTPUT"
36
+ fi
37
+ if [ -n "$DEFENDER_ERROR" ] && [ "$DEFENDER_ERROR" != "null" ]; then
38
+ echo "⚠ Defender stderr: $DEFENDER_ERROR"
39
+ fi
40
+ else
41
+ echo "⚠ Defender disable command may have timed out, continuing anyway..."
42
+ fi
package/vitest.config.mjs CHANGED
@@ -6,15 +6,13 @@ import { defineConfig } from "vitest/config";
6
6
  const setupFiles = [
7
7
  "testdriverai/vitest/setup",
8
8
  "testdriverai/vitest/setup-aws",
9
+ 'testdriverai/vitest/setup-disable-defender'
9
10
  ];
10
11
 
11
12
  export default defineConfig({
12
13
  test: {
13
- retry: 1,
14
14
  testTimeout: 900000,
15
15
  hookTimeout: 900000,
16
- disableConsoleIntercept: true,
17
- maxConcurrency: 100,
18
16
  reporters: [
19
17
  "default",
20
18
  TestDriver(),
@@ -1,9 +0,0 @@
1
- /**
2
- * Popup Loading - diffThreshold=0.01, cache=true
3
- */
4
- import { popupLoadingTest } from "./z_flake-shared.mjs";
5
-
6
- popupLoadingTest("diffThreshold=0.01, cache=true", {
7
- redraw: { enabled: true, diffThreshold: 0.01 },
8
- cache: true,
9
- });
@@ -1,9 +0,0 @@
1
- /**
2
- * Popup Loading - diffThreshold=0.1, cache=false
3
- */
4
- import { popupLoadingTest } from "./z_flake-shared.mjs";
5
-
6
- popupLoadingTest("diffThreshold=0.1, cache=false", {
7
- redraw: { enabled: true, diffThreshold: 0.1 },
8
- cache: false,
9
- });
@@ -1,9 +0,0 @@
1
- /**
2
- * Popup Loading - diffThreshold=0.5, cache=true
3
- */
4
- import { popupLoadingTest } from "./z_flake-shared.mjs";
5
-
6
- popupLoadingTest("diffThreshold=0.5, cache=true", {
7
- redraw: { enabled: true, diffThreshold: 0.5 },
8
- cache: true,
9
- });
File without changes