testeiya 0.10.0 → 0.10.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.
Files changed (241) hide show
  1. package/PIPELINES.md +3 -0
  2. package/README.md +10 -20
  3. package/dist/prompt/clis.d.ts +7 -0
  4. package/dist/prompt/pipeline-report.d.ts +1 -0
  5. package/dist/prompt/report.d.ts +10 -0
  6. package/dist/prompt/system-prompt.d.ts +22 -0
  7. package/dist/prompt/system-prompt.js +1 -1
  8. package/dist/prompt/system-prompt.js.map +1 -1
  9. package/dist/prompt/testomat.io.d.ts +19 -0
  10. package/dist/prompt/thread.d.ts +73 -0
  11. package/dist/src/args.d.ts +39 -0
  12. package/dist/src/attribution-extension.d.ts +3 -0
  13. package/dist/src/checkpoint.d.ts +30 -0
  14. package/dist/src/cli.d.ts +2 -0
  15. package/dist/src/cli.js +27 -32
  16. package/dist/src/cli.js.map +1 -1
  17. package/dist/src/doctor.d.ts +11 -0
  18. package/dist/src/env.d.ts +30 -0
  19. package/dist/src/exec.d.ts +11 -0
  20. package/dist/src/git.d.ts +41 -0
  21. package/dist/src/git.js +10 -0
  22. package/dist/src/git.js.map +1 -1
  23. package/dist/src/langfuse-extension.d.ts +7 -0
  24. package/dist/src/langfuse.d.ts +67 -0
  25. package/dist/src/mcp.d.ts +19 -0
  26. package/dist/src/model.d.ts +20 -0
  27. package/dist/src/model.js +2 -0
  28. package/dist/src/model.js.map +1 -1
  29. package/dist/src/models.d.ts +1 -0
  30. package/dist/src/output.d.ts +84 -0
  31. package/dist/src/pipeline/command-stage.d.ts +12 -0
  32. package/dist/src/pipeline/crash-guard.d.ts +12 -0
  33. package/dist/src/pipeline/crash-guard.js +21 -0
  34. package/dist/src/pipeline/crash-guard.js.map +1 -0
  35. package/dist/src/pipeline/diagram.d.ts +24 -0
  36. package/dist/src/pipeline/gate.d.ts +21 -0
  37. package/dist/src/pipeline/launcher.d.ts +33 -0
  38. package/dist/src/pipeline/launcher.js +16 -3
  39. package/dist/src/pipeline/launcher.js.map +1 -1
  40. package/dist/src/pipeline/log.d.ts +29 -0
  41. package/dist/src/pipeline/log.js +9 -0
  42. package/dist/src/pipeline/log.js.map +1 -1
  43. package/dist/src/pipeline/overlay.d.ts +29 -0
  44. package/dist/src/pipeline/pipeline-file.d.ts +44 -0
  45. package/dist/src/pipeline/pipeline-file.js +16 -8
  46. package/dist/src/pipeline/pipeline-file.js.map +1 -1
  47. package/dist/src/pipeline/pipeline.d.ts +78 -0
  48. package/dist/src/pipeline/pipeline.js +33 -7
  49. package/dist/src/pipeline/pipeline.js.map +1 -1
  50. package/dist/src/pipeline/report.d.ts +26 -0
  51. package/dist/src/pipeline/report.js +13 -0
  52. package/dist/src/pipeline/report.js.map +1 -1
  53. package/dist/src/pipeline/spec.d.ts +63 -0
  54. package/dist/src/pipeline/stage-env.d.ts +13 -0
  55. package/dist/src/pipeline/stage-env.js +31 -0
  56. package/dist/src/pipeline/stage-env.js.map +1 -0
  57. package/dist/src/pipeline/stage.d.ts +71 -0
  58. package/dist/src/pipeline/stage.js.map +1 -1
  59. package/dist/src/pipeline/state.d.ts +63 -0
  60. package/dist/src/pipeline/summary-stage.d.ts +24 -0
  61. package/dist/src/pipeline/task-stage.d.ts +24 -0
  62. package/dist/src/pipeline/task-stage.js +86 -2
  63. package/dist/src/pipeline/task-stage.js.map +1 -1
  64. package/dist/src/pipeline/variables.d.ts +20 -0
  65. package/dist/src/result.d.ts +6 -0
  66. package/dist/src/run.d.ts +69 -0
  67. package/dist/src/run.js +116 -60
  68. package/dist/src/run.js.map +1 -1
  69. package/dist/src/session.d.ts +43 -0
  70. package/dist/src/session.js +3 -1
  71. package/dist/src/session.js.map +1 -1
  72. package/dist/src/sessions.d.ts +23 -0
  73. package/dist/src/skills.d.ts +29 -0
  74. package/package.json +11 -2
  75. package/pipelines/api-testing.yml +16 -5
  76. package/pipelines/issue-test-cases.yml +3 -4
  77. package/pipelines/pr-review.yml +14 -5
  78. package/pipelines/regression.yml +1 -0
  79. package/pipelines/web-testing.yml +1 -0
  80. package/prompt/system-prompt.ts +1 -1
  81. package/scripts/vendor-skills.js +62 -0
  82. package/skills/codeceptjs/ci-fix-tests/SKILL.md +0 -119
  83. package/skills/codeceptjs/codeceptjs-auth/SKILL.md +0 -141
  84. package/skills/codeceptjs/codeceptjs-exploration/SKILL.md +0 -100
  85. package/skills/codeceptjs/codeceptjs-fundamentals/SKILL.md +0 -196
  86. package/skills/codeceptjs/codeceptjs-run-analysis/SKILL.md +0 -83
  87. package/skills/codeceptjs/debugging-codeceptjs-tests/SKILL.md +0 -126
  88. package/skills/codeceptjs/lint-codeceptjs-tests/SKILL.md +0 -104
  89. package/skills/codeceptjs/migrate-codeceptjs-4/SKILL.md +0 -109
  90. package/skills/codeceptjs/migrate-cypress-to-codeceptjs/SKILL.md +0 -295
  91. package/skills/codeceptjs/migrate-protractor-to-codeceptjs/SKILL.md +0 -339
  92. package/skills/codeceptjs/migrate-selenium-java-to-codeceptjs/SKILL.md +0 -459
  93. package/skills/codeceptjs/migrate-testcafe-to-codeceptjs/SKILL.md +0 -338
  94. package/skills/codeceptjs/refactoring-codeceptjs-tests/SKILL.md +0 -78
  95. package/skills/codeceptjs/writing-codeceptjs-tests/SKILL.md +0 -102
  96. package/skills/playwright/playwright-best-practices/SKILL.md +0 -303
  97. package/skills/playwright/playwright-best-practices/advanced/authentication-flows.md +0 -360
  98. package/skills/playwright/playwright-best-practices/advanced/authentication.md +0 -871
  99. package/skills/playwright/playwright-best-practices/advanced/clock-mocking.md +0 -364
  100. package/skills/playwright/playwright-best-practices/advanced/mobile-testing.md +0 -409
  101. package/skills/playwright/playwright-best-practices/advanced/multi-context.md +0 -288
  102. package/skills/playwright/playwright-best-practices/advanced/multi-user.md +0 -393
  103. package/skills/playwright/playwright-best-practices/advanced/network-advanced.md +0 -452
  104. package/skills/playwright/playwright-best-practices/advanced/third-party.md +0 -464
  105. package/skills/playwright/playwright-best-practices/architecture/pom-vs-fixtures.md +0 -363
  106. package/skills/playwright/playwright-best-practices/architecture/test-architecture.md +0 -369
  107. package/skills/playwright/playwright-best-practices/architecture/when-to-mock.md +0 -383
  108. package/skills/playwright/playwright-best-practices/browser-apis/browser-apis.md +0 -391
  109. package/skills/playwright/playwright-best-practices/browser-apis/iframes.md +0 -403
  110. package/skills/playwright/playwright-best-practices/browser-apis/service-workers.md +0 -504
  111. package/skills/playwright/playwright-best-practices/browser-apis/websockets.md +0 -403
  112. package/skills/playwright/playwright-best-practices/core/annotations.md +0 -424
  113. package/skills/playwright/playwright-best-practices/core/assertions-waiting.md +0 -361
  114. package/skills/playwright/playwright-best-practices/core/configuration.md +0 -452
  115. package/skills/playwright/playwright-best-practices/core/fixtures-hooks.md +0 -417
  116. package/skills/playwright/playwright-best-practices/core/global-setup.md +0 -434
  117. package/skills/playwright/playwright-best-practices/core/locators.md +0 -242
  118. package/skills/playwright/playwright-best-practices/core/page-object-model.md +0 -315
  119. package/skills/playwright/playwright-best-practices/core/projects-dependencies.md +0 -453
  120. package/skills/playwright/playwright-best-practices/core/test-data.md +0 -492
  121. package/skills/playwright/playwright-best-practices/core/test-suite-structure.md +0 -361
  122. package/skills/playwright/playwright-best-practices/core/test-tags.md +0 -298
  123. package/skills/playwright/playwright-best-practices/debugging/console-errors.md +0 -420
  124. package/skills/playwright/playwright-best-practices/debugging/debugging.md +0 -504
  125. package/skills/playwright/playwright-best-practices/debugging/error-testing.md +0 -360
  126. package/skills/playwright/playwright-best-practices/debugging/flaky-tests.md +0 -496
  127. package/skills/playwright/playwright-best-practices/frameworks/angular.md +0 -530
  128. package/skills/playwright/playwright-best-practices/frameworks/nextjs.md +0 -469
  129. package/skills/playwright/playwright-best-practices/frameworks/react.md +0 -531
  130. package/skills/playwright/playwright-best-practices/frameworks/vue.md +0 -574
  131. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/ci-cd.md +0 -468
  132. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/docker.md +0 -283
  133. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/github-actions.md +0 -546
  134. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/gitlab.md +0 -397
  135. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/other-providers.md +0 -521
  136. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/parallel-sharding.md +0 -371
  137. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/performance.md +0 -453
  138. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/reporting.md +0 -424
  139. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/test-coverage.md +0 -497
  140. package/skills/playwright/playwright-best-practices/testing-patterns/accessibility.md +0 -359
  141. package/skills/playwright/playwright-best-practices/testing-patterns/api-testing.md +0 -719
  142. package/skills/playwright/playwright-best-practices/testing-patterns/browser-extensions.md +0 -506
  143. package/skills/playwright/playwright-best-practices/testing-patterns/canvas-webgl.md +0 -493
  144. package/skills/playwright/playwright-best-practices/testing-patterns/component-testing.md +0 -500
  145. package/skills/playwright/playwright-best-practices/testing-patterns/drag-drop.md +0 -576
  146. package/skills/playwright/playwright-best-practices/testing-patterns/electron.md +0 -509
  147. package/skills/playwright/playwright-best-practices/testing-patterns/file-operations.md +0 -377
  148. package/skills/playwright/playwright-best-practices/testing-patterns/file-upload-download.md +0 -562
  149. package/skills/playwright/playwright-best-practices/testing-patterns/forms-validation.md +0 -561
  150. package/skills/playwright/playwright-best-practices/testing-patterns/graphql-testing.md +0 -331
  151. package/skills/playwright/playwright-best-practices/testing-patterns/i18n.md +0 -508
  152. package/skills/playwright/playwright-best-practices/testing-patterns/performance-testing.md +0 -476
  153. package/skills/playwright/playwright-best-practices/testing-patterns/security-testing.md +0 -430
  154. package/skills/playwright/playwright-best-practices/testing-patterns/visual-regression.md +0 -634
  155. package/skills/playwright/playwright-cli/SKILL.md +0 -489
  156. package/skills/playwright/playwright-cli/references/element-attributes.md +0 -23
  157. package/skills/playwright/playwright-cli/references/playwright-tests.md +0 -39
  158. package/skills/playwright/playwright-cli/references/pr-attachments.md +0 -60
  159. package/skills/playwright/playwright-cli/references/request-mocking.md +0 -87
  160. package/skills/playwright/playwright-cli/references/running-code.md +0 -245
  161. package/skills/playwright/playwright-cli/references/session-management.md +0 -227
  162. package/skills/playwright/playwright-cli/references/storage-state.md +0 -275
  163. package/skills/playwright/playwright-cli/references/test-generation.md +0 -433
  164. package/skills/playwright/playwright-cli/references/tracing.md +0 -139
  165. package/skills/playwright/playwright-cli/references/video-recording.md +0 -216
  166. package/skills/skills.lock.json +0 -89
  167. package/skills/skills.yaml +0 -35
  168. /package/skills/{testomatio/explorbot → explorbot}/explorbot-fundamentals/SKILL.md +0 -0
  169. /package/skills/{testomatio/explorbot → explorbot}/explorbot-fundamentals/references/no-install.md +0 -0
  170. /package/skills/{testomatio/explorbot → explorbot}/explorbot-plan/SKILL.md +0 -0
  171. /package/skills/{testomatio/explorbot → explorbot}/explorbot-setup/SKILL.md +0 -0
  172. /package/skills/{testomatio/explorbot → explorbot}/prima/SKILL.md +0 -0
  173. /package/skills/{testomatio/qa-process → qa-process}/qa-lead-strategy-advisor/SKILL.md +0 -0
  174. /package/skills/{testomatio/qa-process → qa-process}/qa-lead-strategy-advisor/references/output-format.md +0 -0
  175. /package/skills/{testomatio/qa-process → qa-process}/qa-review-pr/SKILL.md +0 -0
  176. /package/skills/{testomatio/qa-process → qa-process}/testing-workflow/SKILL.md +0 -0
  177. /package/skills/{testomatio/requirements → requirements}/catalog-features/SKILL.md +0 -0
  178. /package/skills/{testomatio/requirements → requirements}/catalog-features/references/layout.md +0 -0
  179. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/SKILL.md +0 -0
  180. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/references/features.md +0 -0
  181. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/references/layout.md +0 -0
  182. /package/skills/{testomatio/requirements → requirements}/pull-request-diff-analyzer/SKILL.md +0 -0
  183. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/SKILL.md +0 -0
  184. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/references/answer-shapes.md +0 -0
  185. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/references/examples.md +0 -0
  186. /package/skills/{testomatio/requirements → requirements}/qa-pr-requirements-analyzer/SKILL.md +0 -0
  187. /package/skills/{testomatio/requirements → requirements}/qa-pr-requirements-analyzer/references/summary-example.md +0 -0
  188. /package/skills/{testomatio/requirements → requirements}/qa-requirement-reviewer/SKILL.md +0 -0
  189. /package/skills/{testomatio/requirements → requirements}/qa-requirement-reviewer/references/requirements_reviewer_examples.md +0 -0
  190. /package/skills/{testomatio/requirements → requirements}/qa-thinking/SKILL.md +0 -0
  191. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/SKILL.md +0 -0
  192. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/references/behaviors.md +0 -0
  193. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/references/layout.md +0 -0
  194. /package/skills/{testomatio/requirements → requirements}/write-user-story/SKILL.md +0 -0
  195. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/CLAUDE.md +0 -0
  196. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/SKILL.md +0 -0
  197. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/CODECEPTJS_BEST_PRACTICES.md +0 -0
  198. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/FINAL_SUMMARY_TEMPLATE.md +0 -0
  199. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/PLAYWRIGHT_BEST_PRACTICES.md +0 -0
  200. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/POM_BEST_PRACTICES.md +0 -0
  201. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/TEST_DATA_MANAGEMENT.md +0 -0
  202. /package/skills/{testomatio/test-automation → test-automation}/debug-fix-failed-flaky-autotests/SKILL.md +0 -0
  203. /package/skills/{testomatio/test-automation → test-automation}/debug-fix-failed-flaky-autotests/references/DEBUGGING_QUICK_REFERENCE.md +0 -0
  204. /package/skills/{testomatio/test-automation → test-automation}/epic-requirements-specification/SKILL.md +0 -0
  205. /package/skills/{testomatio/test-automation → test-automation}/qa-automation-test-consolidation/SKILL.md +0 -0
  206. /package/skills/{testomatio/test-automation → test-automation}/qa-data-seeder/SKILL.md +0 -0
  207. /package/skills/{testomatio/test-automation → test-automation}/run-tests-with-testomatio-reporter/SKILL.md +0 -0
  208. /package/skills/{testomatio/test-automation → test-automation}/setup-change-aware-pr-testing/SKILL.md +0 -0
  209. /package/skills/{testomatio/test-automation → test-automation}/setup-ci-automation/SKILL.md +0 -0
  210. /package/skills/{testomatio/test-automation → test-automation}/testomat-allure-adapter/SKILL.md +0 -0
  211. /package/skills/{testomatio/test-management → test-management}/detect-duplicate-test-cases/SKILL.md +0 -0
  212. /package/skills/{testomatio/test-management → test-management}/detect-duplicate-test-cases/references/DUPLICATE_INSTRUCTIONS.md +0 -0
  213. /package/skills/{testomatio/test-management → test-management}/detect-useless-tests/SKILL.md +0 -0
  214. /package/skills/{testomatio/test-management → test-management}/improve-test-cases/SKILL.md +0 -0
  215. /package/skills/{testomatio/test-management → test-management}/improve-test-cases/references/TESTOMAT_MARKDOWN_EXAMPLE.md +0 -0
  216. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/SKILL.md +0 -0
  217. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/CSV_MIGRATION.md +0 -0
  218. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/CUSTOM_MIGRATION.md +0 -0
  219. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/TESTMO_MIGRATION.md +0 -0
  220. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/TESTRAIL_MIGRATION.md +0 -0
  221. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/XRAY_MIGRATION.md +0 -0
  222. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/SKILL.md +0 -0
  223. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_ARTIFACTS.md +0 -0
  224. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_HTML_REPORT.md +0 -0
  225. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_REPORTERS_CONFIG.md +0 -0
  226. /package/skills/{testomatio/test-management → test-management}/qa-split-testing-levels-pyramid/SKILL.md +0 -0
  227. /package/skills/{testomatio/test-management → test-management}/qa-sprint-report-by-testomatio/SKILL.md +0 -0
  228. /package/skills/{testomatio/test-management → test-management}/qa-sprint-report-by-testomatio/references/qa-sprint-report.md +0 -0
  229. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/SKILL.md +0 -0
  230. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/references/COVERAGE_FILE_FORMAT.md +0 -0
  231. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/references/E2E_FRAMEWORKS.md +0 -0
  232. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/scripts/check-coverage.mjs +0 -0
  233. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/SKILL.md +0 -0
  234. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/test-case-format.md +0 -0
  235. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/testomat-tms-guide.md +0 -0
  236. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/writing-rule.md +0 -0
  237. /package/skills/{testomatio/test-management → test-management}/scan-automation-project/SKILL.md +0 -0
  238. /package/skills/{testomatio/test-management → test-management}/sync-test-cases-with-tms/SKILL.md +0 -0
  239. /package/skills/{testomatio/test-management → test-management}/sync-test-cases-with-tms/references/TESTOMATIO_CLI.md +0 -0
  240. /package/skills/{testomatio/test-management → test-management}/testomatio-mcp/SKILL.md +0 -0
  241. /package/skills/{testomatio/test-management → test-management}/testomatio-mcp/references/MCP_SETUP.md +0 -0
