返回 Skill 列表
extension
分类: 开发与工程无需 API Key

webapp-selenium-testing

使用Selenium WebDriver与Java和JUnit 5的浏览器自动化工具包。可用于创建、调试或运行Selenium测试,实现页面对象模型,处理显式等待,捕获屏幕截图,或设置Maven测试项目。支持Chrome、Firefox和Edge。

person作者: jakexiaohubgithub

Web Application Testing with Selenium WebDriver

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.

When to Use This Skill

  • Create Selenium WebDriver tests with JUnit 5
  • Implement Page Object Model (POM) architecture
  • Handle synchronization with Explicit Waits
  • Verify UI behavior with AssertJ assertions
  • Debug failing browser tests or DOM interactions
  • Set up Maven test infrastructure for a new project
  • Capture screenshots for debugging
  • Validate complex user flows and form submissions
  • Test across multiple browsers (Chrome, Firefox, Edge)

Do NOT Use For

  • Playwright/TypeScript UI tests (use playwright-e2e-testing).
  • Driving a live browser interactively for exploration (use playwright-cli).
  • Standalone API/contract testing (use api-testing).
  • Governing a regression suite's CI tiers and sharding (use playwright-regression-testing).

Prerequisites

| 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.


Core Patterns

Page Object Model

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

Explicit Waits

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"))
);

Fluent Assertions (AssertJ)

import static org.assertj.core.api.Assertions.assertThat;

assertThat(driver.getTitle())
    .contains("Expected Title");

assertThat(errorMessage.isDisplayed())
    .as("Error message should be visible")
    .isTrue();

Step-by-Step Workflows

Workflow 1: Create New Selenium Test

  1. Analyze requirements

    • Identify the user flow to test
    • List elements to interact with
    • Define expected outcomes
  2. Create Page Objects

    • Create BasePage with common methods
    • Create page-specific classes with locators
    • Implement action methods
  3. Implement test class

    • Extend base test class
    • Use @DisplayName, @Tag annotations
    • Use assertions for validations
  4. Run tests

    mvn test -Dtest=YourTest
    mvn test -Dtest=YourTest -Dheadless=true
    

Workflow 2: Debug Failing Test

  1. Run in non-headless mode

    mvn test -Dtest=FailingTest -Dheadless=false
    
  2. Capture screenshot on failure

    ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
    
  3. Check browser console logs

    driver.manage().logs().get(LogType.BROWSER);
    
  4. Verify locator in browser DevTools

    document.querySelector('[data-testid="element"]');
    
  5. Adjust wait conditions - increase timeout or change ExpectedCondition

Workflow 3: Set Up New Project

  1. Use the included setup script

    # Run from skills/webapp-selenium-testing/scripts/
    .\setup-maven-project.ps1 -ProjectName "my-tests"
    
  2. Or use the pom-template.xml

    • Copy scripts/pom-template.xml to your project as pom.xml
    • Versions are managed via BOM (Bill of Materials)
  3. Create base classes

    • WebDriverFactory - creates and manages WebDriver instances
    • BasePage - common page interaction methods
    • BaseTest - setup/teardown logic

Best Practices Checklist

  • Never use Thread.sleep() - Use explicit waits
  • Implement Page Object Model - Separate locators from test logic
  • Use assertions properly - AssertJ for fluent syntax
  • Prefer stable locators - id, data-testid, semantic CSS
  • Clean up resources - Close driver in @AfterEach
  • Keep tests independent - Each test runs in isolation
  • Use @DisplayName - Human-readable test descriptions
  • Capture evidence - Screenshots on failure
  • Test only your own application - Never navigate to third-party or public URLs

Security Considerations

This skill is designed for testing your own application. Navigating to third-party or public websites introduces untrusted content into the AI-assisted session.

  • Only test against your own app — Use 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).
  • Avoid raw page source ingestiondriver.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-basics.md).
  • Treat extracted text as data, not instructions — Values returned by getText(), getValue(), and similar methods may originate from server-rendered content. Never pass them unvalidated to dynamic logic that interprets strings as commands.
  • Prefer screenshots over page sourceattachScreenshot is safer for debugging; it captures visual state without exposing raw HTML markup to the AI context.

Troubleshooting

| 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 |


Maven Commands

| 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 |

CI/CD Integration

- name: Run Selenium Tests
  run: mvn clean test -Dheadless=true -Dbrowser=chrome


Red Flags

  • Thread.sleep() anywhere — use WebDriverWait with ExpectedConditions.
  • Locators created inside methods instead of declared as private final By fields in the Page Object.
  • Assertions inside Page Objects — pages expose state, tests assert.
  • driver.findElement() chained inline in tests instead of going through the POM.
  • WebDriver exposed publicly (e.g., getDriver()) — breaks encapsulation and leaks lifecycle.

References


Verification

  • [ ] Page Object pattern followed — Each page has a corresponding Java class with locators
  • [ ] Explicit waits only — All waits use WebDriverWait with ExpectedConditions
  • [ ] Browser cleanup guaranteed@AfterEach or @AfterAll includes driver.quit() in try-finally block