WebTau browser module lets you interact with a browser.High level abstractions streamline location, assertion and async logic.WebTau leverages https://www.selenium.dev Selenium WebDriver to do the heavy lifting. Groovy package scenarios.ui import static org.testingisdocumenting.webtau.WebTauGroovyDsl.* import static pages.Pages.* scenario("search by specific query") { search.submit("search this") search.numberOfResults.waitToBe > 1 } package pages import static org.testingisdocumenting.webtau.WebTauDsl.* class SearchPage { def header = $("#header") def welcomeMessage = $("#welcome") def searchMessage = $("#message") def box = $("#search-box") def resultsArea = $("#results") def results = $("#results .result") def numberOfResults = results.count def submit(query) { browser.open("/search") box.setValue(query) box.sendKeys(browser.keys.enter) } } package pages class Pages { static final def search = new SearchPage() } Java package com.example.tests.junit5; import org.junit.jupiter.api.Test; import org.testingisdocumenting.webtau.junit5.WebTau; import static com.example.tests.junit5.pages.Pages.*; import static org.testingisdocumenting.webtau.WebTauDsl.*; @WebTau public class WebSearchJavaTest { @Test public void searchByQuery() { search.submit("search this"); search.numberOfResults.waitToBe(greaterThan(1)); } } package com.example.tests.junit5.pages; import org.testingisdocumenting.webtau.browser.page.PageElement; import org.testingisdocumenting.webtau.browser.page.PageElementValue; import static org.testingisdocumenting.webtau.WebTauDsl.*; public class SearchPage { private final PageElement box = $("#search-box"); private final PageElement results = $("#results .result"); public final PageElementValue<Integer> numberOfResults = results.count; public void submit(String query) { browser.open("/search"); box.setValue(query); box.sendKeys(browser.keys.enter); } } package com.example.tests.junit5.pages; public class Pages { public static SearchPage search = new SearchPage(); } > initializing webdriver for chrome . initialized webdriver for chrome (476ms) > opening http://localhost:44451/search . opened http://localhost:44451/search (49ms) > setting value search this to by css #search-box > clearing by css #search-box . cleared by css #search-box (39ms) > sending keys search this to by css #search-box . sent keys search this to by css #search-box (56ms) . set value search this to by css #search-box (120ms) > sending keys <enter> to by css #search-box . sent keys <enter> to by css #search-box (28ms) > waiting for count of by css #results .result to be greater than 1 . count of by css #results .result greater than 1 (11ms)