@@ -1,391 +0,0 @@
1
- # Browser APIs: Geolocation, Permissions & More
2
-
3
- ## Table of Contents
4
-
5
- 1. [Geolocation](#geolocation)
6
- 2. [Permissions](#permissions)
7
- 3. [Clipboard](#clipboard)
8
- 4. [Notifications](#notifications)
9
- 5. [Camera & Microphone](#camera--microphone)
10
-
11
- ## Geolocation
12
-
13
- ### Mock Location
14
-
15
- ```typescript
16
- test("shows nearby stores", async ({ context }) => {
17
- // Grant permission and set location
18
- await context.grantPermissions(["geolocation"]);
19
- await context.setGeolocation({ latitude: 37.7749, longitude: -122.4194 }); // San Francisco
20
-
21
- const page = await context.newPage();
22
- await page.goto("/store-finder");
23
- await page.getByRole("button", { name: "Find Nearby" }).click();
24
-
25
- await expect(page.getByText("San Francisco")).toBeVisible();
26
- });
27
- ```
28
-
29
- ### Geolocation Fixture
30
-
31
- ```typescript
32
- // fixtures/geolocation.fixture.ts
33
- import { test as base } from "@playwright/test";
34
-
35
- type Coordinates = { latitude: number; longitude: number; accuracy?: number };
36
-
37
- type GeoFixtures = {
38
- setLocation: (coords: Coordinates) => Promise<void>;
39
- };
40
-
41
- export const test = base.extend<GeoFixtures>({
42
- setLocation: async ({ context }, use) => {
43
- await context.grantPermissions(["geolocation"]);
44
-
45
- await use(async (coords) => {
46
- await context.setGeolocation({
47
- latitude: coords.latitude,
48
- longitude: coords.longitude,
49
- accuracy: coords.accuracy ?? 100,
50
- });
51
- });
52
- },
53
- });
54
-
55
- // Usage
56
- test("delivery zone check", async ({ page, setLocation }) => {
57
- await setLocation({ latitude: 40.7128, longitude: -74.006 }); // NYC
58
-
59
- await page.goto("/delivery");
60
-
61
- await expect(page.getByText("Delivery available")).toBeVisible();
62
- });
63
- ```
64
-
65
- ### Test Location Changes
66
-
67
- ```typescript
68
- test("tracks location updates", async ({ context }) => {
69
- await context.grantPermissions(["geolocation"]);
70
-
71
- const page = await context.newPage();
72
- await page.goto("/tracking");
73
-
74
- // Initial location
75
- await context.setGeolocation({ latitude: 37.7749, longitude: -122.4194 });
76
- await page.getByRole("button", { name: "Start Tracking" }).click();
77
-
78
- await expect(page.getByTestId("location")).toContainText("37.7749");
79
-
80
- // Move to new location
81
- await context.setGeolocation({ latitude: 37.8044, longitude: -122.2712 });
82
-
83
- // Trigger location update
84
- await page.evaluate(() => {
85
- navigator.geolocation.getCurrentPosition(() => {});
86
- });
87
-
88
- await expect(page.getByTestId("location")).toContainText("37.8044");
89
- });
90
- ```
91
-
92
- ### Test Geolocation Denial
93
-
94
- ```typescript
95
- test("handles location denied", async ({ browser }) => {
96
- // Create context without geolocation permission
97
- const context = await browser.newContext({
98
- permissions: [], // No permissions
99
- });
100
-
101
- const page = await context.newPage();
102
- await page.goto("/store-finder");
103
- await page.getByRole("button", { name: "Find Nearby" }).click();
104
-
105
- await expect(page.getByText("Location access denied")).toBeVisible();
106
- await expect(page.getByLabel("Enter ZIP code")).toBeVisible();
107
-
108
- await context.close();
109
- });
110
- ```
111
-
112
- ## Permissions
113
-
114
- ### Grant Permissions
115
-
116
- ```typescript
117
- test("notifications with permission", async ({ context }) => {
118
- await context.grantPermissions(["notifications"]);
119
-
120
- const page = await context.newPage();
121
- await page.goto("/alerts");
122
-
123
- // Notification API should work
124
- const permission = await page.evaluate(() => Notification.permission);
125
- expect(permission).toBe("granted");
126
- });
127
- ```
128
-
129
- ### Test Permission Denied
130
-
131
- ```typescript
132
- test("handles notification permission denied", async ({ browser }) => {
133
- const context = await browser.newContext({
134
- permissions: [], // Deny all
135
- });
136
-
137
- const page = await context.newPage();
138
- await page.goto("/notifications");
139
-
140
- await page.getByRole("button", { name: "Enable Notifications" }).click();
141
-
142
- await expect(page.getByText("Please enable notifications")).toBeVisible();
143
-
144
- await context.close();
145
- });
146
- ```
147
-
148
- ### Multiple Permissions
149
-
150
- ```typescript
151
- test("video call with permissions", async ({ context }) => {
152
- await context.grantPermissions(["camera", "microphone", "notifications"]);
153
-
154
- const page = await context.newPage();
155
- await page.goto("/video-call");
156
-
157
- // All permissions should be granted
158
- const permissions = await page.evaluate(async () => ({
159
- camera: await navigator.permissions.query({
160
- name: "camera" as PermissionName,
161
- }),
162
- microphone: await navigator.permissions.query({
163
- name: "microphone" as PermissionName,
164
- }),
165
- }));
166
-
167
- expect(permissions.camera.state).toBe("granted");
168
- expect(permissions.microphone.state).toBe("granted");
169
- });
170
- ```
171
-
172
- ## Clipboard
173
-
174
- ### Test Copy to Clipboard
175
-
176
- ```typescript
177
- test("copy button works", async ({ page, context }) => {
178
- // Grant clipboard permissions
179
- await context.grantPermissions(["clipboard-read", "clipboard-write"]);
180
-
181
- await page.goto("/share");
182
-
183
- await page.getByRole("button", { name: "Copy Link" }).click();
184
-
185
- // Read clipboard content
186
- const clipboardContent = await page.evaluate(() =>
187
- navigator.clipboard.readText(),
188
- );
189
-
190
- expect(clipboardContent).toContain("https://example.com/share/");
191
- });
192
- ```
193
-
194
- ### Test Paste from Clipboard
195
-
196
- ```typescript
197
- test("paste from clipboard", async ({ page, context }) => {
198
- await context.grantPermissions(["clipboard-read", "clipboard-write"]);
199
-
200
- await page.goto("/editor");
201
-
202
- // Write to clipboard
203
- await page.evaluate(() => navigator.clipboard.writeText("Pasted content"));
204
-
205
- // Trigger paste
206
- await page.getByLabel("Content").focus();
207
- await page.keyboard.press("Control+V");
208
-
209
- await expect(page.getByLabel("Content")).toHaveValue("Pasted content");
210
- });
211
- ```
212
-
213
- ### Clipboard Fixture
214
-
215
- ```typescript
216
- // fixtures/clipboard.fixture.ts
217
- import { test as base } from "@playwright/test";
218
-
219
- type ClipboardFixtures = {
220
- clipboard: {
221
- write: (text: string) => Promise<void>;
222
- read: () => Promise<string>;
223
- };
224
- };
225
-
226
- export const test = base.extend<ClipboardFixtures>({
227
- clipboard: async ({ page, context }, use) => {
228
- await context.grantPermissions(["clipboard-read", "clipboard-write"]);
229
-
230
- await use({
231
- write: async (text) => {
232
- await page.evaluate((t) => navigator.clipboard.writeText(t), text);
233
- },
234
- read: async () => {
235
- return page.evaluate(() => navigator.clipboard.readText());
236
- },
237
- });
238
- },
239
- });
240
- ```
241
-
242
- ## Notifications
243
-
244
- ### Mock Notification API
245
-
246
- ```typescript
247
- test("shows browser notification", async ({ page }) => {
248
- const notifications: any[] = [];
249
-
250
- // Mock Notification constructor
251
- await page.addInitScript(() => {
252
- (window as any).__notifications = [];
253
- (window as any).Notification = class {
254
- constructor(title: string, options?: NotificationOptions) {
255
- (window as any).__notifications.push({ title, ...options });
256
- }
257
- static permission = "granted";
258
- static requestPermission = async () => "granted";
259
- };
260
- });
261
-
262
- await page.goto("/alerts");
263
- await page.getByRole("button", { name: "Notify Me" }).click();
264
-
265
- // Check notification was created
266
- const created = await page.evaluate(() => (window as any).__notifications);
267
- expect(created).toHaveLength(1);
268
- expect(created[0].title).toBe("New Alert");
269
- });
270
- ```
271
-
272
- ### Test Notification Click
273
-
274
- ```typescript
275
- test("notification click handler", async ({ page }) => {
276
- await page.addInitScript(() => {
277
- (window as any).Notification = class {
278
- onclick: (() => void) | null = null;
279
- constructor(title: string) {
280
- // Simulate click after creation
281
- setTimeout(() => this.onclick?.(), 100);
282
- }
283
- static permission = "granted";
284
- static requestPermission = async () => "granted";
285
- };
286
- });
287
-
288
- await page.goto("/messages");
289
- await page.evaluate(() => {
290
- new Notification("New Message");
291
- });
292
-
293
- // Should navigate to messages when notification clicked
294
- await expect(page).toHaveURL(/\/messages/);
295
- });
296
- ```
297
-
298
- ## Camera & Microphone
299
-
300
- ### Mock Media Devices
301
-
302
- ```typescript
303
- test("video preview works", async ({ page, context }) => {
304
- await context.grantPermissions(["camera"]);
305
-
306
- // Mock getUserMedia
307
- await page.addInitScript(() => {
308
- navigator.mediaDevices.getUserMedia = async () => {
309
- const canvas = document.createElement("canvas");
310
- canvas.width = 640;
311
- canvas.height = 480;
312
- return canvas.captureStream();
313
- };
314
- });
315
-
316
- await page.goto("/video-settings");
317
- await page.getByRole("button", { name: "Start Camera" }).click();
318
-
319
- await expect(page.getByTestId("video-preview")).toBeVisible();
320
- });
321
- ```
322
-
323
- ### Test Media Device Selection
324
-
325
- ```typescript
326
- test("switch camera", async ({ page }) => {
327
- await page.addInitScript(() => {
328
- navigator.mediaDevices.enumerateDevices = async () =>
329
- [
330
- {
331
- deviceId: "cam1",
332
- kind: "videoinput",
333
- label: "Front Camera",
334
- groupId: "1",
335
- },
336
- {
337
- deviceId: "cam2",
338
- kind: "videoinput",
339
- label: "Back Camera",
340
- groupId: "2",
341
- },
342
- ] as MediaDeviceInfo[];
343
-
344
- navigator.mediaDevices.getUserMedia = async () => {
345
- const canvas = document.createElement("canvas");
346
- return canvas.captureStream();
347
- };
348
- });
349
-
350
- await page.goto("/camera");
351
-
352
- // Should show camera options
353
- await expect(page.getByRole("combobox", { name: "Camera" })).toBeVisible();
354
- await expect(page.getByText("Front Camera")).toBeVisible();
355
- await expect(page.getByText("Back Camera")).toBeVisible();
356
- });
357
- ```
358
-
359
- ### Test Media Errors
360
-
361
- ```typescript
362
- test("handles camera access error", async ({ page }) => {
363
- await page.addInitScript(() => {
364
- navigator.mediaDevices.getUserMedia = async () => {
365
- throw new DOMException("Permission denied", "NotAllowedError");
366
- };
367
- });
368
-
369
- await page.goto("/video-call");
370
- await page.getByRole("button", { name: "Join Call" }).click();
371
-
372
- await expect(page.getByText("Camera access denied")).toBeVisible();
373
- await expect(
374
- page.getByRole("button", { name: "Join Audio Only" }),
375
- ).toBeVisible();
376
- });
377
- ```
378
-
379
- ## Anti-Patterns to Avoid
380
-
381
- | Anti-Pattern | Problem | Solution |
382
- | ----------------------------- | --------------------------------- | ----------------------------------- |
383
- | Not granting permissions | Tests fail with permission errors | Use `context.grantPermissions()` |
384
- | Testing real geolocation | Flaky, environment-dependent | Mock with `setGeolocation()` |
385
- | Not testing permission denial | Misses error handling | Test both granted and denied states |
386
- | Using real camera/mic | CI has no devices | Mock `getUserMedia` |
387
-
388
- ## Related References
389
-
390
- - **Fixtures**: See [fixtures-hooks.md](../core/fixtures-hooks.md) for context fixtures
391
- - **Mobile**: See [mobile-testing.md](../advanced/mobile-testing.md) for device emulation