QA Selenium Java Writer
Purpose
Write Selenium Java 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 Java test files with JUnit 5, Page Object Model, explicit waits, AssertJ assertions, and Allure reporting.
Trigger Phrases
- "Write Selenium Java tests for [feature/flow]"
- "Generate Selenium E2E tests in Java"
- "Create Selenium Java tests with POM"
- "Add Selenium Java tests for [URL/page]"
- "Selenium Java with JUnit 5 and Allure"
- "Selenium Java Page Object Model tests"
- "Headless Selenium Java tests for [feature]"
- "Selenium Java tests with WebDriverWait"
- "Heal my failing Selenium Java tests"
Key Features
| Feature |
Description |
| Java 21+ |
Modern Java with records, pattern matching, virtual threads support |
| Selenium WebDriver |
Chrome, Firefox, Edge via WebDriver API |
| JUnit 5 |
@Test, @BeforeEach/@AfterEach, @DisplayName, @Tag |
| Page Object Model |
POM with PageFactory; base page + page-specific classes |
| Explicit waits |
WebDriverWait + ExpectedConditions; avoid implicit waits |
| AssertJ |
Fluent assertions: assertThat(element).isDisplayed().isEnabled() |
| Allure |
@Step, @Description, @Severity, @Epic, @Feature for reporting |
| Headless mode |
Chrome/Firefox headless for CI |
| Parallel execution |
maven-surefire-plugin parallel configuration |
Workflow
- Read test cases — From specs, requirements, manual test designs, or browser-collected data
- Analyze app — Inspect pages, forms, flows; identify locators and interactions
- Generate test classes with POM — Produce
{Feature}Test.java with Page Objects in pages/
- Configure WebDriver — Set up driver lifecycle, headless options, timeouts
- Add Allure annotations — @Step for steps, @Description, @Severity for reporting
- Run — User runs
mvn test or ./gradlew test to execute tests
Context7 MCP
Use Context7 MCP for Selenium Java documentation when:
- WebDriver API or ExpectedConditions syntax is uncertain
- PageFactory, Actions, or Select handling needs verification
- Browser-specific options (Chrome, Firefox headless) require up-to-date reference
Key Patterns
| Pattern |
Usage |
@Test |
JUnit 5 test method |
@BeforeEach / @AfterEach |
Driver setup and teardown |
WebDriverWait(driver, Duration.ofSeconds(10)) |
Explicit wait |
ExpectedConditions.visibilityOfElementLocated(By.id("id")) |
Wait for element |
PageFactory.initElements(driver, PageClass.class) |
POM initialization |
assertThat(element).isDisplayed().isEnabled() |
AssertJ assertions |
@Step("User clicks submit") |
Allure step |
@Description("Verify login flow") |
Allure description |
@Severity(SeverityLevel.CRITICAL) |
Allure severity |
Wait Strategies
Prefer explicit waits; avoid implicit waits for reliability:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("submit-btn")));
element.click();
Common expected conditions: visibilityOfElementLocated, elementToBeClickable, presenceOfElementLocated, textToBePresentInElement, urlContains.
File Naming
{Feature}Test.java — Test classes (e.g., LoginTest.java, CheckoutTest.java)
pages/{Feature}Page.java — Page objects (e.g., pages/LoginPage.java, pages/CheckoutPage.java)
- Place in
src/test/java per Maven/Gradle convention
Scope
Can do (autonomous):
- Generate Selenium Java E2E tests from test case specs
- Apply Page Object Model with PageFactory
- Use explicit waits (WebDriverWait + ExpectedConditions)
- Configure WebDriver (Chrome, Firefox, Edge, headless)
- Use AssertJ for fluent assertions
- Add Allure annotations for reporting
- Configure maven-surefire-plugin for parallel execution
- Use Context7 MCP for Selenium Java docs
- Delegate to qa-test-healer when tests fail (Heal Mode)
Cannot do (requires confirmation):
- Change production code structure
- Add dependencies not in pom.xml/build.gradle
- Override project Selenium/JUnit config without approval
- Navigate to URLs not provided
Will not do (out of scope):
- Execute tests (user runs
mvn test)
- Write Playwright/Cypress tests (use qa-playwright-ts-writer, qa-cypress-writer)
- Modify CI/CD pipelines
- Bypass security or access restricted areas
References
references/patterns.md — POM, waits, selectors, actions, Select, alerts, frames
references/config.md — Maven/Gradle config, WebDriver setup, parallel execution
references/best-practices.md — Java Selenium best practices
Quality Checklist
Troubleshooting
| Symptom |
Likely Cause |
Fix |
| Element not found |
Selector too specific, timing |
Use explicit wait; prefer ID/CSS over fragile XPath |
| StaleElementReferenceException |
DOM changed after find |
Re-find element before interaction; use explicit wait |
| Timeout |
Element not ready, slow page |
Increase WebDriverWait timeout; check for overlays/modals |
| Flaky tests |
Implicit wait, race conditions |
Replace implicit with explicit waits; ensure test isolation |
| Driver not found |
WebDriver binary missing |
Use WebDriverManager; ensure browser installed |
| Headless fails |
Browser options incorrect |
Verify Chrome/Firefox headless options for your Selenium version |
| PageFactory null |
Not initialized |
Call PageFactory.initElements in constructor or @BeforeEach |
| Allure not showing |
Surefire config missing |
Add allure-maven-plugin and surefire properties |
1---2name: qa-selenium-java-writer3description: Generate Selenium Java E2E tests with JUnit 5, Page Object Model, explicit waits, AssertJ assertions, and Allure reporting integration.4---56# QA Selenium Java Writer78## Purpose910Write Selenium Java 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 Java test files with JUnit 5, Page Object Model, explicit waits, AssertJ assertions, and Allure reporting.1112## Trigger Phrases1314- "Write Selenium Java tests for [feature/flow]"15- "Generate Selenium E2E tests in Java"16- "Create Selenium Java tests with POM"17- "Add Selenium Java tests for [URL/page]"18- "Selenium Java with JUnit 5 and Allure"19- "Selenium Java Page Object Model tests"20- "Headless Selenium Java tests for [feature]"21- "Selenium Java tests with WebDriverWait"22- "Heal my failing Selenium Java tests"2324## Key Features2526| Feature | Description |27| ------- | ----------- |28| **Java 21+** | Modern Java with records, pattern matching, virtual threads support |29| **Selenium WebDriver** | Chrome, Firefox, Edge via WebDriver API |30| **JUnit 5** | @Test, @BeforeEach/@AfterEach, @DisplayName, @Tag |31| **Page Object Model** | POM with PageFactory; base page + page-specific classes |32| **Explicit waits** | WebDriverWait + ExpectedConditions; avoid implicit waits |33| **AssertJ** | Fluent assertions: assertThat(element).isDisplayed().isEnabled() |34| **Allure** | @Step, @Description, @Severity, @Epic, @Feature for reporting |35| **Headless mode** | Chrome/Firefox headless for CI |36| **Parallel execution** | maven-surefire-plugin parallel configuration |3738## Workflow39401. **Read test cases** — From specs, requirements, manual test designs, or browser-collected data412. **Analyze app** — Inspect pages, forms, flows; identify locators and interactions423. **Generate test classes with POM** — Produce `{Feature}Test.java` with Page Objects in `pages/`434. **Configure WebDriver** — Set up driver lifecycle, headless options, timeouts445. **Add Allure annotations** — @Step for steps, @Description, @Severity for reporting456. **Run** — User runs `mvn test` or `./gradlew test` to execute tests4647## Context7 MCP4849Use **Context7 MCP** for Selenium Java documentation when:50- WebDriver API or ExpectedConditions syntax is uncertain51- PageFactory, Actions, or Select handling needs verification52- Browser-specific options (Chrome, Firefox headless) require up-to-date reference5354## Key Patterns5556| Pattern | Usage |57| ------- | ----- |58| `@Test` | JUnit 5 test method |59| `@BeforeEach` / `@AfterEach` | Driver setup and teardown |60| `WebDriverWait(driver, Duration.ofSeconds(10))` | Explicit wait |61| `ExpectedConditions.visibilityOfElementLocated(By.id("id"))` | Wait for element |62| `PageFactory.initElements(driver, PageClass.class)` | POM initialization |63| `assertThat(element).isDisplayed().isEnabled()` | AssertJ assertions |64| `@Step("User clicks submit")` | Allure step |65| `@Description("Verify login flow")` | Allure description |66| `@Severity(SeverityLevel.CRITICAL)` | Allure severity |6768## Wait Strategies6970Prefer explicit waits; avoid implicit waits for reliability:7172```java73WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));74WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("submit-btn")));75element.click();76```7778Common expected conditions: `visibilityOfElementLocated`, `elementToBeClickable`, `presenceOfElementLocated`, `textToBePresentInElement`, `urlContains`.7980## File Naming8182- `{Feature}Test.java` — Test classes (e.g., `LoginTest.java`, `CheckoutTest.java`)83- `pages/{Feature}Page.java` — Page objects (e.g., `pages/LoginPage.java`, `pages/CheckoutPage.java`)84- Place in `src/test/java` per Maven/Gradle convention8586## Scope8788**Can do (autonomous):**89- Generate Selenium Java E2E tests from test case specs90- Apply Page Object Model with PageFactory91- Use explicit waits (WebDriverWait + ExpectedConditions)92- Configure WebDriver (Chrome, Firefox, Edge, headless)93- Use AssertJ for fluent assertions94- Add Allure annotations for reporting95- Configure maven-surefire-plugin for parallel execution96- Use Context7 MCP for Selenium Java docs97- Delegate to qa-test-healer when tests fail (Heal Mode)9899**Cannot do (requires confirmation):**100- Change production code structure101- Add dependencies not in pom.xml/build.gradle102- Override project Selenium/JUnit config without approval103- Navigate to URLs not provided104105**Will not do (out of scope):**106- Execute tests (user runs `mvn test`)107- Write Playwright/Cypress tests (use qa-playwright-ts-writer, qa-cypress-writer)108- Modify CI/CD pipelines109- Bypass security or access restricted areas110111## References112113- `references/patterns.md` — POM, waits, selectors, actions, Select, alerts, frames114- `references/config.md` — Maven/Gradle config, WebDriver setup, parallel execution115- `references/best-practices.md` — Java Selenium best practices116117## Quality Checklist118119- [ ] Explicit waits used; avoid implicit waits where possible120- [ ] No Thread.sleep; prefer WebDriverWait + ExpectedConditions121- [ ] POM pattern applied with PageFactory122- [ ] Stable locators (ID, data attributes, CSS; XPath as fallback)123- [ ] Tests independent (no shared state, order-independent)124- [ ] Proper teardown (driver.quit in @AfterEach)125- [ ] AssertJ used for assertions126- [ ] Allure annotations (@Step, @Description, @Severity) where applicable127- [ ] Traceability to test case IDs where applicable128- [ ] No hardcoded secrets (use env vars)129- [ ] File naming follows `{Feature}Test.java` convention130131## Troubleshooting132133| Symptom | Likely Cause | Fix |134| ------- | ------------ | --- |135| Element not found | Selector too specific, timing | Use explicit wait; prefer ID/CSS over fragile XPath |136| StaleElementReferenceException | DOM changed after find | Re-find element before interaction; use explicit wait |137| Timeout | Element not ready, slow page | Increase WebDriverWait timeout; check for overlays/modals |138| Flaky tests | Implicit wait, race conditions | Replace implicit with explicit waits; ensure test isolation |139| Driver not found | WebDriver binary missing | Use WebDriverManager; ensure browser installed |140| Headless fails | Browser options incorrect | Verify Chrome/Firefox headless options for your Selenium version |141| PageFactory null | Not initialized | Call PageFactory.initElements in constructor or @BeforeEach |142| Allure not showing | Surefire config missing | Add allure-maven-plugin and surefire properties |