testeiya 0.10.1 → 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 (225) hide show
  1. package/README.md +7 -19
  2. package/dist/prompt/clis.d.ts +7 -0
  3. package/dist/prompt/pipeline-report.d.ts +1 -0
  4. package/dist/prompt/report.d.ts +10 -0
  5. package/dist/prompt/system-prompt.d.ts +22 -0
  6. package/dist/prompt/testomat.io.d.ts +19 -0
  7. package/dist/prompt/thread.d.ts +73 -0
  8. package/dist/src/args.d.ts +39 -0
  9. package/dist/src/attribution-extension.d.ts +3 -0
  10. package/dist/src/checkpoint.d.ts +30 -0
  11. package/dist/src/cli.d.ts +2 -0
  12. package/dist/src/cli.js +27 -32
  13. package/dist/src/cli.js.map +1 -1
  14. package/dist/src/doctor.d.ts +11 -0
  15. package/dist/src/env.d.ts +30 -0
  16. package/dist/src/exec.d.ts +11 -0
  17. package/dist/src/git.d.ts +41 -0
  18. package/dist/src/langfuse-extension.d.ts +7 -0
  19. package/dist/src/langfuse.d.ts +67 -0
  20. package/dist/src/mcp.d.ts +19 -0
  21. package/dist/src/model.d.ts +20 -0
  22. package/dist/src/models.d.ts +1 -0
  23. package/dist/src/output.d.ts +84 -0
  24. package/dist/src/pipeline/command-stage.d.ts +12 -0
  25. package/dist/src/pipeline/crash-guard.d.ts +12 -0
  26. package/dist/src/pipeline/crash-guard.js +21 -0
  27. package/dist/src/pipeline/crash-guard.js.map +1 -0
  28. package/dist/src/pipeline/diagram.d.ts +24 -0
  29. package/dist/src/pipeline/gate.d.ts +21 -0
  30. package/dist/src/pipeline/launcher.d.ts +33 -0
  31. package/dist/src/pipeline/launcher.js +16 -3
  32. package/dist/src/pipeline/launcher.js.map +1 -1
  33. package/dist/src/pipeline/log.d.ts +29 -0
  34. package/dist/src/pipeline/log.js +9 -0
  35. package/dist/src/pipeline/log.js.map +1 -1
  36. package/dist/src/pipeline/overlay.d.ts +29 -0
  37. package/dist/src/pipeline/pipeline-file.d.ts +44 -0
  38. package/dist/src/pipeline/pipeline.d.ts +78 -0
  39. package/dist/src/pipeline/pipeline.js +22 -0
  40. package/dist/src/pipeline/pipeline.js.map +1 -1
  41. package/dist/src/pipeline/report.d.ts +26 -0
  42. package/dist/src/pipeline/report.js +13 -0
  43. package/dist/src/pipeline/report.js.map +1 -1
  44. package/dist/src/pipeline/spec.d.ts +63 -0
  45. package/dist/src/pipeline/stage-env.d.ts +13 -0
  46. package/dist/src/pipeline/stage-env.js +31 -0
  47. package/dist/src/pipeline/stage-env.js.map +1 -0
  48. package/dist/src/pipeline/stage.d.ts +71 -0
  49. package/dist/src/pipeline/stage.js.map +1 -1
  50. package/dist/src/pipeline/state.d.ts +63 -0
  51. package/dist/src/pipeline/summary-stage.d.ts +24 -0
  52. package/dist/src/pipeline/task-stage.d.ts +24 -0
  53. package/dist/src/pipeline/task-stage.js +86 -2
  54. package/dist/src/pipeline/task-stage.js.map +1 -1
  55. package/dist/src/pipeline/variables.d.ts +20 -0
  56. package/dist/src/result.d.ts +6 -0
  57. package/dist/src/run.d.ts +69 -0
  58. package/dist/src/run.js +116 -60
  59. package/dist/src/run.js.map +1 -1
  60. package/dist/src/session.d.ts +43 -0
  61. package/dist/src/sessions.d.ts +23 -0
  62. package/dist/src/skills.d.ts +29 -0
  63. package/package.json +11 -2
  64. package/pipelines/api-testing.yml +1 -1
  65. package/scripts/vendor-skills.js +62 -0
  66. package/skills/codeceptjs/ci-fix-tests/SKILL.md +0 -119
  67. package/skills/codeceptjs/codeceptjs-auth/SKILL.md +0 -141
  68. package/skills/codeceptjs/codeceptjs-exploration/SKILL.md +0 -100
  69. package/skills/codeceptjs/codeceptjs-fundamentals/SKILL.md +0 -196
  70. package/skills/codeceptjs/codeceptjs-run-analysis/SKILL.md +0 -83
  71. package/skills/codeceptjs/debugging-codeceptjs-tests/SKILL.md +0 -126
  72. package/skills/codeceptjs/lint-codeceptjs-tests/SKILL.md +0 -104
  73. package/skills/codeceptjs/migrate-codeceptjs-4/SKILL.md +0 -109
  74. package/skills/codeceptjs/migrate-cypress-to-codeceptjs/SKILL.md +0 -295
  75. package/skills/codeceptjs/migrate-protractor-to-codeceptjs/SKILL.md +0 -339
  76. package/skills/codeceptjs/migrate-selenium-java-to-codeceptjs/SKILL.md +0 -459
  77. package/skills/codeceptjs/migrate-testcafe-to-codeceptjs/SKILL.md +0 -338
  78. package/skills/codeceptjs/refactoring-codeceptjs-tests/SKILL.md +0 -78
  79. package/skills/codeceptjs/writing-codeceptjs-tests/SKILL.md +0 -102
  80. package/skills/playwright/playwright-best-practices/SKILL.md +0 -303
  81. package/skills/playwright/playwright-best-practices/advanced/authentication-flows.md +0 -360
  82. package/skills/playwright/playwright-best-practices/advanced/authentication.md +0 -871
  83. package/skills/playwright/playwright-best-practices/advanced/clock-mocking.md +0 -364
  84. package/skills/playwright/playwright-best-practices/advanced/mobile-testing.md +0 -409
  85. package/skills/playwright/playwright-best-practices/advanced/multi-context.md +0 -288
  86. package/skills/playwright/playwright-best-practices/advanced/multi-user.md +0 -393
  87. package/skills/playwright/playwright-best-practices/advanced/network-advanced.md +0 -452
  88. package/skills/playwright/playwright-best-practices/advanced/third-party.md +0 -464
  89. package/skills/playwright/playwright-best-practices/architecture/pom-vs-fixtures.md +0 -363
  90. package/skills/playwright/playwright-best-practices/architecture/test-architecture.md +0 -369
  91. package/skills/playwright/playwright-best-practices/architecture/when-to-mock.md +0 -383
  92. package/skills/playwright/playwright-best-practices/browser-apis/browser-apis.md +0 -391
  93. package/skills/playwright/playwright-best-practices/browser-apis/iframes.md +0 -403
  94. package/skills/playwright/playwright-best-practices/browser-apis/service-workers.md +0 -504
  95. package/skills/playwright/playwright-best-practices/browser-apis/websockets.md +0 -403
  96. package/skills/playwright/playwright-best-practices/core/annotations.md +0 -424
  97. package/skills/playwright/playwright-best-practices/core/assertions-waiting.md +0 -361
  98. package/skills/playwright/playwright-best-practices/core/configuration.md +0 -452
  99. package/skills/playwright/playwright-best-practices/core/fixtures-hooks.md +0 -417
  100. package/skills/playwright/playwright-best-practices/core/global-setup.md +0 -434
  101. package/skills/playwright/playwright-best-practices/core/locators.md +0 -242
  102. package/skills/playwright/playwright-best-practices/core/page-object-model.md +0 -315
  103. package/skills/playwright/playwright-best-practices/core/projects-dependencies.md +0 -453
  104. package/skills/playwright/playwright-best-practices/core/test-data.md +0 -492
  105. package/skills/playwright/playwright-best-practices/core/test-suite-structure.md +0 -361
  106. package/skills/playwright/playwright-best-practices/core/test-tags.md +0 -298
  107. package/skills/playwright/playwright-best-practices/debugging/console-errors.md +0 -420
  108. package/skills/playwright/playwright-best-practices/debugging/debugging.md +0 -504
  109. package/skills/playwright/playwright-best-practices/debugging/error-testing.md +0 -360
  110. package/skills/playwright/playwright-best-practices/debugging/flaky-tests.md +0 -496
  111. package/skills/playwright/playwright-best-practices/frameworks/angular.md +0 -530
  112. package/skills/playwright/playwright-best-practices/frameworks/nextjs.md +0 -469
  113. package/skills/playwright/playwright-best-practices/frameworks/react.md +0 -531
  114. package/skills/playwright/playwright-best-practices/frameworks/vue.md +0 -574
  115. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/ci-cd.md +0 -468
  116. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/docker.md +0 -283
  117. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/github-actions.md +0 -546
  118. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/gitlab.md +0 -397
  119. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/other-providers.md +0 -521
  120. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/parallel-sharding.md +0 -371
  121. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/performance.md +0 -453
  122. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/reporting.md +0 -424
  123. package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/test-coverage.md +0 -497
  124. package/skills/playwright/playwright-best-practices/testing-patterns/accessibility.md +0 -359
  125. package/skills/playwright/playwright-best-practices/testing-patterns/api-testing.md +0 -719
  126. package/skills/playwright/playwright-best-practices/testing-patterns/browser-extensions.md +0 -506
  127. package/skills/playwright/playwright-best-practices/testing-patterns/canvas-webgl.md +0 -493
  128. package/skills/playwright/playwright-best-practices/testing-patterns/component-testing.md +0 -500
  129. package/skills/playwright/playwright-best-practices/testing-patterns/drag-drop.md +0 -576
  130. package/skills/playwright/playwright-best-practices/testing-patterns/electron.md +0 -509
  131. package/skills/playwright/playwright-best-practices/testing-patterns/file-operations.md +0 -377
  132. package/skills/playwright/playwright-best-practices/testing-patterns/file-upload-download.md +0 -562
  133. package/skills/playwright/playwright-best-practices/testing-patterns/forms-validation.md +0 -561
  134. package/skills/playwright/playwright-best-practices/testing-patterns/graphql-testing.md +0 -331
  135. package/skills/playwright/playwright-best-practices/testing-patterns/i18n.md +0 -508
  136. package/skills/playwright/playwright-best-practices/testing-patterns/performance-testing.md +0 -476
  137. package/skills/playwright/playwright-best-practices/testing-patterns/security-testing.md +0 -430
  138. package/skills/playwright/playwright-best-practices/testing-patterns/visual-regression.md +0 -634
  139. package/skills/playwright/playwright-cli/SKILL.md +0 -489
  140. package/skills/playwright/playwright-cli/references/element-attributes.md +0 -23
  141. package/skills/playwright/playwright-cli/references/playwright-tests.md +0 -39
  142. package/skills/playwright/playwright-cli/references/pr-attachments.md +0 -60
  143. package/skills/playwright/playwright-cli/references/request-mocking.md +0 -87
  144. package/skills/playwright/playwright-cli/references/running-code.md +0 -245
  145. package/skills/playwright/playwright-cli/references/session-management.md +0 -227
  146. package/skills/playwright/playwright-cli/references/storage-state.md +0 -275
  147. package/skills/playwright/playwright-cli/references/test-generation.md +0 -433
  148. package/skills/playwright/playwright-cli/references/tracing.md +0 -139
  149. package/skills/playwright/playwright-cli/references/video-recording.md +0 -216
  150. package/skills/skills.lock.json +0 -89
  151. package/skills/skills.yaml +0 -35
  152. /package/skills/{testomatio/explorbot → explorbot}/explorbot-fundamentals/SKILL.md +0 -0
  153. /package/skills/{testomatio/explorbot → explorbot}/explorbot-fundamentals/references/no-install.md +0 -0
  154. /package/skills/{testomatio/explorbot → explorbot}/explorbot-plan/SKILL.md +0 -0
  155. /package/skills/{testomatio/explorbot → explorbot}/explorbot-setup/SKILL.md +0 -0
  156. /package/skills/{testomatio/explorbot → explorbot}/prima/SKILL.md +0 -0
  157. /package/skills/{testomatio/qa-process → qa-process}/qa-lead-strategy-advisor/SKILL.md +0 -0
  158. /package/skills/{testomatio/qa-process → qa-process}/qa-lead-strategy-advisor/references/output-format.md +0 -0
  159. /package/skills/{testomatio/qa-process → qa-process}/qa-review-pr/SKILL.md +0 -0
  160. /package/skills/{testomatio/qa-process → qa-process}/testing-workflow/SKILL.md +0 -0
  161. /package/skills/{testomatio/requirements → requirements}/catalog-features/SKILL.md +0 -0
  162. /package/skills/{testomatio/requirements → requirements}/catalog-features/references/layout.md +0 -0
  163. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/SKILL.md +0 -0
  164. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/references/features.md +0 -0
  165. /package/skills/{testomatio/requirements → requirements}/detect-product-mismatches/references/layout.md +0 -0
  166. /package/skills/{testomatio/requirements → requirements}/pull-request-diff-analyzer/SKILL.md +0 -0
  167. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/SKILL.md +0 -0
  168. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/references/answer-shapes.md +0 -0
  169. /package/skills/{testomatio/requirements → requirements}/qa-explain-behavior/references/examples.md +0 -0
  170. /package/skills/{testomatio/requirements → requirements}/qa-pr-requirements-analyzer/SKILL.md +0 -0
  171. /package/skills/{testomatio/requirements → requirements}/qa-pr-requirements-analyzer/references/summary-example.md +0 -0
  172. /package/skills/{testomatio/requirements → requirements}/qa-requirement-reviewer/SKILL.md +0 -0
  173. /package/skills/{testomatio/requirements → requirements}/qa-requirement-reviewer/references/requirements_reviewer_examples.md +0 -0
  174. /package/skills/{testomatio/requirements → requirements}/qa-thinking/SKILL.md +0 -0
  175. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/SKILL.md +0 -0
  176. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/references/behaviors.md +0 -0
  177. /package/skills/{testomatio/requirements → requirements}/wiki-from-code/references/layout.md +0 -0
  178. /package/skills/{testomatio/requirements → requirements}/write-user-story/SKILL.md +0 -0
  179. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/CLAUDE.md +0 -0
  180. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/SKILL.md +0 -0
  181. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/CODECEPTJS_BEST_PRACTICES.md +0 -0
  182. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/FINAL_SUMMARY_TEMPLATE.md +0 -0
  183. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/PLAYWRIGHT_BEST_PRACTICES.md +0 -0
  184. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/POM_BEST_PRACTICES.md +0 -0
  185. /package/skills/{testomatio/test-automation → test-automation}/automate-manual-test-cases/references/TEST_DATA_MANAGEMENT.md +0 -0
  186. /package/skills/{testomatio/test-automation → test-automation}/debug-fix-failed-flaky-autotests/SKILL.md +0 -0
  187. /package/skills/{testomatio/test-automation → test-automation}/debug-fix-failed-flaky-autotests/references/DEBUGGING_QUICK_REFERENCE.md +0 -0
  188. /package/skills/{testomatio/test-automation → test-automation}/epic-requirements-specification/SKILL.md +0 -0
  189. /package/skills/{testomatio/test-automation → test-automation}/qa-automation-test-consolidation/SKILL.md +0 -0
  190. /package/skills/{testomatio/test-automation → test-automation}/qa-data-seeder/SKILL.md +0 -0
  191. /package/skills/{testomatio/test-automation → test-automation}/run-tests-with-testomatio-reporter/SKILL.md +0 -0
  192. /package/skills/{testomatio/test-automation → test-automation}/setup-change-aware-pr-testing/SKILL.md +0 -0
  193. /package/skills/{testomatio/test-automation → test-automation}/setup-ci-automation/SKILL.md +0 -0
  194. /package/skills/{testomatio/test-automation → test-automation}/testomat-allure-adapter/SKILL.md +0 -0
  195. /package/skills/{testomatio/test-management → test-management}/detect-duplicate-test-cases/SKILL.md +0 -0
  196. /package/skills/{testomatio/test-management → test-management}/detect-duplicate-test-cases/references/DUPLICATE_INSTRUCTIONS.md +0 -0
  197. /package/skills/{testomatio/test-management → test-management}/detect-useless-tests/SKILL.md +0 -0
  198. /package/skills/{testomatio/test-management → test-management}/improve-test-cases/SKILL.md +0 -0
  199. /package/skills/{testomatio/test-management → test-management}/improve-test-cases/references/TESTOMAT_MARKDOWN_EXAMPLE.md +0 -0
  200. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/SKILL.md +0 -0
  201. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/CSV_MIGRATION.md +0 -0
  202. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/CUSTOM_MIGRATION.md +0 -0
  203. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/TESTMO_MIGRATION.md +0 -0
  204. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/TESTRAIL_MIGRATION.md +0 -0
  205. /package/skills/{testomatio/test-management → test-management}/migrate-to-testomatio/references/XRAY_MIGRATION.md +0 -0
  206. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/SKILL.md +0 -0
  207. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_ARTIFACTS.md +0 -0
  208. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_HTML_REPORT.md +0 -0
  209. /package/skills/{testomatio/test-management → test-management}/qa-e2e-tests-reporting/references/TESTOMATIO_REPORTERS_CONFIG.md +0 -0
  210. /package/skills/{testomatio/test-management → test-management}/qa-split-testing-levels-pyramid/SKILL.md +0 -0
  211. /package/skills/{testomatio/test-management → test-management}/qa-sprint-report-by-testomatio/SKILL.md +0 -0
  212. /package/skills/{testomatio/test-management → test-management}/qa-sprint-report-by-testomatio/references/qa-sprint-report.md +0 -0
  213. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/SKILL.md +0 -0
  214. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/references/COVERAGE_FILE_FORMAT.md +0 -0
  215. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/references/E2E_FRAMEWORKS.md +0 -0
  216. /package/skills/{testomatio/test-management → test-management}/qa-test-code-coverage/scripts/check-coverage.mjs +0 -0
  217. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/SKILL.md +0 -0
  218. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/test-case-format.md +0 -0
  219. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/testomat-tms-guide.md +0 -0
  220. /package/skills/{testomatio/test-management → test-management}/qa-write-test-cases/references/writing-rule.md +0 -0
  221. /package/skills/{testomatio/test-management → test-management}/scan-automation-project/SKILL.md +0 -0
  222. /package/skills/{testomatio/test-management → test-management}/sync-test-cases-with-tms/SKILL.md +0 -0
  223. /package/skills/{testomatio/test-management → test-management}/sync-test-cases-with-tms/references/TESTOMATIO_CLI.md +0 -0
  224. /package/skills/{testomatio/test-management → test-management}/testomatio-mcp/SKILL.md +0 -0
  225. /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