fugazi/webapp-selenium-testing
Author and maintain versioned Selenium WebDriver tests with Java and JUnit 5. Use for creating, debugging, or running Selenium specs, implementing Page Objects, handling explicit waits, capturing screenshots, or setting up Maven test projects. Supports Chrome, Firefox, and Edge. Keywords: Selenium WebDriver, Java, JUnit 5, Page Object Model, explicit waits, Maven, screenshots.
npx skills add https://github.com/fugazi/test-automation-skills-agents --skill webapp-selenium-testing
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.
playwright-e2e-testing).playwright-cli).api-testing).playwright-regression-testing).| 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();
BasePage with common methods@DisplayName, @Tag annotations mvn test -Dtest=YourTest
mvn test -Dtest=YourTest -Dheadless=true
mvn test -Dtest=FailingTest -Dheadless=false
((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
driver.manage().logs().get(LogType.BROWSER);
document.querySelector('[data-testid="element"]');
# Run from skills/webapp-selenium-testing/scripts/
.\setup-maven-project.ps1 -ProjectName "my-tests"
scripts/pom-template.xml to your project as pom.xmlWebDriverFactory - 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 descriptions> This 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 thecurrent 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-basics.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; itcaptures 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
Thread.sleep() anywhere — use WebDriverWait with ExpectedConditions.private final By fields in the Page Object.driver.findElement() chained inline in tests instead of going through the POM.getDriver()) — breaks encapsulation and leaks lifecycle.WebDriverWait with ExpectedConditions@AfterEach or @AfterAll includes driver.quit() in try-finally blockTake fugazi/webapp-selenium-testing from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.