From test-automation-skills-agents
Creates, debugs, and runs Selenium WebDriver tests in Java with JUnit 5 and Maven. Implements Page Object Model, explicit waits, AssertJ assertions, screenshots, and multi-browser support (Chrome, Firefox, Edge).
How this skill is triggered — by the user, by Claude, or both
Slash command
/test-automation-skills-agents:webapp-selenium-testingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill provides patterns and best practices for browser-based test automation using Selenium WebDriver within a Java/Maven environment.
This skill provides patterns and best practices for browser-based test automation using Selenium WebDriver within a Java/Maven environment.
Activation: This skill is triggered when you need to create Selenium tests, debug browser automation, implement Page Objects, or set up Java test infrastructure.
| Component | Requirement |
|---|---|
| Java JDK | 11 or higher (17+ recommended) |
| Maven | 3.6 or higher |
| Browser | Chrome, Firefox, or Edge |
Note: Selenium Manager (included in Selenium 4.6+) automatically handles browser driver binaries.
Separate page interaction logic from test code:
src/
├── main/java/
│ └── com/example/
│ ├── pages/ # Page Object classes
│ │ └── LoginPage.java
│ ├── components/ # Reusable UI components
│ ├── factories/ # WebDriver factory
│ ├── utils/ # Utilities
│ └── base/ # Base classes
└── test/java/
└── com/example/
└── tests/ # Test classes
└── LoginTest.java
Always use explicit waits over Thread.sleep():
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(
ExpectedConditions.visibilityOfElementLocated(By.id("element-id"))
);
import static org.assertj.core.api.Assertions.assertThat;
assertThat(driver.getTitle())
.contains("Expected Title");
assertThat(errorMessage.isDisplayed())
.as("Error message should be visible")
.isTrue();
Analyze requirements
Create Page Objects
BasePage with common methodsImplement test class
@DisplayName, @Tag annotationsRun tests
mvn test -Dtest=YourTest
mvn test -Dtest=YourTest -Dheadless=true
Run in non-headless mode
mvn test -Dtest=FailingTest -Dheadless=false
Capture screenshot on failure
((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
Check browser console logs
driver.manage().logs().get(LogType.BROWSER);
Verify locator in browser DevTools
document.querySelector('[data-testid="element"]');
Adjust wait conditions - increase timeout or change ExpectedCondition
Use the included setup script
# Run from skills/webapp-selenium-testing/scripts/
.\setup-maven-project.ps1 -ProjectName "my-tests"
Or use the pom-template.xml
scripts/pom-template.xml to your project as pom.xmlCreate base classes
WebDriverFactory - creates and manages WebDriver instancesBasePage - common page interaction methodsBaseTest - setup/teardown logicThread.sleep() - Use explicit waitsid, data-testid, semantic CSS@AfterEach@DisplayName - Human-readable test descriptionsThis skill is designed for testing your own application. Navigating to third-party or public websites introduces untrusted content into the AI-assisted session.
localhost or an internal dev/staging server.
Never hardcode external URLs (e.g. https://some-third-party.com) in generated tests;
always read the base URL from configuration (ConfigReader, env vars, or config.properties).driver.getPageSource() returns the full HTML of the
current page. In an AI-assisted session that HTML becomes part of the AI context and can carry
prompt injection payloads. Use attachPageSource only in controlled environments and always
apply a size limit (see references/page_object_model.md).getText(), getValue(),
and similar methods may originate from server-rendered content. Never pass them unvalidated
to dynamic logic that interprets strings as commands.attachScreenshot is safer for debugging; it
captures visual state without exposing raw HTML markup to the AI context.| Problem | Cause | Solution |
|---|---|---|
| Element not found | Not loaded yet | Use WebDriverWait with visibilityOfElementLocated |
| Stale element reference | DOM changed | Re-locate element before interaction |
| Click intercepted | Overlay blocking | Scroll into view or wait for overlay |
| Timeout exception | Element never visible | Verify locator, check for iframes |
| Session not created | Driver mismatch | Selenium Manager handles this |
| Flaky tests | Race conditions | Add proper waits, use stable locators |
| Command | Purpose |
|---|---|
mvn test | Run all tests |
mvn test -Dtest=LoginTest | Run specific class |
mvn test -Dtest=LoginTest#methodName | Run specific method |
mvn test -Dgroups=smoke | Run tagged tests |
mvn test -Dheadless=true | Run headless |
- name: Run Selenium Tests
run: mvn clean test -Dheadless=true -Dbrowser=chrome
Common shortcuts and "good enough" excuses that erode test quality — and the reality behind each.
| Rationalization | Reality |
|---|---|
| "Selenium is outdated, use Playwright" | Selenium has the largest ecosystem, broadest language support, and runs everywhere. It's not outdated — it's proven. |
"Thread.sleep is fine for waits" | WebDriverWait with ExpectedConditions is faster, more reliable, and doesn't waste CI time. |
| "Page Object Model is overkill" | Without POM, test maintenance cost grows quadratically as the suite scales. |
| "We don't need cross-browser testing" | Cross-browser issues account for ~30% of frontend bugs. Test at least Chrome and Firefox. |
| "Screenshot on failure is enough debugging info" | Combine screenshots with HTML source, console logs, and network logs for effective triage. |
| "JUnit 5 extensions aren't needed" | Extensions handle lifecycle, dependency injection, and parallel execution cleanly. Use them. |
| Task | Pattern |
|---|---|
| Find by ID | By.id("elementId") |
| Find by test ID | By.cssSelector("[data-testid='name']") |
| Wait for visible | wait.until(ExpectedConditions.visibilityOfElementLocated(by)) |
| Click safely | wait.until(ExpectedConditions.elementToBeClickable(by)).click() |
| Assert title | assertThat(driver.getTitle()).contains("Expected") |
| Take screenshot | ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE) |
After completing this skill's workflow, confirm:
@FindBy annotationsThread.sleep() calls; all waits use WebDriverWait with ExpectedConditionsassertThat() from AssertJ, not JUnit Assert@AfterEach or @AfterAll includes driver.quit() in try-finally blockmvn test or gradle test exits with BUILD SUCCESSnpx claudepluginhub fugazi/test-automation-skills-agents --plugin test-automation-skills-agentsGenerates Robot Framework tests using SeleniumLibrary for Selenium WebDriver browser automation, web UI testing, form interactions, multi-window/frames handling, and JavaScript execution.
Scaffolds and enhances Playwright Java E2E tests with Page Object Model, JUnit 5, Allure reporting, parallel execution, and CI/CD setup. Useful when fixing flaky tests or building hybrid API+UI tests.
Automates browser tasks and E2E testing with Playwright: auto-detects dev servers, generates scripts for pages, forms, screenshots, responsive design, UX validation, login flows, cross-browser checks in TypeScript/JavaScript/Python projects.