qa-skills 3.0.0 → 3.1.0

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 (262) hide show
  1. package/README.md +20 -149
  2. package/bin/cli.js +1 -40
  3. package/package.json +23 -26
  4. package/dist/agents/registry.d.ts +0 -5
  5. package/dist/agents/registry.d.ts.map +0 -1
  6. package/dist/agents/registry.js +0 -101
  7. package/dist/agents/registry.js.map +0 -1
  8. package/dist/agents/types.d.ts +0 -9
  9. package/dist/agents/types.d.ts.map +0 -1
  10. package/dist/agents/types.js +0 -2
  11. package/dist/agents/types.js.map +0 -1
  12. package/dist/dependencies.d.ts +0 -21
  13. package/dist/dependencies.d.ts.map +0 -1
  14. package/dist/dependencies.js +0 -125
  15. package/dist/dependencies.js.map +0 -1
  16. package/dist/installer.d.ts +0 -25
  17. package/dist/installer.d.ts.map +0 -1
  18. package/dist/installer.js +0 -437
  19. package/dist/installer.js.map +0 -1
  20. package/dist/scaffold.d.ts +0 -27
  21. package/dist/scaffold.d.ts.map +0 -1
  22. package/dist/scaffold.js +0 -182
  23. package/dist/scaffold.js.map +0 -1
  24. package/skills/qa-accessibility-test-writer/SKILL.md +0 -127
  25. package/skills/qa-accessibility-test-writer/references/axe-core-patterns.md +0 -349
  26. package/skills/qa-accessibility-test-writer/references/best-practices.md +0 -184
  27. package/skills/qa-accessibility-test-writer/references/wcag-tests.md +0 -331
  28. package/skills/qa-api-contract-curator/SKILL.md +0 -104
  29. package/skills/qa-api-contract-curator/references/breaking-changes.md +0 -363
  30. package/skills/qa-api-contract-curator/references/openapi-structure.md +0 -404
  31. package/skills/qa-browser-data-collector/SKILL.md +0 -132
  32. package/skills/qa-browser-data-collector/references/data-collection-checklist.md +0 -91
  33. package/skills/qa-browser-data-collector/references/playwright-mcp-patterns.md +0 -113
  34. package/skills/qa-bug-ticket-creator/SKILL.md +0 -148
  35. package/skills/qa-bug-ticket-creator/references/bug-report-format.md +0 -149
  36. package/skills/qa-bug-ticket-creator/references/severity-guide.md +0 -81
  37. package/skills/qa-bug-ticket-creator/templates/bug-ticket-template.md +0 -39
  38. package/skills/qa-changelog-analyzer/SKILL.md +0 -134
  39. package/skills/qa-changelog-analyzer/references/git-analysis-patterns.md +0 -138
  40. package/skills/qa-changelog-analyzer/references/impact-mapping.md +0 -120
  41. package/skills/qa-clickup-integration/SKILL.md +0 -166
  42. package/skills/qa-clickup-integration/references/api-patterns.md +0 -102
  43. package/skills/qa-clickup-integration/references/field-mapping.md +0 -71
  44. package/skills/qa-codeceptjs-writer/SKILL.md +0 -136
  45. package/skills/qa-codeceptjs-writer/references/best-practices.md +0 -207
  46. package/skills/qa-codeceptjs-writer/references/config.md +0 -255
  47. package/skills/qa-codeceptjs-writer/references/patterns.md +0 -285
  48. package/skills/qa-coverage-analyzer/SKILL.md +0 -166
  49. package/skills/qa-coverage-analyzer/references/best-practices.md +0 -142
  50. package/skills/qa-coverage-analyzer/references/coverage-dimensions.md +0 -155
  51. package/skills/qa-coverage-analyzer/references/tools.md +0 -204
  52. package/skills/qa-cypress-writer/SKILL.md +0 -134
  53. package/skills/qa-cypress-writer/references/assertions.md +0 -121
  54. package/skills/qa-cypress-writer/references/best-practices.md +0 -82
  55. package/skills/qa-cypress-writer/references/config.md +0 -121
  56. package/skills/qa-cypress-writer/references/patterns.md +0 -170
  57. package/skills/qa-data-factory/SKILL.md +0 -126
  58. package/skills/qa-data-factory/references/factory-patterns.md +0 -164
  59. package/skills/qa-data-factory/references/faker-guide.md +0 -131
  60. package/skills/qa-diagram-generator/SKILL.md +0 -125
  61. package/skills/qa-diagram-generator/references/c4-model.md +0 -53
  62. package/skills/qa-diagram-generator/references/charts.md +0 -58
  63. package/skills/qa-diagram-generator/references/class-diagram.md +0 -85
  64. package/skills/qa-diagram-generator/references/er-diagram.md +0 -69
  65. package/skills/qa-diagram-generator/references/flowchart.md +0 -92
  66. package/skills/qa-diagram-generator/references/from-screenshot.md +0 -45
  67. package/skills/qa-diagram-generator/references/gantt.md +0 -49
  68. package/skills/qa-diagram-generator/references/journey.md +0 -50
  69. package/skills/qa-diagram-generator/references/mindmap.md +0 -75
  70. package/skills/qa-diagram-generator/references/sequence.md +0 -69
  71. package/skills/qa-diagram-generator/references/state-diagram.md +0 -56
  72. package/skills/qa-discovery-interview/SKILL.md +0 -182
  73. package/skills/qa-discovery-interview/references/completeness-checklist.md +0 -53
  74. package/skills/qa-discovery-interview/references/conflict-patterns.md +0 -101
  75. package/skills/qa-discovery-interview/references/qa-categories.md +0 -147
  76. package/skills/qa-discovery-interview/templates/qa-brief-template.md +0 -168
  77. package/skills/qa-environment-checker/SKILL.md +0 -142
  78. package/skills/qa-environment-checker/references/dependency-matrix.md +0 -101
  79. package/skills/qa-environment-checker/references/health-checks.md +0 -209
  80. package/skills/qa-environment-checker/templates/env-readiness-template.md +0 -64
  81. package/skills/qa-flaky-detector/SKILL.md +0 -153
  82. package/skills/qa-flaky-detector/references/ci-analysis.md +0 -140
  83. package/skills/qa-flaky-detector/references/flaky-patterns.md +0 -247
  84. package/skills/qa-github-issues-enhanced/SKILL.md +0 -175
  85. package/skills/qa-github-issues-enhanced/references/issue-templates.md +0 -425
  86. package/skills/qa-github-issues-enhanced/references/label-taxonomy.md +0 -130
  87. package/skills/qa-github-issues-enhanced/references/workflow-patterns.md +0 -188
  88. package/skills/qa-httpx-writer/SKILL.md +0 -138
  89. package/skills/qa-httpx-writer/references/assertions.md +0 -195
  90. package/skills/qa-httpx-writer/references/best-practices.md +0 -140
  91. package/skills/qa-httpx-writer/references/config.md +0 -212
  92. package/skills/qa-httpx-writer/references/patterns.md +0 -262
  93. package/skills/qa-jest-writer/SKILL.md +0 -131
  94. package/skills/qa-jest-writer/references/assertions.md +0 -125
  95. package/skills/qa-jest-writer/references/best-practices.md +0 -136
  96. package/skills/qa-jest-writer/references/config.md +0 -134
  97. package/skills/qa-jest-writer/references/patterns.md +0 -172
  98. package/skills/qa-jira-integration/SKILL.md +0 -135
  99. package/skills/qa-jira-integration/references/api-patterns.md +0 -143
  100. package/skills/qa-jira-integration/references/field-mapping.md +0 -79
  101. package/skills/qa-jira-integration/references/xray-integration.md +0 -85
  102. package/skills/qa-jmeter-writer/SKILL.md +0 -171
  103. package/skills/qa-jmeter-writer/references/best-practices.md +0 -157
  104. package/skills/qa-jmeter-writer/references/config.md +0 -204
  105. package/skills/qa-jmeter-writer/references/patterns.md +0 -242
  106. package/skills/qa-junit5-writer/SKILL.md +0 -157
  107. package/skills/qa-junit5-writer/references/assertions.md +0 -118
  108. package/skills/qa-junit5-writer/references/config.md +0 -97
  109. package/skills/qa-junit5-writer/references/patterns.md +0 -162
  110. package/skills/qa-k6-writer/SKILL.md +0 -155
  111. package/skills/qa-k6-writer/references/best-practices.md +0 -236
  112. package/skills/qa-k6-writer/references/config.md +0 -219
  113. package/skills/qa-k6-writer/references/patterns.md +0 -304
  114. package/skills/qa-linear-integration/SKILL.md +0 -137
  115. package/skills/qa-linear-integration/references/api-patterns.md +0 -249
  116. package/skills/qa-linear-integration/references/field-mapping.md +0 -121
  117. package/skills/qa-locust-writer/SKILL.md +0 -151
  118. package/skills/qa-locust-writer/references/best-practices.md +0 -126
  119. package/skills/qa-locust-writer/references/config.md +0 -170
  120. package/skills/qa-locust-writer/references/patterns.md +0 -235
  121. package/skills/qa-manual-test-designer/SKILL.md +0 -145
  122. package/skills/qa-manual-test-designer/references/exploratory-charters.md +0 -138
  123. package/skills/qa-manual-test-designer/references/personas.md +0 -146
  124. package/skills/qa-manual-test-designer/templates/exploratory-charter-template.md +0 -47
  125. package/skills/qa-manual-test-designer/templates/test-case-template.md +0 -31
  126. package/skills/qa-mobile-test-writer/SKILL.md +0 -144
  127. package/skills/qa-mobile-test-writer/references/best-practices.md +0 -214
  128. package/skills/qa-mobile-test-writer/references/config.md +0 -309
  129. package/skills/qa-mobile-test-writer/references/patterns.md +0 -304
  130. package/skills/qa-nfr-analyst/SKILL.md +0 -177
  131. package/skills/qa-nfr-analyst/references/iso-25010-model.md +0 -159
  132. package/skills/qa-nfr-analyst/references/owasp-wstg-baseline.md +0 -202
  133. package/skills/qa-nfr-analyst/references/wcag-checklist.md +0 -184
  134. package/skills/qa-nfr-analyst/templates/owasp-checklist-template.md +0 -89
  135. package/skills/qa-nfr-analyst/templates/wcag-checklist-template.md +0 -48
  136. package/skills/qa-orchestrator/SKILL.md +0 -132
  137. package/skills/qa-orchestrator/references/handoff-chains.md +0 -105
  138. package/skills/qa-orchestrator/references/pipeline-modes.md +0 -115
  139. package/skills/qa-orchestrator/references/scheduler-rules.md +0 -84
  140. package/skills/qa-pact-writer/SKILL.md +0 -133
  141. package/skills/qa-pact-writer/references/best-practices.md +0 -100
  142. package/skills/qa-pact-writer/references/config.md +0 -135
  143. package/skills/qa-pact-writer/references/patterns.md +0 -161
  144. package/skills/qa-plan-creator/SKILL.md +0 -139
  145. package/skills/qa-plan-creator/references/introduction-plan.md +0 -43
  146. package/skills/qa-plan-creator/references/migration-plan.md +0 -44
  147. package/skills/qa-plan-creator/references/onboarding-plan.md +0 -46
  148. package/skills/qa-plan-creator/references/performance-plan.md +0 -44
  149. package/skills/qa-plan-creator/references/regression-plan.md +0 -45
  150. package/skills/qa-plan-creator/references/release-plan.md +0 -45
  151. package/skills/qa-plan-creator/references/sprint-plan.md +0 -44
  152. package/skills/qa-plan-creator/references/test-plan.md +0 -59
  153. package/skills/qa-plan-creator/references/uat-plan.md +0 -43
  154. package/skills/qa-plan-creator/templates/checklist-template.md +0 -36
  155. package/skills/qa-plan-creator/templates/regression-checklist-template.md +0 -49
  156. package/skills/qa-plan-creator/templates/release-checklist-template.md +0 -46
  157. package/skills/qa-plan-creator/templates/test-plan-template.md +0 -74
  158. package/skills/qa-playwright-py-writer/SKILL.md +0 -156
  159. package/skills/qa-playwright-py-writer/references/best-practices.md +0 -194
  160. package/skills/qa-playwright-py-writer/references/config.md +0 -195
  161. package/skills/qa-playwright-py-writer/references/patterns.md +0 -212
  162. package/skills/qa-playwright-ts-writer/SKILL.md +0 -151
  163. package/skills/qa-playwright-ts-writer/references/assertions.md +0 -109
  164. package/skills/qa-playwright-ts-writer/references/best-practices.md +0 -191
  165. package/skills/qa-playwright-ts-writer/references/config.md +0 -144
  166. package/skills/qa-playwright-ts-writer/references/patterns.md +0 -171
  167. package/skills/qa-pytest-writer/SKILL.md +0 -145
  168. package/skills/qa-pytest-writer/references/assertions.md +0 -149
  169. package/skills/qa-pytest-writer/references/best-practices.md +0 -97
  170. package/skills/qa-pytest-writer/references/config.md +0 -176
  171. package/skills/qa-pytest-writer/references/patterns.md +0 -251
  172. package/skills/qa-qase-integration/SKILL.md +0 -149
  173. package/skills/qa-qase-integration/references/api-reference.md +0 -354
  174. package/skills/qa-qase-integration/references/ci-integration.md +0 -196
  175. package/skills/qa-qase-integration/references/field-mapping.md +0 -157
  176. package/skills/qa-requirements-generator/SKILL.md +0 -152
  177. package/skills/qa-requirements-generator/references/iso-29148-structure.md +0 -153
  178. package/skills/qa-requirements-generator/references/requirement-patterns.md +0 -278
  179. package/skills/qa-rest-assured-writer/SKILL.md +0 -137
  180. package/skills/qa-rest-assured-writer/references/best-practices.md +0 -50
  181. package/skills/qa-rest-assured-writer/references/config.md +0 -124
  182. package/skills/qa-rest-assured-writer/references/patterns.md +0 -192
  183. package/skills/qa-risk-analyzer/SKILL.md +0 -158
  184. package/skills/qa-risk-analyzer/references/impact-analysis.md +0 -133
  185. package/skills/qa-risk-analyzer/references/risk-factors.md +0 -123
  186. package/skills/qa-robot-framework-writer/SKILL.md +0 -147
  187. package/skills/qa-robot-framework-writer/references/best-practices.md +0 -249
  188. package/skills/qa-robot-framework-writer/references/config.md +0 -204
  189. package/skills/qa-robot-framework-writer/references/libraries.md +0 -273
  190. package/skills/qa-robot-framework-writer/references/patterns.md +0 -216
  191. package/skills/qa-security-test-writer/SKILL.md +0 -123
  192. package/skills/qa-security-test-writer/references/best-practices.md +0 -155
  193. package/skills/qa-security-test-writer/references/owasp-top10.md +0 -331
  194. package/skills/qa-security-test-writer/references/zap-config.md +0 -258
  195. package/skills/qa-selenium-java-writer/SKILL.md +0 -143
  196. package/skills/qa-selenium-java-writer/references/best-practices.md +0 -59
  197. package/skills/qa-selenium-java-writer/references/config.md +0 -143
  198. package/skills/qa-selenium-java-writer/references/patterns.md +0 -170
  199. package/skills/qa-selenium-py-writer/SKILL.md +0 -150
  200. package/skills/qa-selenium-py-writer/references/best-practices.md +0 -175
  201. package/skills/qa-selenium-py-writer/references/config.md +0 -224
  202. package/skills/qa-selenium-py-writer/references/patterns.md +0 -255
  203. package/skills/qa-shortcut-integration/SKILL.md +0 -143
  204. package/skills/qa-shortcut-integration/references/api-patterns.md +0 -126
  205. package/skills/qa-shortcut-integration/references/field-mapping.md +0 -66
  206. package/skills/qa-spec-auditor/SKILL.md +0 -162
  207. package/skills/qa-spec-auditor/references/audit-checklist.md +0 -144
  208. package/skills/qa-spec-auditor/references/drift-patterns.md +0 -207
  209. package/skills/qa-spec-writer/SKILL.md +0 -143
  210. package/skills/qa-spec-writer/references/gherkin-guide.md +0 -253
  211. package/skills/qa-spec-writer/references/specification-patterns.md +0 -274
  212. package/skills/qa-spring-test-writer/SKILL.md +0 -170
  213. package/skills/qa-spring-test-writer/references/best-practices.md +0 -57
  214. package/skills/qa-spring-test-writer/references/config.md +0 -179
  215. package/skills/qa-spring-test-writer/references/patterns.md +0 -235
  216. package/skills/qa-supertest-writer/SKILL.md +0 -150
  217. package/skills/qa-supertest-writer/references/assertions.md +0 -192
  218. package/skills/qa-supertest-writer/references/best-practices.md +0 -102
  219. package/skills/qa-supertest-writer/references/config.md +0 -166
  220. package/skills/qa-supertest-writer/references/patterns.md +0 -242
  221. package/skills/qa-task-creator/SKILL.md +0 -142
  222. package/skills/qa-task-creator/references/linking-patterns.md +0 -127
  223. package/skills/qa-task-creator/references/task-types.md +0 -169
  224. package/skills/qa-task-creator/templates/task-template.md +0 -24
  225. package/skills/qa-test-doc-compiler/SKILL.md +0 -114
  226. package/skills/qa-test-doc-compiler/references/agile-tailoring.md +0 -220
  227. package/skills/qa-test-doc-compiler/references/iso-29119-3-documents.md +0 -302
  228. package/skills/qa-test-healer/SKILL.md +0 -101
  229. package/skills/qa-test-healer/references/diagnosis-patterns.md +0 -142
  230. package/skills/qa-test-healer/references/fix-strategies.md +0 -177
  231. package/skills/qa-test-reporter/SKILL.md +0 -130
  232. package/skills/qa-test-reporter/references/best-practices.md +0 -162
  233. package/skills/qa-test-reporter/references/iso-29119-reports.md +0 -236
  234. package/skills/qa-test-reporter/references/report-formats.md +0 -287
  235. package/skills/qa-test-reviewer/SKILL.md +0 -142
  236. package/skills/qa-test-reviewer/references/anti-patterns.md +0 -268
  237. package/skills/qa-test-reviewer/references/review-checklist.md +0 -93
  238. package/skills/qa-test-strategy/SKILL.md +0 -133
  239. package/skills/qa-test-strategy/references/entry-exit-criteria.md +0 -176
  240. package/skills/qa-test-strategy/references/risk-matrix.md +0 -102
  241. package/skills/qa-test-strategy/references/testing-types.md +0 -143
  242. package/skills/qa-testcase-from-docs/SKILL.md +0 -161
  243. package/skills/qa-testcase-from-docs/references/test-case-format.md +0 -196
  244. package/skills/qa-testcase-from-docs/references/test-design-techniques.md +0 -126
  245. package/skills/qa-testcase-from-docs/templates/test-case-template.md +0 -31
  246. package/skills/qa-testcase-from-ui/SKILL.md +0 -109
  247. package/skills/qa-testcase-from-ui/references/ui-element-patterns.md +0 -126
  248. package/skills/qa-testcase-from-ui/references/visual-analysis-guide.md +0 -146
  249. package/skills/qa-testcase-from-ui/templates/test-case-template.md +0 -31
  250. package/skills/qa-visual-regression-writer/SKILL.md +0 -175
  251. package/skills/qa-visual-regression-writer/references/best-practices.md +0 -154
  252. package/skills/qa-visual-regression-writer/references/config.md +0 -220
  253. package/skills/qa-visual-regression-writer/references/patterns.md +0 -213
  254. package/skills/qa-vitest-writer/SKILL.md +0 -141
  255. package/skills/qa-vitest-writer/references/assertions.md +0 -105
  256. package/skills/qa-vitest-writer/references/best-practices.md +0 -62
  257. package/skills/qa-vitest-writer/references/config.md +0 -127
  258. package/skills/qa-vitest-writer/references/patterns.md +0 -141
  259. package/skills/qa-webdriverio-writer/SKILL.md +0 -145
  260. package/skills/qa-webdriverio-writer/references/best-practices.md +0 -176
  261. package/skills/qa-webdriverio-writer/references/config.md +0 -240
  262. package/skills/qa-webdriverio-writer/references/patterns.md +0 -269
