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,506 +0,0 @@
1
- # Browser Extension Testing
2
-
3
- ## Table of Contents
4
-
5
- 1. [Setup & Configuration](#setup--configuration)
6
- 2. [Loading Extensions](#loading-extensions)
7
- 3. [Popup Testing](#popup-testing)
8
- 4. [Background Script Testing](#background-script-testing)
9
- 5. [Content Script Testing](#content-script-testing)
10
- 6. [Extension APIs](#extension-apis)
11
- 7. [Cross-Browser Testing](#cross-browser-testing)
12
-
13
- ## Setup & Configuration
14
-
15
- ### Prerequisites
16
-
17
- ```bash
18
- npm install -D @playwright/test
19
- npx playwright install chromium # Extensions only work in Chromium
20
- ```
21
-
22
- ### Basic Configuration
23
-
24
- ```typescript
25
- // playwright.config.ts
26
- import { defineConfig } from "@playwright/test";
27
- import path from "path";
28
-
29
- export default defineConfig({
30
- testDir: "./tests",
31
- use: {
32
- // Extensions require non-headless Chromium
33
- headless: false,
34
- },
35
- projects: [
36
- {
37
- name: "chromium-extension",
38
- use: {
39
- browserName: "chromium",
40
- },
41
- },
42
- ],
43
- });
44
- ```
45
-
46
- ### Extension Fixture
47
-
48
- ```typescript
49
- // fixtures/extension.ts
50
- import { test as base, chromium, BrowserContext, Page } from "@playwright/test";
51
- import path from "path";
52
-
53
- type ExtensionFixtures = {
54
- context: BrowserContext;
55
- extensionId: string;
56
- backgroundPage: Page;
57
- };
58
-
59
- export const test = base.extend<ExtensionFixtures>({
60
- context: async ({}, use) => {
61
- const pathToExtension = path.join(__dirname, "../extension");
62
-
63
- const context = await chromium.launchPersistentContext("", {
64
- headless: false,
65
- args: [
66
- `--disable-extensions-except=${pathToExtension}`,
67
- `--load-extension=${pathToExtension}`,
68
- ],
69
- });
70
-
71
- await use(context);
72
- await context.close();
73
- },
74
-
75
- extensionId: async ({ context }, use) => {
76
- // Get extension ID from service worker URL
77
- let extensionId = "";
78
-
79
- // Wait for service worker to be registered
80
- const serviceWorker =
81
- context.serviceWorkers()[0] ||
82
- (await context.waitForEvent("serviceworker"));
83
-
84
- extensionId = serviceWorker.url().split("/")[2];
85
-
86
- await use(extensionId);
87
- },
88
-
89
- backgroundPage: async ({ context }, use) => {
90
- // For Manifest V2 extensions
91
- const backgroundPage =
92
- context.backgroundPages()[0] ||
93
- (await context.waitForEvent("backgroundpage"));
94
-
95
- await use(backgroundPage);
96
- },
97
- });
98
-
99
- export { expect } from "@playwright/test";
100
- ```
101
-
102
- ## Loading Extensions
103
-
104
- ### Manifest V3 (Service Worker)
105
-
106
- ```typescript
107
- test("load MV3 extension", async () => {
108
- const pathToExtension = path.join(__dirname, "../my-extension");
109
-
110
- const context = await chromium.launchPersistentContext("", {
111
- headless: false,
112
- args: [
113
- `--disable-extensions-except=${pathToExtension}`,
114
- `--load-extension=${pathToExtension}`,
115
- ],
116
- });
117
-
118
- // Wait for service worker
119
- const serviceWorker = await context.waitForEvent("serviceworker");
120
- expect(serviceWorker.url()).toContain("chrome-extension://");
121
-
122
- await context.close();
123
- });
124
- ```
125
-
126
- ### Manifest V2 (Background Page)
127
-
128
- ```typescript
129
- test("load MV2 extension", async () => {
130
- const pathToExtension = path.join(__dirname, "../my-extension-v2");
131
-
132
- const context = await chromium.launchPersistentContext("", {
133
- headless: false,
134
- args: [
135
- `--disable-extensions-except=${pathToExtension}`,
136
- `--load-extension=${pathToExtension}`,
137
- ],
138
- });
139
-
140
- // Wait for background page
141
- const backgroundPage = await context.waitForEvent("backgroundpage");
142
- expect(backgroundPage.url()).toContain("chrome-extension://");
143
-
144
- await context.close();
145
- });
146
- ```
147
-
148
- ### Multiple Extensions
149
-
150
- ```typescript
151
- test("load multiple extensions", async () => {
152
- const extension1 = path.join(__dirname, "../extension1");
153
- const extension2 = path.join(__dirname, "../extension2");
154
-
155
- const context = await chromium.launchPersistentContext("", {
156
- headless: false,
157
- args: [
158
- `--disable-extensions-except=${extension1},${extension2}`,
159
- `--load-extension=${extension1},${extension2}`,
160
- ],
161
- });
162
-
163
- // Both service workers should be available
164
- await context.waitForEvent("serviceworker");
165
- await context.waitForEvent("serviceworker");
166
-
167
- expect(context.serviceWorkers().length).toBe(2);
168
-
169
- await context.close();
170
- });
171
- ```
172
-
173
- ## Popup Testing
174
-
175
- ### Opening Extension Popup
176
-
177
- ```typescript
178
- test("test popup UI", async ({ context, extensionId }) => {
179
- // Open popup directly by URL
180
- const popupPage = await context.newPage();
181
- await popupPage.goto(`chrome-extension://${extensionId}/popup.html`);
182
-
183
- // Test popup interactions
184
- await expect(popupPage.getByRole("heading")).toHaveText("My Extension");
185
- await popupPage.getByRole("button", { name: "Enable" }).click();
186
- await expect(popupPage.getByText("Enabled")).toBeVisible();
187
- });
188
- ```
189
-
190
- ### Popup State Persistence
191
-
192
- ```typescript
193
- test("popup remembers state", async ({ context, extensionId }) => {
194
- // First interaction
195
- const popup1 = await context.newPage();
196
- await popup1.goto(`chrome-extension://${extensionId}/popup.html`);
197
- await popup1.getByRole("checkbox", { name: "Dark Mode" }).check();
198
- await popup1.close();
199
-
200
- // Reopen popup
201
- const popup2 = await context.newPage();
202
- await popup2.goto(`chrome-extension://${extensionId}/popup.html`);
203
-
204
- // State should persist
205
- await expect(
206
- popup2.getByRole("checkbox", { name: "Dark Mode" }),
207
- ).toBeChecked();
208
- });
209
- ```
210
-
211
- ### Popup Communication with Background
212
-
213
- ```typescript
214
- test("popup sends message to background", async ({ context, extensionId }) => {
215
- const popup = await context.newPage();
216
- await popup.goto(`chrome-extension://${extensionId}/popup.html`);
217
-
218
- // Set up listener for response
219
- const responsePromise = popup.evaluate(() => {
220
- return new Promise((resolve) => {
221
- chrome.runtime.onMessage.addListener((message) => {
222
- if (message.type === "RESPONSE") resolve(message.data);
223
- });
224
- });
225
- });
226
-
227
- // Click button that sends message
228
- await popup.getByRole("button", { name: "Fetch Data" }).click();
229
-
230
- // Verify response
231
- const response = await responsePromise;
232
- expect(response).toBeDefined();
233
- });
234
- ```
235
-
236
- ## Background Script Testing
237
-
238
- ### Manifest V3 Service Worker
239
-
240
- ```typescript
241
- test("service worker handles messages", async ({ context, extensionId }) => {
242
- const page = await context.newPage();
243
- await page.goto("https://example.com");
244
-
245
- // Send message to service worker from page
246
- const response = await page.evaluate(async (extId) => {
247
- return new Promise((resolve) => {
248
- chrome.runtime.sendMessage(extId, { type: "GET_STATUS" }, resolve);
249
- });
250
- }, extensionId);
251
-
252
- expect(response).toEqual({ status: "active" });
253
- });
254
- ```
255
-
256
- ### Testing Background Logic
257
-
258
- ```typescript
259
- test("background script logic", async ({ context }) => {
260
- const serviceWorker =
261
- context.serviceWorkers()[0] ||
262
- (await context.waitForEvent("serviceworker"));
263
-
264
- // Evaluate in service worker context
265
- const result = await serviceWorker.evaluate(async () => {
266
- // Access extension APIs
267
- const storage = await chrome.storage.local.get("settings");
268
- return storage;
269
- });
270
-
271
- expect(result.settings).toBeDefined();
272
- });
273
- ```
274
-
275
- ### Alarms and Timers
276
-
277
- ```typescript
278
- test("alarm triggers correctly", async ({ context }) => {
279
- const serviceWorker = await context.waitForEvent("serviceworker");
280
-
281
- // Create alarm
282
- await serviceWorker.evaluate(async () => {
283
- await chrome.alarms.create("test-alarm", { delayInMinutes: 0.01 });
284
- });
285
-
286
- // Wait for alarm handler
287
- await serviceWorker.evaluate(() => {
288
- return new Promise<void>((resolve) => {
289
- chrome.alarms.onAlarm.addListener((alarm) => {
290
- if (alarm.name === "test-alarm") resolve();
291
- });
292
- });
293
- });
294
-
295
- // Verify alarm was handled (check side effects)
296
- const wasHandled = await serviceWorker.evaluate(async () => {
297
- const { alarmTriggered } = await chrome.storage.local.get("alarmTriggered");
298
- return alarmTriggered;
299
- });
300
-
301
- expect(wasHandled).toBe(true);
302
- });
303
- ```
304
-
305
- ## Content Script Testing
306
-
307
- ### Injected Content Script
308
-
309
- ```typescript
310
- test("content script injects UI", async ({ context }) => {
311
- const page = await context.newPage();
312
- await page.goto("https://example.com");
313
-
314
- // Wait for content script to inject elements
315
- await expect(page.locator("#my-extension-widget")).toBeVisible();
316
-
317
- // Interact with injected UI
318
- await page.locator("#my-extension-widget button").click();
319
- await expect(page.locator("#my-extension-widget .result")).toHaveText(
320
- "Success",
321
- );
322
- });
323
- ```
324
-
325
- ### Content Script Communication
326
-
327
- ```typescript
328
- test("content script communicates with background", async ({
329
- context,
330
- extensionId,
331
- }) => {
332
- const page = await context.newPage();
333
- await page.goto("https://example.com");
334
-
335
- // Trigger content script action
336
- await page.locator("#my-extension-button").click();
337
-
338
- // Wait for background response reflected in UI
339
- await expect(page.locator("#my-extension-status")).toHaveText("Connected");
340
- });
341
- ```
342
-
343
- ### Page Modification Testing
344
-
345
- ```typescript
346
- test("content script modifies page", async ({ context }) => {
347
- const page = await context.newPage();
348
- await page.goto("https://example.com");
349
-
350
- // Verify content script modifications
351
- const hasModification = await page.evaluate(() => {
352
- // Check for injected styles
353
- const styles = document.querySelectorAll('style[data-extension="my-ext"]');
354
- return styles.length > 0;
355
- });
356
-
357
- expect(hasModification).toBe(true);
358
-
359
- // Check DOM modifications
360
- const modifiedElements = await page
361
- .locator("[data-modified-by-extension]")
362
- .count();
363
- expect(modifiedElements).toBeGreaterThan(0);
364
- });
365
- ```
366
-
367
- ## Extension APIs
368
-
369
- ### Storage API
370
-
371
- ```typescript
372
- test("chrome.storage operations", async ({ context }) => {
373
- const serviceWorker = await context.waitForEvent("serviceworker");
374
-
375
- // Set storage
376
- await serviceWorker.evaluate(async () => {
377
- await chrome.storage.local.set({ key: "value", count: 42 });
378
- });
379
-
380
- // Get storage
381
- const data = await serviceWorker.evaluate(async () => {
382
- return await chrome.storage.local.get(["key", "count"]);
383
- });
384
-
385
- expect(data).toEqual({ key: "value", count: 42 });
386
-
387
- // Test storage.sync
388
- await serviceWorker.evaluate(async () => {
389
- await chrome.storage.sync.set({ synced: true });
390
- });
391
-
392
- const syncData = await serviceWorker.evaluate(async () => {
393
- return await chrome.storage.sync.get("synced");
394
- });
395
-
396
- expect(syncData.synced).toBe(true);
397
- });
398
- ```
399
-
400
- ### Tabs API
401
-
402
- ```typescript
403
- test("chrome.tabs operations", async ({ context }) => {
404
- const serviceWorker = await context.waitForEvent("serviceworker");
405
-
406
- // Create a tab
407
- const page = await context.newPage();
408
- await page.goto("https://example.com");
409
-
410
- // Query tabs from service worker
411
- const tabs = await serviceWorker.evaluate(async () => {
412
- return await chrome.tabs.query({ url: "*://example.com/*" });
413
- });
414
-
415
- expect(tabs.length).toBeGreaterThan(0);
416
- expect(tabs[0].url).toContain("example.com");
417
-
418
- // Send message to tab
419
- await serviceWorker.evaluate(async (tabId) => {
420
- await chrome.tabs.sendMessage(tabId, { type: "PING" });
421
- }, tabs[0].id);
422
- });
423
- ```
424
-
425
- ### Context Menus
426
-
427
- ```typescript
428
- test("context menu actions", async ({ context, extensionId }) => {
429
- const serviceWorker = await context.waitForEvent("serviceworker");
430
-
431
- // Create context menu
432
- await serviceWorker.evaluate(async () => {
433
- await chrome.contextMenus.create({
434
- id: "test-menu",
435
- title: "Test Action",
436
- contexts: ["selection"],
437
- });
438
- });
439
-
440
- // Simulate context menu click
441
- const page = await context.newPage();
442
- await page.goto("https://example.com");
443
-
444
- // Select text
445
- await page.evaluate(() => {
446
- const range = document.createRange();
447
- range.selectNodeContents(document.body.firstChild!);
448
- window.getSelection()?.addRange(range);
449
- });
450
-
451
- // Trigger context menu action programmatically
452
- await serviceWorker.evaluate(async () => {
453
- // Simulate the click handler
454
- chrome.contextMenus.onClicked.dispatch(
455
- { menuItemId: "test-menu", selectionText: "selected text" },
456
- { id: 1, url: "https://example.com" },
457
- );
458
- });
459
- });
460
- ```
461
-
462
- ### Permissions API
463
-
464
- ```typescript
465
- test("request permissions", async ({ context, extensionId }) => {
466
- const popup = await context.newPage();
467
- await popup.goto(`chrome-extension://${extensionId}/popup.html`);
468
-
469
- // Check current permissions
470
- const hasPermission = await popup.evaluate(async () => {
471
- return await chrome.permissions.contains({
472
- origins: ["https://*.github.com/*"],
473
- });
474
- });
475
-
476
- // Request new permission (will show prompt in real scenario)
477
- // For testing, we check the request is made correctly
478
- const permissionRequest = popup.evaluate(async () => {
479
- try {
480
- return await chrome.permissions.request({
481
- origins: ["https://*.github.com/*"],
482
- });
483
- } catch (e) {
484
- return false;
485
- }
486
- });
487
-
488
- // In automated tests, permission prompts are typically auto-granted or mocked
489
- });
490
- ```
491
-
492
- ## Anti-Patterns to Avoid
493
-
494
- | Anti-Pattern | Problem | Solution |
495
- | ------------------------------ | --------------------- | ---------------------------------------- |
496
- | Testing in headless mode | Extensions don't load | Use `headless: false` |
497
- | Not waiting for service worker | Race conditions | Wait for `serviceworker` event |
498
- | Hardcoding extension ID | ID changes on reload | Extract ID from service worker URL |
499
- | Testing packed extensions only | Slow iteration | Test unpacked during development |
500
- | Ignoring MV3 differences | Breaking changes | Test both MV2 and MV3 if supporting both |
501
-
502
- ## Related References
503
-
504
- - **Service Workers**: See [service-workers.md](../browser-apis/service-workers.md) for SW testing patterns
505
- - **Multi-Context**: See [multi-context.md](../advanced/multi-context.md) for popup handling
506
- - **Browser APIs**: See [browser-apis.md](../browser-apis/browser-apis.md) for permissions testing