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,170 +0,0 @@
1
- # Selenium Java Patterns
2
-
3
- ## Page Object Model (POM)
4
-
5
- ### Base Page
6
-
7
- ```java
8
- public abstract class BasePage {
9
- protected WebDriver driver;
10
- protected WebDriverWait wait;
11
-
12
- public BasePage(WebDriver driver) {
13
- this.driver = driver;
14
- this.wait = new WebDriverWait(driver, Duration.ofSeconds(10));
15
- PageFactory.initElements(driver, this);
16
- }
17
- }
18
- ```
19
-
20
- ### Page with PageFactory
21
-
22
- ```java
23
- public class LoginPage extends BasePage {
24
- @FindBy(id = "username")
25
- private WebElement usernameInput;
26
-
27
- @FindBy(id = "password")
28
- private WebElement passwordInput;
29
-
30
- @FindBy(css = "button[type='submit']")
31
- private WebElement submitButton;
32
-
33
- public LoginPage(WebDriver driver) {
34
- super(driver);
35
- }
36
-
37
- public void login(String user, String pass) {
38
- usernameInput.sendKeys(user);
39
- passwordInput.sendKeys(pass);
40
- submitButton.click();
41
- }
42
- }
43
- ```
44
-
45
- ### Lazy Locators (FindBy with custom locator)
46
-
47
- ```java
48
- @FindBy(css = "div.user[data-id='%s']")
49
- private String userItemTemplate;
50
-
51
- public WebElement getUserItem(String id) {
52
- return driver.findElement(By.cssSelector(String.format(userItemTemplate, id)));
53
- }
54
- ```
55
-
56
- ## Explicit Waits
57
-
58
- ### WebDriverWait + ExpectedConditions
59
-
60
- ```java
61
- // Visibility
62
- WebElement el = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("result")));
63
-
64
- // Clickable
65
- WebElement btn = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(".submit")));
66
-
67
- // Presence (in DOM, may not be visible)
68
- WebElement el = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("dynamic")));
69
-
70
- // Text present
71
- wait.until(ExpectedConditions.textToBePresentInElementLocated(By.id("status"), "Success"));
72
-
73
- // URL contains
74
- wait.until(ExpectedConditions.urlContains("/dashboard"));
75
-
76
- // Custom condition
77
- wait.until(d -> ((JavascriptExecutor) d).executeScript("return document.readyState").equals("complete"));
78
- ```
79
-
80
- ### Timeout Configuration
81
-
82
- ```java
83
- WebDriverWait shortWait = new WebDriverWait(driver, Duration.ofSeconds(5));
84
- WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(30));
85
- ```
86
-
87
- ## Selectors (By strategies)
88
-
89
- | Strategy | Example |
90
- | -------- | ------- |
91
- | By.id | `By.id("submit-btn")` |
92
- | By.cssSelector | `By.cssSelector("button.primary")` |
93
- | By.xpath | `By.xpath("//button[text()='Submit']")` |
94
- | By.name | `By.name("email")` |
95
- | By.className | `By.className("btn-primary")` |
96
- | By.linkText | `By.linkText("Sign in")` |
97
- | By.partialLinkText | `By.partialLinkText("Sign")` |
98
- | By.tagName | `By.tagName("input")` |
99
-
100
- Prefer: ID > data attributes > CSS > XPath.
101
-
102
- ## Actions
103
-
104
- ### Basic Interactions
105
-
106
- ```java
107
- element.click();
108
- element.sendKeys("text");
109
- element.clear();
110
- element.getText();
111
- element.getAttribute("href");
112
- element.isDisplayed();
113
- element.isEnabled();
114
- element.isSelected();
115
- ```
116
-
117
- ### Actions API (complex interactions)
118
-
119
- ```java
120
- Actions actions = new Actions(driver);
121
- actions.moveToElement(element).click().perform();
122
- actions.dragAndDrop(source, target).perform();
123
- actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).perform();
124
- actions.sendKeys(element, Keys.ENTER).perform();
125
- ```
126
-
127
- ### Select (dropdowns)
128
-
129
- ```java
130
- Select select = new Select(driver.findElement(By.id("country")));
131
- select.selectByValue("US");
132
- select.selectByVisibleText("United States");
133
- select.selectByIndex(0);
134
- ```
135
-
136
- ## Alerts
137
-
138
- ```java
139
- Alert alert = wait.until(ExpectedConditions.alertIsPresent());
140
- String text = alert.getText();
141
- alert.accept(); // OK
142
- alert.dismiss(); // Cancel
143
- alert.sendKeys("input"); // For prompt
144
- ```
145
-
146
- ## Frames and Windows
147
-
148
- ```java
149
- // Switch to frame
150
- driver.switchTo().frame("frameName");
151
- driver.switchTo().frame(0);
152
- driver.switchTo().frame(frameElement);
153
- driver.switchTo().defaultContent();
154
-
155
- // New window/tab
156
- String mainHandle = driver.getWindowHandle();
157
- for (String handle : driver.getWindowHandles()) {
158
- if (!handle.equals(mainHandle)) {
159
- driver.switchTo().window(handle);
160
- break;
161
- }
162
- }
163
- ```
164
-
165
- ## File Upload
166
-
167
- ```java
168
- WebElement fileInput = driver.findElement(By.cssSelector("input[type='file']"));
169
- fileInput.sendKeys(Paths.get("/path/to/file.txt").toAbsolutePath().toString());
170
- ```
@@ -1,150 +0,0 @@
1
- ---
2
- name: qa-selenium-py-writer
3
- description: Generate Selenium E2E tests for Python with WebDriver, explicit/implicit waits, Page Object Model, and headless browser support.
4
- output_dir: tests/e2e
5
- ---
6
-
7
- # QA Selenium Python Writer
8
-
9
- ## Purpose
10
-
11
- Write Selenium Python E2E tests from test case specifications. Transform structured test cases (from qa-testcase-from-docs, qa-manual-test-designer, qa-browser-data-collector, or specs) into executable Selenium test files with WebDriver, explicit waits, Page Object Model, and headless browser support.
12
-
13
- ## Trigger Phrases
14
-
15
- - "Write Selenium tests for [feature/flow]"
16
- - "Generate Selenium E2E tests from test cases"
17
- - "Create Selenium Python tests with POM"
18
- - "Add Selenium tests for [URL/page]"
19
- - "Selenium tests with WebDriver for [browser]"
20
- - "Selenium Python Page Object Model tests"
21
- - "Headless Selenium tests for [feature]"
22
- - "Selenium tests with explicit waits"
23
- - "Heal my failing Selenium tests"
24
-
25
- ## Key Features
26
-
27
- | Feature | Description |
28
- | ------- | ----------- |
29
- | **WebDriver** | Chrome, Firefox, Edge, Safari via Selenium WebDriver |
30
- | **Explicit waits** | WebDriverWait + expected_conditions; avoid implicit waits |
31
- | **Implicit waits** | Fallback only; prefer explicit waits |
32
- | **Page Object Model** | POM with @property for locators; base page + page-specific classes |
33
- | **Headless mode** | Chrome/Firefox headless for CI and faster runs |
34
- | **ActionChains** | Complex interactions: drag-drop, hover, key combos |
35
- | **Select** | Dropdown handling via Select class |
36
- | **pytest integration** | Fixtures for driver setup/teardown, conftest.py |
37
-
38
- ## Workflow
39
-
40
- 1. **Read test cases** — From specs, requirements, manual test designs, or browser-collected data
41
- 2. **Analyze app** — Inspect pages, forms, flows; identify locators and interactions
42
- 3. **Generate tests with POM** — Produce `test_{feature}.py` with Page Objects
43
- 4. **Configure WebDriver** — Set up driver fixtures, headless options, timeouts
44
- 5. **Run** — User runs `pytest` to execute tests
45
-
46
- ## Context7 MCP
47
-
48
- Use **Context7 MCP** for Selenium Python documentation when:
49
- - WebDriver API or expected_conditions syntax is uncertain
50
- - ActionChains, Select, or alert handling needs verification
51
- - Browser-specific options (Chrome, Firefox headless) require up-to-date reference
52
-
53
- ## Key Patterns
54
-
55
- | Pattern | Usage |
56
- | ------- | ----- |
57
- | `driver.get(url)` | Navigate to URL |
58
- | `driver.find_element(By.ID, "id")` | Find by ID |
59
- | `driver.find_element(By.CSS_SELECTOR, "selector")` | Find by CSS |
60
- | `driver.find_element(By.XPATH, "xpath")` | Find by XPath |
61
- | `driver.find_element(By.NAME, "name")` | Find by name |
62
- | `driver.find_element(By.CLASS_NAME, "class")` | Find by class |
63
- | `WebDriverWait(driver, timeout).until(EC.visibility_of_element_located(...))` | Explicit wait |
64
- | POM with `@property` | Encapsulate locators in page classes |
65
- | `ActionChains(driver)` | Drag, hover, key combos |
66
- | `Select(element)` | Dropdown select by value/text/index |
67
-
68
- ## Wait Strategies
69
-
70
- Prefer explicit waits; avoid implicit waits for reliability:
71
-
72
- ```python
73
- from selenium.webdriver.support.ui import WebDriverWait
74
- from selenium.webdriver.support import expected_conditions as EC
75
- from selenium.webdriver.common.by import By
76
-
77
- wait = WebDriverWait(driver, 10)
78
- element = wait.until(EC.visibility_of_element_located((By.ID, "submit-btn")))
79
- element.click()
80
- ```
81
-
82
- Common expected conditions: `visibility_of_element_located`, `element_to_be_clickable`, `presence_of_element_located`, `text_to_be_present_in_element`, `url_contains`.
83
-
84
- ## pytest Integration
85
-
86
- - **Fixtures** — `driver` fixture for setup/teardown; scope function or class
87
- - **conftest.py** — Shared driver factory, base URL, browser options
88
- - **File naming** — `test_{feature}.py` (e.g., `test_login.py`, `test_checkout.py`)
89
-
90
- See `references/config.md` for pytest + Selenium setup.
91
-
92
- ## File Naming
93
-
94
- - `test_{feature}.py` — Preferred (e.g., `test_login.py`, `test_search.py`)
95
- - Page objects: `pages/{page_name}_page.py` or `page_objects/{name}.py`
96
- - Place in `tests/` per project convention
97
-
98
- ## Scope
99
-
100
- **Can do (autonomous):**
101
- - Generate Selenium Python E2E tests from test case specs
102
- - Apply Page Object Model with @property locators
103
- - Use explicit waits (WebDriverWait + expected_conditions)
104
- - Configure WebDriver (Chrome, Firefox, Edge, headless)
105
- - Use ActionChains for complex interactions; Select for dropdowns
106
- - Integrate with pytest via fixtures and conftest.py
107
- - Use Context7 MCP for Selenium Python docs
108
- - Delegate to qa-test-healer when tests fail (Heal Mode)
109
-
110
- **Cannot do (requires confirmation):**
111
- - Change production code structure
112
- - Add dependencies not in requirements.txt
113
- - Override project Selenium/pytest config without approval
114
- - Navigate to URLs not provided
115
-
116
- **Will not do (out of scope):**
117
- - Execute tests (user runs `pytest`)
118
- - Write Playwright/Cypress tests (use qa-playwright-ts-writer, qa-cypress-writer)
119
- - Modify CI/CD pipelines
120
- - Bypass security or access restricted areas
121
-
122
- ## References
123
-
124
- - `references/patterns.md` — Locators, waits, POM, ActionChains, Select, file upload, alerts, frames, windows
125
- - `references/config.md` — WebDriver manager, pytest integration, headless config
126
- - `references/best-practices.md` — Explicit waits, POM, stable locators, driver management
127
-
128
- ## Quality Checklist
129
-
130
- - [ ] Explicit waits used; avoid implicit waits where possible
131
- - [ ] No hardcoded sleeps; prefer WebDriverWait + expected_conditions
132
- - [ ] POM pattern applied for page-specific logic
133
- - [ ] Stable locators (ID, data attributes, CSS; XPath as fallback)
134
- - [ ] Tests independent (no shared state, order-independent)
135
- - [ ] Proper teardown (driver.quit in fixture)
136
- - [ ] Traceability to test case IDs where applicable
137
- - [ ] No hardcoded secrets (use env vars)
138
- - [ ] File naming follows `test_{feature}.py` convention
139
-
140
- ## Troubleshooting
141
-
142
- | Symptom | Likely Cause | Fix |
143
- | ------- | ------------ | --- |
144
- | Element not found | Selector too specific, timing | Use explicit wait; prefer ID/CSS over fragile XPath |
145
- | StaleElementReferenceException | DOM changed after find | Re-find element before interaction; use explicit wait |
146
- | Timeout | Element not ready, slow page | Increase WebDriverWait timeout; check for overlays/modals |
147
- | Flaky tests | Implicit wait, race conditions | Replace implicit with explicit waits; ensure test isolation |
148
- | Driver not found | WebDriver binary missing | Use webdriver-manager; ensure browser installed |
149
- | Headless fails | Browser options incorrect | Verify Chrome/Firefox headless options for your Selenium version |
150
- | Select fails | Not a select element | Use Select only on `<select>` elements; check element type |
@@ -1,175 +0,0 @@
1
- # Selenium Python Best Practices
2
-
3
- Guidelines for maintainable, reliable Selenium E2E tests.
4
-
5
- ## Explicit Waits (Never Implicit)
6
-
7
- **Always use explicit waits** for element availability. Implicit waits apply globally and can cause unpredictable behavior when combined with explicit waits.
8
-
9
- ```python
10
- # Good
11
- element = WebDriverWait(driver, 10).until(
12
- EC.visibility_of_element_located((By.ID, "submit"))
13
- )
14
- element.click()
15
-
16
- # Bad
17
- driver.implicitly_wait(10) # Avoid; masks timing issues
18
- driver.find_element(By.ID, "submit").click()
19
- ```
20
-
21
- **Exception:** A single short implicit wait (e.g., 2–5 seconds) at driver init can reduce boilerplate for stable pages, but explicit waits are still preferred for critical interactions.
22
-
23
- ## Page Object Model (POM)
24
-
25
- Encapsulate page structure and actions in dedicated classes:
26
-
27
- ```python
28
- # pages/base.py
29
- class BasePage:
30
- def __init__(self, driver, base_url):
31
- self.driver = driver
32
- self.base_url = base_url
33
-
34
- def open(self, path=""):
35
- self.driver.get(f"{self.base_url}{path}")
36
-
37
- def find(self, by, value):
38
- return WebDriverWait(self.driver, 10).until(
39
- EC.visibility_of_element_located((by, value))
40
- )
41
-
42
-
43
- # pages/login.py
44
- class LoginPage(BasePage):
45
- @property
46
- def username(self):
47
- return self.find(By.ID, "username")
48
-
49
- @property
50
- def password(self):
51
- return self.find(By.ID, "password")
52
-
53
- def login(self, user, pwd):
54
- self.username.send_keys(user)
55
- self.password.send_keys(pwd)
56
- self.find(By.CSS_SELECTOR, "button[type='submit']").click()
57
- ```
58
-
59
- Benefits: reuse, easier maintenance, clearer tests.
60
-
61
- ## Stable Locators
62
-
63
- Prefer locators that are less likely to break when the UI changes:
64
-
65
- | Priority | Locator | Stability |
66
- | -------- | ------- | --------- |
67
- | 1 | By.ID | High (if IDs are stable) |
68
- | 2 | By.NAME | High for form fields |
69
- | 3 | data-testid | High (add to markup for tests) |
70
- | 4 | By.CSS_SELECTOR (semantic) | Medium |
71
- | 5 | By.XPATH (text) | Low (breaks with i18n) |
72
- | 6 | By.CLASS_NAME | Low (styling changes) |
73
-
74
- ```python
75
- # Prefer
76
- driver.find_element(By.ID, "login-form")
77
- driver.find_element(By.CSS_SELECTOR, "[data-testid='submit-btn']")
78
-
79
- # Avoid when possible
80
- driver.find_element(By.XPATH, "//div[@class='btn-primary']/span")
81
- driver.find_element(By.CLASS_NAME, "btn-primary") # Styling may change
82
- ```
83
-
84
- ## Driver Management
85
-
86
- - **One driver per test** — Use function-scoped fixtures to avoid shared state.
87
- - **Always quit** — Use `yield` in fixtures to ensure `driver.quit()` runs.
88
- - **Avoid global driver** — Prefer dependency injection via fixtures.
89
-
90
- ```python
91
- @pytest.fixture(scope="function")
92
- def driver():
93
- driver = webdriver.Chrome(options=options)
94
- try:
95
- yield driver
96
- finally:
97
- driver.quit()
98
- ```
99
-
100
- ## Test Isolation
101
-
102
- - Each test should be independent.
103
- - Do not rely on test execution order.
104
- - Reset application state when needed (e.g., logout, clear data).
105
- - Use fresh driver instances per test.
106
-
107
- ## Avoid Sleep
108
-
109
- Replace `time.sleep()` with explicit waits:
110
-
111
- ```python
112
- # Bad
113
- time.sleep(5)
114
- element.click()
115
-
116
- # Good
117
- WebDriverWait(driver, 10).until(
118
- EC.element_to_be_clickable((By.ID, "submit"))
119
- ).click()
120
- ```
121
-
122
- ## ActionChains for Complex Interactions
123
-
124
- Use ActionChains for hover, drag-and-drop, and modifier keys:
125
-
126
- ```python
127
- from selenium.webdriver.common.action_chains import ActionChains
128
-
129
- actions = ActionChains(driver)
130
- actions.move_to_element(menu).click(submenu).perform()
131
- ```
132
-
133
- ## Select for Dropdowns
134
-
135
- Use the `Select` class instead of raw clicks for `<select>` elements:
136
-
137
- ```python
138
- from selenium.webdriver.support.ui import Select
139
-
140
- select = Select(driver.find_element(By.ID, "country"))
141
- select.select_by_visible_text("United States")
142
- ```
143
-
144
- ## Screenshots on Failure
145
-
146
- ```python
147
- # conftest.py
148
- @pytest.hookimpl(tryfirst=True, hookwrapper=True)
149
- def pytest_runtest_makereport(item, call):
150
- outcome = yield
151
- report = outcome.get_result()
152
- if report.when == "call" and report.failed:
153
- driver = item.funcargs.get("driver", None)
154
- if driver:
155
- driver.save_screenshot(f"failure_{item.name}.png")
156
- ```
157
-
158
- ## Anti-Patterns to Avoid
159
-
160
- | Anti-Pattern | Better Approach |
161
- | ------------ | --------------- |
162
- | Implicit wait as primary strategy | Explicit WebDriverWait + EC |
163
- | `time.sleep()` for synchronization | WebDriverWait with expected conditions |
164
- | Raw XPATH with long chains | ID, data-testid, or shorter CSS |
165
- | Shared mutable driver across tests | Function-scoped fixture |
166
- | Hardcoded credentials | Env vars, fixtures, or test config |
167
- | Asserting implementation details | Assert user-visible outcomes |
168
- | One giant test | Split into focused scenarios |
169
-
170
- ## CI/CD Considerations
171
-
172
- - Use headless mode: `--headless=new` (Chrome).
173
- - Add `--no-sandbox` and `--disable-dev-shm-usage` for Docker/CI.
174
- - Use webdriver-manager or pre-installed drivers.
175
- - Consider retries for flaky tests: `pytest --reruns 2`.