Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/).

---

### v3.5.0 β€” unreleased

- **Zero-config first run: `selenium-boot.yml` is now optional** β€” with no default `selenium-boot.yml` in the working directory or on the classpath, the framework runs on built-in defaults (`browser.name: chrome`, `execution.mode: local`, `timeouts.explicit: 10`, `timeouts.pageLoad: 30`) and prints one `[Selenium Boot] No selenium-boot.yml found β€” running with built-in defaults ...` notice line. Fields a file omits (and an empty file) fall back to the same defaults; `browser.name` is only defaulted when `browser.matrix` is not set, and `SeleniumBootDefaults` overrides still take precedence over the built-ins. Nothing that was an error before stops being one: a requested profile (`-Dselenium.boot.profile`) or explicit path (`-Dselenium.boot.config`) whose file is missing still throws, so a typo never silently runs on defaults, and present-but-invalid values (an unknown `execution.mode`, a negative timeout) still fail validation. Adds `ConfigurationLoader.load(File, ClassLoader)` (working directory and classpath supplied, for tests). (#66)
- **Terminal `Locator` actions wait for the element and re-resolve it on every poll** β€” `click()`, `type()`, `append()`, `getText()`, `getAttribute()`, `hover()`, `scrollIntoView()`, `jsClick()` and `element()` used to look the element up once and act on that cached reference, so a page that re-rendered it in between surfaced as a `StaleElementReferenceException`, and a locator that matched nothing yet threw immediately. They now resolve the locator from scratch on each poll, retrying on a stale or not-yet-present element until `timeouts.explicit` elapses. **Behavior change:** a locator that matches nothing is now retried for up to `timeouts.explicit` instead of failing at once. If it never matches, the call still ends in a `LocatorException` (cause: `TimeoutException`), so existing catches keep working; an element that exists but never becomes visible/clickable still times out with a `TimeoutException`, as before. `isVisible()`, `isHidden()`, `isEnabled()` and `count()` still never wait, and `rows()` inherits the wait for its table through `element()`. (#67, #68)
- **JUnit Jupiter API bumped 5.10.2 β†’ 6.1.3** (`junit-jupiter-api`, optional dependency of the JUnit 5 bridge). `junit-platform-launcher` stays at 1.10.2, and that pairing has not been tested with JUnit 6 consumers: the consumer integration suite was run only against a project on JUnit 5.10.2 with launcher 1.10.2. If you run JUnit 6, verify your setup and report any problem. (#64)

### v3.4.0 β€” 2026-09-19

- **`Locator.rows()`** β€” resolves a locator to a `<table>` and returns its data rows as header-keyed maps (`List<Map<String, String>>`), one map per row, keyed by column header. Headers are taken from the first `<thead>` row with `<th>` cells, falling back to the first `<tr>` anywhere with `<th>` cells, then the first `<tr>`'s `<td>` cells; whichever row supplies headers is never returned as data. Short rows are padded with `""`, extra cells are dropped, and `<th>`-only rows (group headings) are skipped. Contributed by @timothytkim. (#54)
Expand Down
Loading