@@ -1,212 +0,0 @@
1
- # Playwright Python Patterns
2
-
3
- Common patterns for E2E testing with Playwright Python (sync and async API).
4
-
5
- ## Sync vs Async API
6
-
7
- | API | Import | Use Case |
8
- |-----|--------|----------|
9
- | **Sync** | `from playwright.sync_api import Page, expect` | Default; simpler, pytest-playwright fixtures |
10
- | **Async** | `from playwright.async_api import Page, expect` | Async test suites; `playwright_pytest_asyncio = True` in pytest.ini |
11
-
12
- ```python
13
- # Sync (default)
14
- def test_login(page: Page):
15
- page.goto("/login")
16
- page.get_by_label("Email").fill("user@example.com")
17
- page.get_by_label("Password").fill("secret")
18
- page.get_by_role("button", name="Sign in").click()
19
- expect(page).to_have_url(re.compile(r".*dashboard"))
20
-
21
- # Async (requires playwright_pytest_asyncio)
22
- @pytest.mark.asyncio
23
- async def test_login_async(page: Page):
24
- await page.goto("/login")
25
- await page.get_by_label("Email").fill("user@example.com")
26
- await page.get_by_role("button", name="Sign in").click()
27
- ```
28
-
29
- ## Pytest Fixtures (pytest-playwright)
30
-
31
- | Fixture | Scope | Description |
32
- |---------|-------|-------------|
33
- | `playwright` | Session | Playwright instance |
34
- | `browser_type` | Session | Chromium, Firefox, or WebKit launcher |
35
- | `browser` | Function | Browser instance |
36
- | `context` | Function | Browser context (isolated) |
37
- | `page` | Function | Page (tab) for tests |
38
- | `browser_context_args` | Function | Override context options |
39
- | `browser_name` | Session | `chromium`, `firefox`, or `webkit` |
40
-
41
- ```python
42
- def test_with_page(page: Page):
43
- page.goto("https://example.com")
44
- assert page.title() == "Example Domain"
45
-
46
- def test_with_context(context: BrowserContext, page: Page):
47
- # context and page are fresh per test
48
- page.goto("/")
49
- ```
50
-
51
- ## Navigation
52
-
53
- | Pattern | Sync | Async |
54
- |---------|------|-------|
55
- | Go to URL | `page.goto("/login")` | `await page.goto("/login")` |
56
- | Go back | `page.go_back()` | `await page.go_back()` |
57
- | Reload | `page.reload()` | `await page.reload()` |
58
- | Wait for URL | `page.wait_for_url("**/dashboard")` | `await page.wait_for_url("**/dashboard")` |
59
-
60
- ```python
61
- def test_navigates_after_login(page: Page):
62
- page.goto("/login")
63
- page.get_by_label("Email").fill("user@example.com")
64
- page.get_by_label("Password").fill("secret")
65
- page.get_by_role("button", name="Sign in").click()
66
- page.wait_for_url(re.compile(r".*dashboard"))
67
- expect(page).to_have_url(re.compile(r".*dashboard"))
68
- ```
69
-
70
- ## Forms
71
-
72
- | Pattern | Example |
73
- |---------|---------|
74
- | Fill text | `page.get_by_label("Name").fill("John")` |
75
- | Fill by role | `page.get_by_role("textbox", name="Email").fill("a@b.com")` |
76
- | Select dropdown | `page.get_by_label("Country").select_option("US")` |
77
- | Check checkbox | `page.get_by_role("checkbox", name="Subscribe").check()` |
78
- | Radio | `page.get_by_role("radio", name="Option A").check()` |
79
- | Submit | `page.get_by_role("button", name="Submit").click()` |
80
-
81
- ```python
82
- def test_registration_form(page: Page):
83
- page.goto("/register")
84
- page.get_by_label("Email").fill("new@example.com")
85
- page.get_by_label("Password").fill("SecurePass123")
86
- page.get_by_role("checkbox", name="Terms").check()
87
- page.get_by_role("button", name="Create account").click()
88
- expect(page.get_by_text("Welcome")).to_be_visible()
89
- ```
90
-
91
- ## Assertions (expect)
92
-
93
- | Assertion | Example |
94
- |-----------|---------|
95
- | Visible | `expect(locator).to_be_visible()` |
96
- | Text | `expect(locator).to_have_text("Hello")` |
97
- | URL | `expect(page).to_have_url(re.compile(r".*dashboard"))` |
98
- | Count | `expect(locator).to_have_count(3)` |
99
- | Enabled | `expect(locator).to_be_enabled()` |
100
- | Checked | `expect(locator).to_be_checked()` |
101
-
102
- ```python
103
- from playwright.sync_api import expect
104
-
105
- def test_homepage(page: Page):
106
- page.goto("/")
107
- expect(page.get_by_role("heading", name="Welcome")).to_be_visible()
108
- expect(page.locator(".item")).to_have_count(5)
109
- ```
110
-
111
- ## Network Mocking (page.route)
112
-
113
- | Pattern | Example |
114
- |---------|---------|
115
- | Mock response | `page.route("**/api/users", lambda route: route.fulfill(status=200, body="[]"))` |
116
- | Abort request | `page.route("**/analytics", lambda route: route.abort())` |
117
- | Continue | `page.route("**/api/**", lambda route: route.continue_())` |
118
- | Unroute | `page.unroute("**/api/users")` |
119
-
120
- ```python
121
- def test_empty_state(page: Page):
122
- def handle_route(route):
123
- route.fulfill(
124
- status=200,
125
- content_type="application/json",
126
- body='{"items": []}'
127
- )
128
- page.route("**/api/items", handle_route)
129
- page.goto("/items")
130
- expect(page.get_by_text("No items found")).to_be_visible()
131
- ```
132
-
133
- ## File Upload
134
-
135
- | Pattern | Example |
136
- |---------|---------|
137
- | Single file | `page.get_by_label("Upload").set_input_files("fixtures/doc.pdf")` |
138
- | Multiple files | `page.get_by_label("Upload").set_input_files(["a.pdf", "b.pdf"])` |
139
- | Buffer | `page.get_by_label("Upload").set_input_files(FilePayload(name="test.txt", mime_type="text/plain", buffer=b"content"))` |
140
-
141
- ```python
142
- from pathlib import Path
143
-
144
- def test_upload(page: Page):
145
- page.goto("/upload")
146
- page.get_by_label("Choose file").set_input_files(Path(__file__).parent / "fixtures" / "sample.pdf")
147
- page.get_by_role("button", name="Upload").click()
148
- expect(page.get_by_text("Upload complete")).to_be_visible()
149
- ```
150
-
151
- ## Iframe Handling
152
-
153
- | Pattern | Example |
154
- |---------|---------|
155
- | Frame locator | `frame = page.frame_locator('iframe[name="embed"]')` |
156
- | Interact in frame | `frame.get_by_role("button").click()` |
157
-
158
- ```python
159
- def test_iframe_content(page: Page):
160
- page.goto("/embed")
161
- frame = page.frame_locator("iframe#widget")
162
- frame.get_by_role("button", name="Submit").click()
163
- expect(frame.get_by_text("Success")).to_be_visible()
164
- ```
165
-
166
- ## Multi-Tab / Popup
167
-
168
- | Pattern | Example |
169
- |---------|---------|
170
- | Wait for popup | `with page.expect_popup() as popup_info: page.get_by_role("link").click()` then `popup = popup_info.value` |
171
- | New page | `new_page = context.new_page()` |
172
-
173
- ```python
174
- def test_opens_external_link(page: Page, context: BrowserContext):
175
- with page.expect_popup() as popup_info:
176
- page.get_by_role("link", name="External").click()
177
- popup = popup_info.value
178
- popup.wait_for_load_state()
179
- expect(popup).to_have_url(re.compile(r"external\.com"))
180
- ```
181
-
182
- ## Page Object Model (POM)
183
-
184
- ```python
185
- # pages/base_page.py
186
- from playwright.sync_api import Page
187
-
188
- class BasePage:
189
- def __init__(self, page: Page, base_url: str):
190
- self.page = page
191
- self.base_url = base_url
192
-
193
- def goto(self, path: str):
194
- self.page.goto(f"{self.base_url}{path}")
195
-
196
- # pages/login_page.py
197
- from playwright.sync_api import Page
198
- from .base_page import BasePage
199
-
200
- class LoginPage(BasePage):
201
- def __init__(self, page: Page, base_url: str):
202
- super().__init__(page, base_url)
203
-
204
- def login(self, email: str, password: str):
205
- self.page.get_by_label("Email").fill(email)
206
- self.page.get_by_label("Password").fill(password)
207
- self.page.get_by_role("button", name="Sign in").click()
208
-
209
- @property
210
- def error_message(self):
211
- return self.page.get_by_role("alert")
212
- ```
@@ -1,151 +0,0 @@
1
- ---
2
- name: qa-playwright-ts-writer
3
- description: Generate Playwright E2E, component, and unit tests for TypeScript with auto-wait, multi-browser support, POM pattern, and live browser record mode via Playwright MCP.
4
- output_dir: tests/e2e
5
- ---
6
-
7
- # QA Playwright TypeScript Writer
8
-
9
- ## Purpose
10
-
11
- Write Playwright tests (E2E, component, unit) from test case specifications. Transform structured test cases into executable Playwright test files with auto-waiting, multi-browser support, Page Object Model, and optional live browser record mode.
12
-
13
- ## Trigger Phrases
14
-
15
- - "Write Playwright tests for [feature/flow]"
16
- - "Generate E2E tests from test cases"
17
- - "Create Playwright tests with record mode"
18
- - "Add Playwright component tests for [component]"
19
- - "Playwright tests for [URL/flow]"
20
- - "Record browser interactions and generate test code"
21
- - "POM-based Playwright tests for [page]"
22
- - "Multi-browser Playwright tests"
23
- - "Heal my failing Playwright tests"
24
-
25
- ## Three Modes
26
-
27
- | Mode | When to Use | Behavior |
28
- |------|-------------|----------|
29
- | **Record Mode** | User wants live browser capture | Use Playwright MCP (e.g., cursor-ide-browser) → navigate, interact, capture interactions → generate test code from recorded steps |
30
- | **Generate Mode** | Default; from test case specs | Read test cases (from qa-testcase-from-docs, qa-testcase-from-ui, qa-manual-test-designer) → generate Playwright code |
31
- | **Heal Mode** | Tests fail after changes | Delegate to **qa-test-healer** to auto-fix broken selectors, assertions, waits; mark unfixable as `test.fixme()` |
32
-
33
- ## Test Types
34
-
35
- | Type | Scope | Approach |
36
- |------|-------|----------|
37
- | **E2E** | Full user flows, page navigation | page.goto, locators, assertions, network interception, multi-browser |
38
- | **Component** | Isolated component testing | @playwright/experimental-ct-react, ct-vue, ct-svelte; mount, interact, assert |
39
- | **Unit** | Pure functions, utilities | Use test runner for logic; Playwright optional for DOM utilities |
40
-
41
- ## E2E Testing
42
-
43
- - **Navigation:** page.goto, page.goBack, page.reload
44
- - **Interactions:** click, fill, selectOption, check, hover, press
45
- - **Assertions:** expect(locator).toBeVisible, toHaveText, toHaveURL, etc.
46
- - **Network:** page.route for API mocking, request/response interception
47
- - **Multi-browser:** Chromium, Firefox, WebKit via projects in config
48
- - **Auto-wait:** Playwright auto-waits for elements; avoid page.waitForTimeout
49
-
50
- See `references/patterns.md` for navigation, forms, auth, file upload, drag-drop, iframes, multi-tab, API mocking, visual comparison.
51
-
52
- ## Component Testing
53
-
54
- - **React:** `@playwright/experimental-ct-react` — mount components, pass props, assert
55
- - **Vue:** `@playwright/experimental-ct-vue` — mount, slots, provide/inject
56
- - **Svelte:** `@playwright/experimental-ct-svelte` — mount, component API
57
-
58
- Component tests run in isolated browser context; use `test` from `@playwright/experimental-ct-*`.
59
-
60
- ## Page Object Model (POM)
61
-
62
- - **Base page:** Shared selectors, navigation helpers, common actions
63
- - **Page-specific:** Extend base; encapsulate page-specific locators and methods
64
- - **Component objects:** Reusable components (header, modal, form) as classes
65
-
66
- See `references/best-practices.md` for POM structure.
67
-
68
- ## Key Patterns
69
-
70
- - **Structure:** test.describe / test / test.step for grouping
71
- - **Locators:** getByRole > getByTestId > getByText > getByLabel > CSS selector
72
- - **Assertions:** expect(locator).toBeVisible, toHaveText, toHaveURL, toHaveCount, etc.
73
- - **Network:** page.route(url, handler) for mocking; page.unroute to clear
74
- - **Fixtures:** test.extend for custom fixtures (auth, API client)
75
- - **Steps:** test.step('description', async () => { ... }) for trace grouping
76
-
77
- See `references/assertions.md` for full assertion reference.
78
-
79
- ## Locator Priority
80
-
81
- 1. **getByRole** — Accessibility-based; most resilient
82
- 2. **getByTestId** — data-testid; explicit, stable
83
- 3. **getByText** — Visible text; use for unique labels
84
- 4. **getByLabel** — Form labels; good for inputs
85
- 5. **CSS selector** — Last resort; brittle for dynamic content
86
-
87
- ## Configuration
88
-
89
- - **playwright.config.ts** — projects (browsers), retries, workers, reporter, baseURL
90
- - **Global setup/teardown** — Auth state, DB seeding
91
- - **Test directory** — e2e/, tests/, or colocated
92
-
93
- See `references/config.md` for full config guide.
94
-
95
- ## MCP Integration
96
-
97
- - **Context7 MCP** — Fetch Playwright documentation when needed
98
- - **Playwright MCP** (cursor-ide-browser, @playwright/mcp) — Record mode: navigate, snapshot, click, type; capture interactions → generate test code
99
-
100
- ## Scope
101
-
102
- **Can do (autonomous):**
103
- - Generate Playwright E2E, component, unit tests from test case specs
104
- - Use Record Mode with Playwright MCP to capture and generate tests
105
- - Apply POM pattern, stable locators, auto-wait
106
- - Configure playwright.config.ts (projects, retries, reporter)
107
- - Use page.route for API mocking
108
- - Delegate to qa-test-healer when tests fail (Heal Mode)
109
- - Use Context7 MCP for Playwright docs
110
-
111
- **Cannot do (requires confirmation):**
112
- - Change production code structure
113
- - Add dependencies not in package.json
114
- - Override project Playwright config without approval
115
- - Navigate to URLs not provided (Record Mode)
116
-
117
- **Will not do (out of scope):**
118
- - Execute tests (user runs `npx playwright test`)
119
- - Write Jest/Vitest unit tests (use qa-jest-writer)
120
- - Modify CI/CD pipelines
121
- - Bypass security or access restricted areas
122
-
123
- ## References
124
-
125
- - `references/patterns.md` — Navigation, forms, auth, file upload, drag-drop, iframes, multi-tab, API mocking, visual
126
- - `references/assertions.md` — Playwright assertion reference
127
- - `references/config.md` — playwright.config.ts, projects, reporter, setup
128
- - `references/best-practices.md` — POM, locators, flakiness, isolation, debugging
129
-
130
- ## Quality Checklist
131
-
132
- - [ ] Auto-wait used; no page.waitForTimeout (use expect with timeout or waitFor)
133
- - [ ] No hardcoded waits; prefer expect auto-retry
134
- - [ ] POM pattern applied for page-specific logic
135
- - [ ] Stable locators (getByRole, getByTestId preferred)
136
- - [ ] Tests independent (no shared state, order-independent)
137
- - [ ] Proper teardown (fixtures, afterEach if needed)
138
- - [ ] Traceability to test case IDs where applicable
139
- - [ ] No hardcoded secrets (use env vars)
140
-
141
- ## Troubleshooting
142
-
143
- | Symptom | Likely Cause | Fix |
144
- |---------|--------------|-----|
145
- | Element not found | Selector too specific, dynamic content | Use getByRole/getByTestId; add data-testid if needed |
146
- | Timeout | Element not ready, slow network | Increase expect timeout; use waitFor; check for overlays |
147
- | Flaky tests | Race conditions, shared state | Ensure test isolation; use auto-wait; avoid fixed delays |
148
- | Record mode empty | MCP not capturing steps | Verify Playwright MCP active; lock browser before actions |
149
- | Multi-tab fails | Wrong context | Use page.context().pages() or new context for new tab |
150
- | API mock not applied | Route registered after request | Call page.route before page.goto |
151
- | Component test fails | Missing mount setup | Check ct config; ensure component imported correctly |
@@ -1,109 +0,0 @@
1
- # Playwright Assertion Reference
2
-
3
- Playwright uses `expect` from `@playwright/test` with auto-retry and rich error messages.
4
-
5
- ## Visibility & State
6
-
7
- | Assertion | Description | Example |
8
- |-----------|-------------|---------|
9
- | `toBeVisible()` | Element is visible | `expect(page.getByRole('heading')).toBeVisible()` |
10
- | `toBeHidden()` | Element is hidden | `expect(page.getByText('Loading')).toBeHidden()` |
11
- | `toBeAttached()` | Element is in DOM | `expect(locator).toBeAttached()` |
12
- | `toBeDetached()` | Element is not in DOM | `expect(locator).toBeDetached()` |
13
-
14
- ## Text
15
-
16
- | Assertion | Description | Example |
17
- |-----------|-------------|---------|
18
- | `toHaveText(text)` | Exact text match | `expect(locator).toHaveText('Submit')` |
19
- | `toHaveText(regex)` | Regex match | `expect(locator).toHaveText(/Welcome, .+/)` |
20
- | `toContainText(text)` | Contains text | `expect(locator).toContainText('Error')` |
21
- | `toHaveValue(value)` | Input value | `expect(input).toHaveValue('typed')` |
22
-
23
- ## URL & Navigation
24
-
25
- | Assertion | Description | Example |
26
- |-----------|-------------|---------|
27
- | `toHaveURL(url)` | Page URL | `expect(page).toHaveURL('/dashboard')` |
28
- | `toHaveURL(regex)` | URL regex | `expect(page).toHaveURL(/.*\/user\/\d+/)` |
29
- | `toHaveTitle(title)` | Page title | `expect(page).toHaveTitle('Dashboard')` |
30
-
31
- ## Count & List
32
-
33
- | Assertion | Description | Example |
34
- |-----------|-------------|---------|
35
- | `toHaveCount(n)` | Number of matches | `expect(page.getByRole('listitem')).toHaveCount(5)` |
36
- | `toHaveLength(n)` | Array length (for locator.all()) | `expect(await locator.all()).toHaveLength(3)` |
37
-
38
- ## Attributes & Properties
39
-
40
- | Assertion | Description | Example |
41
- |-----------|-------------|---------|
42
- | `toHaveAttribute(name, value?)` | Attribute exists/value | `expect(link).toHaveAttribute('href', '/about')` |
43
- | `toHaveClass(class)` | Has CSS class | `expect(btn).toHaveClass('active')` |
44
- | `toHaveCSS(name, value)` | CSS property | `expect(el).toHaveCSS('display', 'none')` |
45
-
46
- ## Form Elements
47
-
48
- | Assertion | Description | Example |
49
- |-----------|-------------|---------|
50
- | `toBeChecked()` | Checkbox/radio checked | `expect(checkbox).toBeChecked()` |
51
- | `toBeEnabled()` | Element enabled | `expect(button).toBeEnabled()` |
52
- | `toBeDisabled()` | Element disabled | `expect(button).toBeDisabled()` |
53
- | `toBeEditable()` | Input is editable | `expect(input).toBeEditable()` |
54
- | `toBeEmpty()` | No text/children | `expect(div).toBeEmpty()` |
55
-
56
- ## Soft Assertions
57
-
58
- | Pattern | Description | Example |
59
- |---------|-------------|---------|
60
- | `expect.soft()` | Continue on failure | `await expect.soft(locator).toBeVisible()` |
61
- | Collect failures | Run all, report at end | Use multiple `expect.soft` in sequence |
62
-
63
- ```typescript
64
- test('validates form fields', async ({ page }) => {
65
- await expect.soft(page.getByLabel('Email')).toBeVisible();
66
- await expect.soft(page.getByLabel('Password')).toBeVisible();
67
- await expect.soft(page.getByRole('button')).toBeEnabled();
68
- });
69
- ```
70
-
71
- ## Timeout
72
-
73
- | Pattern | Description | Example |
74
- |---------|-------------|---------|
75
- | `{ timeout: ms }` | Override default | `expect(locator).toBeVisible({ timeout: 10000 })` |
76
- | Config default | playwright.config.ts | `expect: { timeout: 5000 }` |
77
-
78
- ## Negation
79
-
80
- | Pattern | Example |
81
- |---------|---------|
82
- | `not` | `expect(locator).not.toBeVisible()` |
83
- | `expect(locator).not.toHaveText('Error')` |
84
-
85
- ## Screenshot Assertions
86
-
87
- | Assertion | Description | Example |
88
- |-----------|-------------|---------|
89
- | `toHaveScreenshot(name?)` | Visual regression | `await expect(page).toHaveScreenshot('home.png')` |
90
- | Options | mask, maxDiffPixels | `await expect(page).toHaveScreenshot({ mask: [locator] })` |
91
-
92
- ## Common Patterns
93
-
94
- ```typescript
95
- // Wait for element and assert
96
- await expect(page.getByRole('heading', { name: 'Dashboard' })).toBeVisible();
97
-
98
- // Assert list length
99
- await expect(page.getByRole('listitem')).toHaveCount(3);
100
-
101
- // Assert input value
102
- await expect(page.getByLabel('Search')).toHaveValue('query');
103
-
104
- // Assert URL after action
105
- await expect(page).toHaveURL(/\/users\/\d+/);
106
-
107
- // Assert disabled state
108
- await expect(page.getByRole('button', { name: 'Submit' })).toBeDisabled();
109
- ```
@@ -1,191 +0,0 @@
1
- # Playwright Best Practices
2
-
3
- Guidelines for maintainable, stable Playwright tests.
4
-
5
- ## Page Object Model (POM)
6
-
7
- ### Structure
8
-
9
- ```
10
- pages/
11
- BasePage.ts # Shared navigation, common helpers
12
- LoginPage.ts # Login-specific locators and methods
13
- DashboardPage.ts # Dashboard-specific
14
- components/
15
- Header.ts # Reusable header component
16
- Modal.ts # Reusable modal
17
- ```
18
-
19
- ### Base Page
20
-
21
- ```typescript
22
- // pages/BasePage.ts
23
- import { Page } from '@playwright/test';
24
-
25
- export class BasePage {
26
- constructor(protected page: Page, protected baseURL: string) {}
27
-
28
- async goto(path: string) {
29
- await this.page.goto(`${this.baseURL}${path}`);
30
- }
31
-
32
- getByTestId(id: string) {
33
- return this.page.getByTestId(id);
34
- }
35
- }
36
- ```
37
-
38
- ### Page-Specific Class
39
-
40
- ```typescript
41
- // pages/LoginPage.ts
42
- import { Page } from '@playwright/test';
43
- import { BasePage } from './BasePage';
44
-
45
- export class LoginPage extends BasePage {
46
- constructor(page: Page, baseURL: string) {
47
- super(page, baseURL);
48
- }
49
-
50
- async login(email: string, password: string) {
51
- await this.page.getByLabel('Email').fill(email);
52
- await this.page.getByLabel('Password').fill(password);
53
- await this.page.getByRole('button', { name: 'Sign in' }).click();
54
- }
55
-
56
- get errorMessage() {
57
- return this.page.getByRole('alert');
58
- }
59
- }
60
- ```
61
-
62
- ### Usage in Tests
63
-
64
- ```typescript
65
- test('login flow', async ({ page }) => {
66
- const loginPage = new LoginPage(page, baseURL);
67
- await loginPage.goto('/login');
68
- await loginPage.login('user@example.com', 'secret');
69
- await expect(loginPage.errorMessage).not.toBeVisible();
70
- });
71
- ```
72
-
73
- ## Locator Strategies
74
-
75
- ### Priority Order
76
-
77
- 1. **getByRole** — Best for accessibility; resilient to DOM changes
78
- 2. **getByTestId** — Explicit, stable; requires adding data-testid
79
- 3. **getByText** — For unique visible text
80
- 4. **getByLabel** — For form inputs with labels
81
- 5. **CSS selector** — Last resort; brittle
82
-
83
- ### Examples
84
-
85
- ```typescript
86
- // Prefer
87
- page.getByRole('button', { name: 'Submit' })
88
- page.getByTestId('submit-btn')
89
- page.getByLabel('Email address')
90
- page.getByText('Welcome back')
91
-
92
- // Avoid when possible
93
- page.locator('.btn-primary')
94
- page.locator('#submit')
95
- page.locator('div > span:nth-child(2)')
96
- ```
97
-
98
- ## Avoiding Flakiness
99
-
100
- | Practice | Description |
101
- |----------|-------------|
102
- | **Auto-wait** | Playwright auto-waits; avoid `page.waitForTimeout` |
103
- | **Assert before act** | Use `expect` to wait for readiness before clicking |
104
- | **Stable selectors** | Prefer role/testid over CSS |
105
- | **Isolation** | Each test gets fresh context; no shared state |
106
- | **Deterministic data** | Use fixtures, mocks; avoid time-dependent data |
107
- | **No fixed delays** | Use `expect` with timeout or `waitFor` instead of `setTimeout` |
108
-
109
- ### Anti-Patterns
110
-
111
- ```typescript
112
- // BAD: Fixed delay
113
- await page.waitForTimeout(3000);
114
-
115
- // GOOD: Wait for element
116
- await expect(page.getByRole('heading')).toBeVisible();
117
-
118
- // BAD: Brittle CSS
119
- await page.locator('div.container > div:nth-child(2) button').click();
120
-
121
- // GOOD: Role or testid
122
- await page.getByRole('button', { name: 'Save' }).click();
123
- ```
124
-
125
- ## Test Isolation
126
-
127
- - Each test runs in a new browser context (default)
128
- - No shared cookies, localStorage, or session
129
- - Use `storageState` for auth when needed; create fresh per test or reuse via project
130
- - Clean up test data in `afterEach` if tests create DB records
131
-
132
- ## Parallel Execution
133
-
134
- - `fullyParallel: true` — Run tests in parallel (default for many projects)
135
- - `workers` — Number of parallel workers; reduce in CI if flaky
136
- - Avoid shared resources (files, DB rows) that can conflict
137
-
138
- ## Debugging
139
-
140
- | Tool | Use |
141
- |------|-----|
142
- | `--debug` | Pause and step through |
143
- | `--headed` | Run with visible browser |
144
- | `page.pause()` | Breakpoint in code |
145
- | Trace viewer | `npx playwright show-trace trace.zip` |
146
- | Screenshot on failure | `screenshot: 'only-on-failure'` |
147
- | Video on failure | `video: 'retain-on-failure'` |
148
-
149
- ## Fixtures and test.extend
150
-
151
- ```typescript
152
- import { test as base } from '@playwright/test';
153
-
154
- export const test = base.extend<{ authenticatedPage: Page }>({
155
- authenticatedPage: async ({ page }, use) => {
156
- // Login logic
157
- await page.goto('/login');
158
- await page.getByLabel('Email').fill('test@example.com');
159
- await page.getByLabel('Password').fill('secret');
160
- await page.getByRole('button', { name: 'Sign in' }).click();
161
- await page.waitForURL(/dashboard/);
162
- await use(page);
163
- },
164
- });
165
-
166
- test('authenticated flow', async ({ authenticatedPage }) => {
167
- await authenticatedPage.goto('/settings');
168
- // ...
169
- });
170
- ```
171
-
172
- ## test.step for Grouping
173
-
174
- ```typescript
175
- test('checkout flow', async ({ page }) => {
176
- await test.step('add item to cart', async () => {
177
- await page.goto('/products/1');
178
- await page.getByRole('button', { name: 'Add to cart' }).click();
179
- });
180
- await test.step('proceed to checkout', async () => {
181
- await page.getByRole('link', { name: 'Cart' }).click();
182
- await page.getByRole('button', { name: 'Checkout' }).click();
183
- });
184
- await test.step('complete payment', async () => {
185
- await page.getByLabel('Card number').fill('4111111111111111');
186
- await page.getByRole('button', { name: 'Pay' }).click();
187
- });
188
- });
189
- ```
190
-
191
- Steps appear in traces and reports for easier debugging.