qa-skills 3.0.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.
- package/README.md +168 -0
- package/bin/cli.js +42 -0
- package/dist/agents/registry.d.ts +5 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +101 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/types.d.ts +9 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/dependencies.d.ts +21 -0
- package/dist/dependencies.d.ts.map +1 -0
- package/dist/dependencies.js +125 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/installer.d.ts +25 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +437 -0
- package/dist/installer.js.map +1 -0
- package/dist/scaffold.d.ts +27 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +182 -0
- package/dist/scaffold.js.map +1 -0
- package/package.json +40 -0
- package/skills/qa-accessibility-test-writer/SKILL.md +127 -0
- package/skills/qa-accessibility-test-writer/references/axe-core-patterns.md +349 -0
- package/skills/qa-accessibility-test-writer/references/best-practices.md +184 -0
- package/skills/qa-accessibility-test-writer/references/wcag-tests.md +331 -0
- package/skills/qa-api-contract-curator/SKILL.md +104 -0
- package/skills/qa-api-contract-curator/references/breaking-changes.md +363 -0
- package/skills/qa-api-contract-curator/references/openapi-structure.md +404 -0
- package/skills/qa-browser-data-collector/SKILL.md +132 -0
- package/skills/qa-browser-data-collector/references/data-collection-checklist.md +91 -0
- package/skills/qa-browser-data-collector/references/playwright-mcp-patterns.md +113 -0
- package/skills/qa-bug-ticket-creator/SKILL.md +148 -0
- package/skills/qa-bug-ticket-creator/references/bug-report-format.md +149 -0
- package/skills/qa-bug-ticket-creator/references/severity-guide.md +81 -0
- package/skills/qa-bug-ticket-creator/templates/bug-ticket-template.md +39 -0
- package/skills/qa-changelog-analyzer/SKILL.md +134 -0
- package/skills/qa-changelog-analyzer/references/git-analysis-patterns.md +138 -0
- package/skills/qa-changelog-analyzer/references/impact-mapping.md +120 -0
- package/skills/qa-clickup-integration/SKILL.md +166 -0
- package/skills/qa-clickup-integration/references/api-patterns.md +102 -0
- package/skills/qa-clickup-integration/references/field-mapping.md +71 -0
- package/skills/qa-codeceptjs-writer/SKILL.md +136 -0
- package/skills/qa-codeceptjs-writer/references/best-practices.md +207 -0
- package/skills/qa-codeceptjs-writer/references/config.md +255 -0
- package/skills/qa-codeceptjs-writer/references/patterns.md +285 -0
- package/skills/qa-coverage-analyzer/SKILL.md +166 -0
- package/skills/qa-coverage-analyzer/references/best-practices.md +142 -0
- package/skills/qa-coverage-analyzer/references/coverage-dimensions.md +155 -0
- package/skills/qa-coverage-analyzer/references/tools.md +204 -0
- package/skills/qa-cypress-writer/SKILL.md +134 -0
- package/skills/qa-cypress-writer/references/assertions.md +121 -0
- package/skills/qa-cypress-writer/references/best-practices.md +82 -0
- package/skills/qa-cypress-writer/references/config.md +121 -0
- package/skills/qa-cypress-writer/references/patterns.md +170 -0
- package/skills/qa-data-factory/SKILL.md +126 -0
- package/skills/qa-data-factory/references/factory-patterns.md +164 -0
- package/skills/qa-data-factory/references/faker-guide.md +131 -0
- package/skills/qa-diagram-generator/SKILL.md +125 -0
- package/skills/qa-diagram-generator/references/c4-model.md +53 -0
- package/skills/qa-diagram-generator/references/charts.md +58 -0
- package/skills/qa-diagram-generator/references/class-diagram.md +85 -0
- package/skills/qa-diagram-generator/references/er-diagram.md +69 -0
- package/skills/qa-diagram-generator/references/flowchart.md +92 -0
- package/skills/qa-diagram-generator/references/from-screenshot.md +45 -0
- package/skills/qa-diagram-generator/references/gantt.md +49 -0
- package/skills/qa-diagram-generator/references/journey.md +50 -0
- package/skills/qa-diagram-generator/references/mindmap.md +75 -0
- package/skills/qa-diagram-generator/references/sequence.md +69 -0
- package/skills/qa-diagram-generator/references/state-diagram.md +56 -0
- package/skills/qa-discovery-interview/SKILL.md +182 -0
- package/skills/qa-discovery-interview/references/completeness-checklist.md +53 -0
- package/skills/qa-discovery-interview/references/conflict-patterns.md +101 -0
- package/skills/qa-discovery-interview/references/qa-categories.md +147 -0
- package/skills/qa-discovery-interview/templates/qa-brief-template.md +168 -0
- package/skills/qa-environment-checker/SKILL.md +142 -0
- package/skills/qa-environment-checker/references/dependency-matrix.md +101 -0
- package/skills/qa-environment-checker/references/health-checks.md +209 -0
- package/skills/qa-environment-checker/templates/env-readiness-template.md +64 -0
- package/skills/qa-flaky-detector/SKILL.md +153 -0
- package/skills/qa-flaky-detector/references/ci-analysis.md +140 -0
- package/skills/qa-flaky-detector/references/flaky-patterns.md +247 -0
- package/skills/qa-github-issues-enhanced/SKILL.md +175 -0
- package/skills/qa-github-issues-enhanced/references/issue-templates.md +425 -0
- package/skills/qa-github-issues-enhanced/references/label-taxonomy.md +130 -0
- package/skills/qa-github-issues-enhanced/references/workflow-patterns.md +188 -0
- package/skills/qa-httpx-writer/SKILL.md +138 -0
- package/skills/qa-httpx-writer/references/assertions.md +195 -0
- package/skills/qa-httpx-writer/references/best-practices.md +140 -0
- package/skills/qa-httpx-writer/references/config.md +212 -0
- package/skills/qa-httpx-writer/references/patterns.md +262 -0
- package/skills/qa-jest-writer/SKILL.md +131 -0
- package/skills/qa-jest-writer/references/assertions.md +125 -0
- package/skills/qa-jest-writer/references/best-practices.md +136 -0
- package/skills/qa-jest-writer/references/config.md +134 -0
- package/skills/qa-jest-writer/references/patterns.md +172 -0
- package/skills/qa-jira-integration/SKILL.md +135 -0
- package/skills/qa-jira-integration/references/api-patterns.md +143 -0
- package/skills/qa-jira-integration/references/field-mapping.md +79 -0
- package/skills/qa-jira-integration/references/xray-integration.md +85 -0
- package/skills/qa-jmeter-writer/SKILL.md +171 -0
- package/skills/qa-jmeter-writer/references/best-practices.md +157 -0
- package/skills/qa-jmeter-writer/references/config.md +204 -0
- package/skills/qa-jmeter-writer/references/patterns.md +242 -0
- package/skills/qa-junit5-writer/SKILL.md +157 -0
- package/skills/qa-junit5-writer/references/assertions.md +118 -0
- package/skills/qa-junit5-writer/references/config.md +97 -0
- package/skills/qa-junit5-writer/references/patterns.md +162 -0
- package/skills/qa-k6-writer/SKILL.md +155 -0
- package/skills/qa-k6-writer/references/best-practices.md +236 -0
- package/skills/qa-k6-writer/references/config.md +219 -0
- package/skills/qa-k6-writer/references/patterns.md +304 -0
- package/skills/qa-linear-integration/SKILL.md +137 -0
- package/skills/qa-linear-integration/references/api-patterns.md +249 -0
- package/skills/qa-linear-integration/references/field-mapping.md +121 -0
- package/skills/qa-locust-writer/SKILL.md +151 -0
- package/skills/qa-locust-writer/references/best-practices.md +126 -0
- package/skills/qa-locust-writer/references/config.md +170 -0
- package/skills/qa-locust-writer/references/patterns.md +235 -0
- package/skills/qa-manual-test-designer/SKILL.md +145 -0
- package/skills/qa-manual-test-designer/references/exploratory-charters.md +138 -0
- package/skills/qa-manual-test-designer/references/personas.md +146 -0
- package/skills/qa-manual-test-designer/templates/exploratory-charter-template.md +47 -0
- package/skills/qa-manual-test-designer/templates/test-case-template.md +31 -0
- package/skills/qa-mobile-test-writer/SKILL.md +144 -0
- package/skills/qa-mobile-test-writer/references/best-practices.md +214 -0
- package/skills/qa-mobile-test-writer/references/config.md +309 -0
- package/skills/qa-mobile-test-writer/references/patterns.md +304 -0
- package/skills/qa-nfr-analyst/SKILL.md +177 -0
- package/skills/qa-nfr-analyst/references/iso-25010-model.md +159 -0
- package/skills/qa-nfr-analyst/references/owasp-wstg-baseline.md +202 -0
- package/skills/qa-nfr-analyst/references/wcag-checklist.md +184 -0
- package/skills/qa-nfr-analyst/templates/owasp-checklist-template.md +89 -0
- package/skills/qa-nfr-analyst/templates/wcag-checklist-template.md +48 -0
- package/skills/qa-orchestrator/SKILL.md +132 -0
- package/skills/qa-orchestrator/references/handoff-chains.md +105 -0
- package/skills/qa-orchestrator/references/pipeline-modes.md +115 -0
- package/skills/qa-orchestrator/references/scheduler-rules.md +84 -0
- package/skills/qa-pact-writer/SKILL.md +133 -0
- package/skills/qa-pact-writer/references/best-practices.md +100 -0
- package/skills/qa-pact-writer/references/config.md +135 -0
- package/skills/qa-pact-writer/references/patterns.md +161 -0
- package/skills/qa-plan-creator/SKILL.md +139 -0
- package/skills/qa-plan-creator/references/introduction-plan.md +43 -0
- package/skills/qa-plan-creator/references/migration-plan.md +44 -0
- package/skills/qa-plan-creator/references/onboarding-plan.md +46 -0
- package/skills/qa-plan-creator/references/performance-plan.md +44 -0
- package/skills/qa-plan-creator/references/regression-plan.md +45 -0
- package/skills/qa-plan-creator/references/release-plan.md +45 -0
- package/skills/qa-plan-creator/references/sprint-plan.md +44 -0
- package/skills/qa-plan-creator/references/test-plan.md +59 -0
- package/skills/qa-plan-creator/references/uat-plan.md +43 -0
- package/skills/qa-plan-creator/templates/checklist-template.md +36 -0
- package/skills/qa-plan-creator/templates/regression-checklist-template.md +49 -0
- package/skills/qa-plan-creator/templates/release-checklist-template.md +46 -0
- package/skills/qa-plan-creator/templates/test-plan-template.md +74 -0
- package/skills/qa-playwright-py-writer/SKILL.md +156 -0
- package/skills/qa-playwright-py-writer/references/best-practices.md +194 -0
- package/skills/qa-playwright-py-writer/references/config.md +195 -0
- package/skills/qa-playwright-py-writer/references/patterns.md +212 -0
- package/skills/qa-playwright-ts-writer/SKILL.md +151 -0
- package/skills/qa-playwright-ts-writer/references/assertions.md +109 -0
- package/skills/qa-playwright-ts-writer/references/best-practices.md +191 -0
- package/skills/qa-playwright-ts-writer/references/config.md +144 -0
- package/skills/qa-playwright-ts-writer/references/patterns.md +171 -0
- package/skills/qa-pytest-writer/SKILL.md +145 -0
- package/skills/qa-pytest-writer/references/assertions.md +149 -0
- package/skills/qa-pytest-writer/references/best-practices.md +97 -0
- package/skills/qa-pytest-writer/references/config.md +176 -0
- package/skills/qa-pytest-writer/references/patterns.md +251 -0
- package/skills/qa-qase-integration/SKILL.md +149 -0
- package/skills/qa-qase-integration/references/api-reference.md +354 -0
- package/skills/qa-qase-integration/references/ci-integration.md +196 -0
- package/skills/qa-qase-integration/references/field-mapping.md +157 -0
- package/skills/qa-requirements-generator/SKILL.md +152 -0
- package/skills/qa-requirements-generator/references/iso-29148-structure.md +153 -0
- package/skills/qa-requirements-generator/references/requirement-patterns.md +278 -0
- package/skills/qa-rest-assured-writer/SKILL.md +137 -0
- package/skills/qa-rest-assured-writer/references/best-practices.md +50 -0
- package/skills/qa-rest-assured-writer/references/config.md +124 -0
- package/skills/qa-rest-assured-writer/references/patterns.md +192 -0
- package/skills/qa-risk-analyzer/SKILL.md +158 -0
- package/skills/qa-risk-analyzer/references/impact-analysis.md +133 -0
- package/skills/qa-risk-analyzer/references/risk-factors.md +123 -0
- package/skills/qa-robot-framework-writer/SKILL.md +147 -0
- package/skills/qa-robot-framework-writer/references/best-practices.md +249 -0
- package/skills/qa-robot-framework-writer/references/config.md +204 -0
- package/skills/qa-robot-framework-writer/references/libraries.md +273 -0
- package/skills/qa-robot-framework-writer/references/patterns.md +216 -0
- package/skills/qa-security-test-writer/SKILL.md +123 -0
- package/skills/qa-security-test-writer/references/best-practices.md +155 -0
- package/skills/qa-security-test-writer/references/owasp-top10.md +331 -0
- package/skills/qa-security-test-writer/references/zap-config.md +258 -0
- package/skills/qa-selenium-java-writer/SKILL.md +143 -0
- package/skills/qa-selenium-java-writer/references/best-practices.md +59 -0
- package/skills/qa-selenium-java-writer/references/config.md +143 -0
- package/skills/qa-selenium-java-writer/references/patterns.md +170 -0
- package/skills/qa-selenium-py-writer/SKILL.md +150 -0
- package/skills/qa-selenium-py-writer/references/best-practices.md +175 -0
- package/skills/qa-selenium-py-writer/references/config.md +224 -0
- package/skills/qa-selenium-py-writer/references/patterns.md +255 -0
- package/skills/qa-shortcut-integration/SKILL.md +143 -0
- package/skills/qa-shortcut-integration/references/api-patterns.md +126 -0
- package/skills/qa-shortcut-integration/references/field-mapping.md +66 -0
- package/skills/qa-spec-auditor/SKILL.md +162 -0
- package/skills/qa-spec-auditor/references/audit-checklist.md +144 -0
- package/skills/qa-spec-auditor/references/drift-patterns.md +207 -0
- package/skills/qa-spec-writer/SKILL.md +143 -0
- package/skills/qa-spec-writer/references/gherkin-guide.md +253 -0
- package/skills/qa-spec-writer/references/specification-patterns.md +274 -0
- package/skills/qa-spring-test-writer/SKILL.md +170 -0
- package/skills/qa-spring-test-writer/references/best-practices.md +57 -0
- package/skills/qa-spring-test-writer/references/config.md +179 -0
- package/skills/qa-spring-test-writer/references/patterns.md +235 -0
- package/skills/qa-supertest-writer/SKILL.md +150 -0
- package/skills/qa-supertest-writer/references/assertions.md +192 -0
- package/skills/qa-supertest-writer/references/best-practices.md +102 -0
- package/skills/qa-supertest-writer/references/config.md +166 -0
- package/skills/qa-supertest-writer/references/patterns.md +242 -0
- package/skills/qa-task-creator/SKILL.md +142 -0
- package/skills/qa-task-creator/references/linking-patterns.md +127 -0
- package/skills/qa-task-creator/references/task-types.md +169 -0
- package/skills/qa-task-creator/templates/task-template.md +24 -0
- package/skills/qa-test-doc-compiler/SKILL.md +114 -0
- package/skills/qa-test-doc-compiler/references/agile-tailoring.md +220 -0
- package/skills/qa-test-doc-compiler/references/iso-29119-3-documents.md +302 -0
- package/skills/qa-test-healer/SKILL.md +101 -0
- package/skills/qa-test-healer/references/diagnosis-patterns.md +142 -0
- package/skills/qa-test-healer/references/fix-strategies.md +177 -0
- package/skills/qa-test-reporter/SKILL.md +130 -0
- package/skills/qa-test-reporter/references/best-practices.md +162 -0
- package/skills/qa-test-reporter/references/iso-29119-reports.md +236 -0
- package/skills/qa-test-reporter/references/report-formats.md +287 -0
- package/skills/qa-test-reviewer/SKILL.md +142 -0
- package/skills/qa-test-reviewer/references/anti-patterns.md +268 -0
- package/skills/qa-test-reviewer/references/review-checklist.md +93 -0
- package/skills/qa-test-strategy/SKILL.md +133 -0
- package/skills/qa-test-strategy/references/entry-exit-criteria.md +176 -0
- package/skills/qa-test-strategy/references/risk-matrix.md +102 -0
- package/skills/qa-test-strategy/references/testing-types.md +143 -0
- package/skills/qa-testcase-from-docs/SKILL.md +161 -0
- package/skills/qa-testcase-from-docs/references/test-case-format.md +196 -0
- package/skills/qa-testcase-from-docs/references/test-design-techniques.md +126 -0
- package/skills/qa-testcase-from-docs/templates/test-case-template.md +31 -0
- package/skills/qa-testcase-from-ui/SKILL.md +109 -0
- package/skills/qa-testcase-from-ui/references/ui-element-patterns.md +126 -0
- package/skills/qa-testcase-from-ui/references/visual-analysis-guide.md +146 -0
- package/skills/qa-testcase-from-ui/templates/test-case-template.md +31 -0
- package/skills/qa-visual-regression-writer/SKILL.md +175 -0
- package/skills/qa-visual-regression-writer/references/best-practices.md +154 -0
- package/skills/qa-visual-regression-writer/references/config.md +220 -0
- package/skills/qa-visual-regression-writer/references/patterns.md +213 -0
- package/skills/qa-vitest-writer/SKILL.md +141 -0
- package/skills/qa-vitest-writer/references/assertions.md +105 -0
- package/skills/qa-vitest-writer/references/best-practices.md +62 -0
- package/skills/qa-vitest-writer/references/config.md +127 -0
- package/skills/qa-vitest-writer/references/patterns.md +141 -0
- package/skills/qa-webdriverio-writer/SKILL.md +145 -0
- package/skills/qa-webdriverio-writer/references/best-practices.md +176 -0
- package/skills/qa-webdriverio-writer/references/config.md +240 -0
- package/skills/qa-webdriverio-writer/references/patterns.md +269 -0
|
@@ -0,0 +1,170 @@
|
|
|
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
|
+
```
|
|
@@ -0,0 +1,150 @@
|
|
|
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 |
|
|
@@ -0,0 +1,175 @@
|
|
|
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`.
|