From 50367236b15640384d8dbbd3359ec46e3693fe05 Mon Sep 17 00:00:00 2001 From: Andrei Solntsev Date: Wed, 21 Jan 2026 22:52:00 +0200 Subject: [PATCH 1/3] fix IDEA setup for Java project * update JUnit and Selenium dependencies * add missing dependencies to Gradle script * add IDEA- and Gradle- specific files to .gitignore --- examples/java/.gitignore | 6 ++++++ examples/java/build.gradle | 6 ++++-- examples/java/pom.xml | 5 +++-- 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 examples/java/.gitignore diff --git a/examples/java/.gitignore b/examples/java/.gitignore new file mode 100644 index 000000000000..77b33f676e09 --- /dev/null +++ b/examples/java/.gitignore @@ -0,0 +1,6 @@ +/.gradle +/build +/out +/target +/selenium.pdf +/selenium.xml* diff --git a/examples/java/build.gradle b/examples/java/build.gradle index 38a69565da1a..3545907b2eba 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -10,8 +10,10 @@ repositories { } dependencies { - testImplementation 'org.seleniumhq.selenium:selenium-java:4.38.0' - testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.13.4' + testImplementation 'org.seleniumhq.selenium:selenium-java:4.40.0' + testImplementation 'org.seleniumhq.selenium:selenium-grid:4.40.0' + testImplementation 'org.junit.jupiter:junit-jupiter-engine:6.0.2' + testImplementation 'com.titusfortner:selenium-logger:2.4.0' } test { diff --git a/examples/java/pom.xml b/examples/java/pom.xml index d5f8c184b8e0..a3482e95a786 100644 --- a/examples/java/pom.xml +++ b/examples/java/pom.xml @@ -13,7 +13,7 @@ 17 17 UTF-8 - 4.38.0 + 4.40.0 @@ -44,13 +44,14 @@ org.junit.jupiter junit-jupiter-engine - 5.13.4 + 6.0.2 test com.titusfortner selenium-logger 2.4.0 + test From 659f6c9a89549a5e51498a8692d69c8fc0e69a52 Mon Sep 17 00:00:00 2001 From: Andrei Solntsev Date: Wed, 21 Jan 2026 22:56:26 +0200 Subject: [PATCH 2/3] fix closing WebDriver after tests * always wrap `driver.quit()` into `if (driver != null)` to avoid NPE if the browser hadn't been started due to some error * mark the closing @AfterEach method as final to avoid occasional overriding in subclasses * No need to call `driver.quit()` in `BaseTest` subclasses because it's already done by `BaseTest`. --- .../src/test/java/dev/selenium/BaseTest.java | 10 +- .../SingleInstanceCookieParallelTest.java | 5 +- .../java/dev/selenium/browsers/EdgeTest.java | 1 - .../dev/selenium/browsers/FirefoxTest.java | 19 +- .../dev/selenium/drivers/HttpClientTest.java | 3 - .../selenium/elements/InformationTest.java | 81 +++++---- .../getting_started/UsingSeleniumTest.java | 6 +- .../dev/selenium/interactions/AlertsTest.java | 5 - .../selenium/interactions/CookiesTest.java | 171 +++++++++--------- .../interactions/InteractionsTest.java | 35 ++-- .../selenium/interactions/PrintsPageTest.java | 1 - 11 files changed, 154 insertions(+), 183 deletions(-) diff --git a/examples/java/src/test/java/dev/selenium/BaseTest.java b/examples/java/src/test/java/dev/selenium/BaseTest.java index 70ac73b5a63f..25682d92260b 100644 --- a/examples/java/src/test/java/dev/selenium/BaseTest.java +++ b/examples/java/src/test/java/dev/selenium/BaseTest.java @@ -59,15 +59,11 @@ protected ChromeDriver startChromeDriver(ChromeOptions options) { } protected static ChromeOptions getDefaultChromeOptions() { - ChromeOptions options = new ChromeOptions(); - options.addArguments("--no-sandbox"); - return options; + return new ChromeOptions().addArguments("--no-sandbox"); } protected static EdgeOptions getDefaultEdgeOptions() { - EdgeOptions options = new EdgeOptions(); - options.addArguments("--no-sandbox"); - return options; + return new EdgeOptions().addArguments("--no-sandbox"); } protected File getTempDirectory(String prefix) { @@ -156,7 +152,7 @@ protected void enableLogging() { } @AfterEach - public void quit() { + public final void closeBrowser() { if (driver != null) { driver.quit(); } diff --git a/examples/java/src/test/java/dev/selenium/bidirectional/webdriver_bidi/user_context/SingleInstanceCookieParallelTest.java b/examples/java/src/test/java/dev/selenium/bidirectional/webdriver_bidi/user_context/SingleInstanceCookieParallelTest.java index a40a6da5a85c..56ad7ea49848 100644 --- a/examples/java/src/test/java/dev/selenium/bidirectional/webdriver_bidi/user_context/SingleInstanceCookieParallelTest.java +++ b/examples/java/src/test/java/dev/selenium/bidirectional/webdriver_bidi/user_context/SingleInstanceCookieParallelTest.java @@ -128,6 +128,9 @@ void canHaveTheDefaultBackgroundColor() { @AfterAll public static void cleanup() { - driver.quit(); + if (driver != null) { + driver.quit(); + driver = null; + } } } diff --git a/examples/java/src/test/java/dev/selenium/browsers/EdgeTest.java b/examples/java/src/test/java/dev/selenium/browsers/EdgeTest.java index 460c07b02e22..1e7780da7e3c 100644 --- a/examples/java/src/test/java/dev/selenium/browsers/EdgeTest.java +++ b/examples/java/src/test/java/dev/selenium/browsers/EdgeTest.java @@ -218,7 +218,6 @@ public void setNetworkConditions() { () -> Assertions.assertEquals(networkConditions.getUploadThroughput(), actualConditions.getUploadThroughput()) ); ((EdgeDriver) driver).deleteNetworkConditions(); - driver.quit(); } @Test diff --git a/examples/java/src/test/java/dev/selenium/browsers/FirefoxTest.java b/examples/java/src/test/java/dev/selenium/browsers/FirefoxTest.java index c66400cce76c..3cf27c3e39c2 100644 --- a/examples/java/src/test/java/dev/selenium/browsers/FirefoxTest.java +++ b/examples/java/src/test/java/dev/selenium/browsers/FirefoxTest.java @@ -18,17 +18,16 @@ import org.openqa.selenium.firefox.*; import org.openqa.selenium.remote.service.DriverFinder; - - - - public class FirefoxTest extends BaseTest { private FirefoxDriver driver; @AfterEach public void clearProperties() { System.clearProperty(GeckoDriverService.GECKO_DRIVER_LOG_PROPERTY); - System.clearProperty(GeckoDriverService.GECKO_DRIVER_LOG_LEVEL_PROPERTY);driver.quit(); + System.clearProperty(GeckoDriverService.GECKO_DRIVER_LOG_LEVEL_PROPERTY); + if (driver != null) { + driver.quit(); + } } @Test @@ -186,24 +185,20 @@ public void fullPageScreenshot() throws Exception { // Verify the screenshot file exists Assertions.assertTrue(targetFile.exists(), "The full page screenshot file should exist"); Files.deleteIfExists(targetFile.toPath()); - - driver.quit(); } @Test public void setContext() { driver = startFirefoxDriver(new FirefoxOptions().addArguments("-remote-allow-system-access")); - ((HasContext) driver).setContext(FirefoxCommandContext.CHROME); + driver.setContext(FirefoxCommandContext.CHROME); driver.executeScript("console.log('Inside Chrome context');"); // Verify the context is back to "content" Assertions.assertEquals( - FirefoxCommandContext.CHROME, ((HasContext) driver).getContext(), + FirefoxCommandContext.CHROME, driver.getContext(), "The context should be 'chrome'" ); - - driver.quit(); } @Test @@ -214,7 +209,5 @@ public void firefoxProfile() { options.setProfile(profile); driver = new FirefoxDriver(options); - - driver.quit(); } } diff --git a/examples/java/src/test/java/dev/selenium/drivers/HttpClientTest.java b/examples/java/src/test/java/dev/selenium/drivers/HttpClientTest.java index 16b36c91432c..e32b7035d4ef 100644 --- a/examples/java/src/test/java/dev/selenium/drivers/HttpClientTest.java +++ b/examples/java/src/test/java/dev/selenium/drivers/HttpClientTest.java @@ -48,7 +48,6 @@ public void remoteWebDriverWithClientConfig() throws Exception { .address(gridUrl) .config(clientConfig) .build(); - driver.quit(); } @Test @@ -67,7 +66,6 @@ public void remoteWebDriverIgnoreSSL() throws Exception { .address(gridUrl) .config(clientConfig) .build(); - driver.quit(); } @Test @@ -85,7 +83,6 @@ public void remoteWebDriverWithEmbedAuthUrl() throws Exception { .address(embedAuthToUrl(gridUrl, "admin", "myStrongPassword")) .config(clientConfig) .build(); - driver.quit(); } private URL embedAuthToUrl(URL url, String username, String password) throws Exception { diff --git a/examples/java/src/test/java/dev/selenium/elements/InformationTest.java b/examples/java/src/test/java/dev/selenium/elements/InformationTest.java index 02d480fa3dab..e5a3b89e834d 100644 --- a/examples/java/src/test/java/dev/selenium/elements/InformationTest.java +++ b/examples/java/src/test/java/dev/selenium/elements/InformationTest.java @@ -6,7 +6,9 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; + import java.time.Duration; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -15,57 +17,56 @@ public class InformationTest { @Test public void informationWithElements() { - WebDriver driver = new ChromeDriver(); - driver.manage().timeouts().implicitlyWait(Duration.ofMillis(500)); - // Navigate to Url - driver.get("https://www.selenium.dev/selenium/web/inputs.html"); - - // isDisplayed - // Get boolean value for is element display - boolean isEmailVisible = driver.findElement(By.name("email_input")).isDisplayed(); - assertTrue(isEmailVisible); + WebDriver driver = new ChromeDriver(); + driver.manage().timeouts().implicitlyWait(Duration.ofMillis(500)); + // Navigate to Url + driver.get("https://www.selenium.dev/selenium/web/inputs.html"); - // isEnabled - // returns true if element is enabled else returns false - boolean isEnabledButton = driver.findElement(By.name("button_input")).isEnabled(); - assertTrue(isEnabledButton); + // isDisplayed + // Get boolean value for is element display + boolean isEmailVisible = driver.findElement(By.name("email_input")).isDisplayed(); + assertTrue(isEmailVisible); - // isSelected - // returns true if element is checked else returns false - boolean isSelectedCheck = driver.findElement(By.name("checkbox_input")).isSelected(); - assertTrue(isSelectedCheck); + // isEnabled + // returns true if element is enabled else returns false + boolean isEnabledButton = driver.findElement(By.name("button_input")).isEnabled(); + assertTrue(isEnabledButton); - // TagName - // returns TagName of the element - String tagNameInp = driver.findElement(By.name("email_input")).getTagName(); - assertEquals("input", tagNameInp); + // isSelected + // returns true if element is checked else returns false + boolean isSelectedCheck = driver.findElement(By.name("checkbox_input")).isSelected(); + assertTrue(isSelectedCheck); - // GetRect - // Returns height, width, x and y coordinates referenced element - Rectangle res = driver.findElement(By.name("range_input")).getRect(); - // Rectangle class provides getX,getY, getWidth, getHeight methods - assertEquals(10, res.getX()); + // TagName + // returns TagName of the element + String tagNameInp = driver.findElement(By.name("email_input")).getTagName(); + assertEquals("input", tagNameInp); - // Retrieves the computed style property 'font-size' of field - String cssValue = driver.findElement(By.name("color_input")).getCssValue("font-size"); - assertEquals(cssValue, "13.3333px"); + // GetRect + // Returns height, width, x and y coordinates referenced element + Rectangle res = driver.findElement(By.name("range_input")).getRect(); + // Rectangle class provides getX,getY, getWidth, getHeight methods + assertEquals(10, res.getX()); + // Retrieves the computed style property 'font-size' of field + String cssValue = driver.findElement(By.name("color_input")).getCssValue("font-size"); + assertEquals(cssValue, "13.3333px"); - // GetText - // Retrieves the text of the element - String text = driver.findElement(By.tagName("h1")).getText(); - assertEquals(text, "Testing Inputs"); + // GetText + // Retrieves the text of the element + String text = driver.findElement(By.tagName("h1")).getText(); + assertEquals(text, "Testing Inputs"); - // FetchAttributes - // identify the email text box - WebElement emailTxt = driver.findElement(By.name(("email_input"))); - // fetch the value property associated with the textbox - String valueInfo = emailTxt.getAttribute("value"); - assertEquals(valueInfo,"admin@localhost"); + // FetchAttributes + // identify the email text box + WebElement emailTxt = driver.findElement(By.name(("email_input"))); + // fetch the value property associated with the textbox + String valueInfo = emailTxt.getAttribute("value"); + assertEquals(valueInfo, "admin@localhost"); - driver.quit(); + driver.quit(); } } diff --git a/examples/java/src/test/java/dev/selenium/getting_started/UsingSeleniumTest.java b/examples/java/src/test/java/dev/selenium/getting_started/UsingSeleniumTest.java index 26ddc5229767..97639092a177 100644 --- a/examples/java/src/test/java/dev/selenium/getting_started/UsingSeleniumTest.java +++ b/examples/java/src/test/java/dev/selenium/getting_started/UsingSeleniumTest.java @@ -43,8 +43,10 @@ public void eightComponents() { } @AfterEach - public void teardown() { - driver.quit(); + public final void teardown() { + if (driver != null) { + driver.quit(); + } } } diff --git a/examples/java/src/test/java/dev/selenium/interactions/AlertsTest.java b/examples/java/src/test/java/dev/selenium/interactions/AlertsTest.java index 43c70347f44d..02f57b9e4d70 100644 --- a/examples/java/src/test/java/dev/selenium/interactions/AlertsTest.java +++ b/examples/java/src/test/java/dev/selenium/interactions/AlertsTest.java @@ -44,11 +44,6 @@ public void createSession() { wait = new WebDriverWait(driver, Duration.ofSeconds(10)); } - @AfterEach - public void endSession() { - driver.quit(); - } - @Test public void alertInformationTest() { driver.get("https://www.selenium.dev/selenium/web/alerts.html#"); diff --git a/examples/java/src/test/java/dev/selenium/interactions/CookiesTest.java b/examples/java/src/test/java/dev/selenium/interactions/CookiesTest.java index aea33ef54a0d..1828d762aac8 100644 --- a/examples/java/src/test/java/dev/selenium/interactions/CookiesTest.java +++ b/examples/java/src/test/java/dev/selenium/interactions/CookiesTest.java @@ -17,111 +17,106 @@ package dev.selenium.interactions; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; + import java.util.Set; public class CookiesTest { - WebDriver driver = new ChromeDriver(); - @Test - public void addCookie() { - driver.get("https://www.selenium.dev/selenium/web/blank.html"); - // Add cookie into current browser context - driver.manage().addCookie(new Cookie("key", "value")); - driver.quit(); - } - @Test - public void getNamedCookie() { - - driver.get("https://www.selenium.dev/selenium/web/blank.html"); - // Add cookie into current browser context - driver.manage().addCookie(new Cookie("foo", "bar")); - // Get cookie details with named cookie 'foo' - Cookie cookie = driver.manage().getCookieNamed("foo"); - Assertions.assertEquals(cookie.getValue(), "bar"); - - driver.quit(); - } - - - @Test - public void getAllCookies() { - - driver.get("https://www.selenium.dev/selenium/web/blank.html"); - // Add cookies into current browser context - driver.manage().addCookie(new Cookie("test1", "cookie1")); - driver.manage().addCookie(new Cookie("test2", "cookie2")); - // Get cookies - Set cookies = driver.manage().getCookies(); - for (Cookie cookie : cookies) { - if (cookie.getName().equals("test1")) { - Assertions.assertEquals(cookie.getValue(), "cookie1"); - } - - if (cookie.getName().equals("test2")) { - Assertions.assertEquals(cookie.getValue(), "cookie2"); - } - } - driver.quit(); - } - - - @Test - public void deleteCookieNamed() { - - driver.get("https://www.selenium.dev/selenium/web/blank.html"); - driver.manage().addCookie(new Cookie("test1", "cookie1")); - // delete cookie named - driver.manage().deleteCookieNamed("test1"); - driver.quit(); - } - - @Test - public void deleteCookieObject() { - - driver.get("https://www.selenium.dev/selenium/web/blank.html"); - Cookie cookie = new Cookie("test2", "cookie2"); - driver.manage().addCookie(cookie); + WebDriver driver = new ChromeDriver(); + + @AfterEach + final void closeBrowser() { + if (driver != null) { + driver.quit(); + } + } + + @Test + public void addCookie() { + driver.get("https://www.selenium.dev/selenium/web/blank.html"); + // Add cookie into current browser context + driver.manage().addCookie(new Cookie("key", "value")); + } + + @Test + public void getNamedCookie() { + driver.get("https://www.selenium.dev/selenium/web/blank.html"); + // Add cookie into current browser context + driver.manage().addCookie(new Cookie("foo", "bar")); + // Get cookie details with named cookie 'foo' + Cookie cookie = driver.manage().getCookieNamed("foo"); + Assertions.assertEquals(cookie.getValue(), "bar"); + } + + + @Test + public void getAllCookies() { + driver.get("https://www.selenium.dev/selenium/web/blank.html"); + // Add cookies into current browser context + driver.manage().addCookie(new Cookie("test1", "cookie1")); + driver.manage().addCookie(new Cookie("test2", "cookie2")); + // Get cookies + Set cookies = driver.manage().getCookies(); + for (Cookie cookie : cookies) { + if (cookie.getName().equals("test1")) { + Assertions.assertEquals(cookie.getValue(), "cookie1"); + } + + if (cookie.getName().equals("test2")) { + Assertions.assertEquals(cookie.getValue(), "cookie2"); + } + } + } + + + @Test + public void deleteCookieNamed() { + driver.get("https://www.selenium.dev/selenium/web/blank.html"); + driver.manage().addCookie(new Cookie("test1", "cookie1")); + // delete cookie named + driver.manage().deleteCookieNamed("test1"); + } + + @Test + public void deleteCookieObject() { + driver.get("https://www.selenium.dev/selenium/web/blank.html"); + Cookie cookie = new Cookie("test2", "cookie2"); + driver.manage().addCookie(cookie); /* Selenium Java bindings also provides a way to delete cookie by passing cookie object of current browsing context */ - driver.manage().deleteCookie(cookie); - - driver.quit(); - } - - - @Test - public void deleteAllCookies() { - - driver.get("https://www.selenium.dev/selenium/web/blank.html"); - // Add cookies into current browser context - driver.manage().addCookie(new Cookie("test1", "cookie1")); - driver.manage().addCookie(new Cookie("test2", "cookie2")); - // Delete All cookies - driver.manage().deleteAllCookies(); + driver.manage().deleteCookie(cookie); + } - driver.quit(); - } - @Test - public void sameSiteCookie() { - driver.get("http://www.example.com"); + @Test + public void deleteAllCookies() { + driver.get("https://www.selenium.dev/selenium/web/blank.html"); + // Add cookies into current browser context + driver.manage().addCookie(new Cookie("test1", "cookie1")); + driver.manage().addCookie(new Cookie("test2", "cookie2")); + // Delete All cookies + driver.manage().deleteAllCookies(); + } - Cookie cookie = new Cookie.Builder("key", "value").sameSite("Strict").build(); - Cookie cookie1 = new Cookie.Builder("key", "value").sameSite("Lax").build(); + @Test + public void sameSiteCookie() { + driver.get("http://www.example.com"); - driver.manage().addCookie(cookie); - driver.manage().addCookie(cookie1); + Cookie cookie = new Cookie.Builder("key", "value").sameSite("Strict").build(); + Cookie cookie1 = new Cookie.Builder("key", "value").sameSite("Lax").build(); - System.out.println(cookie.getSameSite()); - System.out.println(cookie1.getSameSite()); + driver.manage().addCookie(cookie); + driver.manage().addCookie(cookie1); - driver.quit(); - } + System.out.println(cookie.getSameSite()); + System.out.println(cookie1.getSameSite()); + } } diff --git a/examples/java/src/test/java/dev/selenium/interactions/InteractionsTest.java b/examples/java/src/test/java/dev/selenium/interactions/InteractionsTest.java index 4d7b857fe304..3f53a64b9cea 100644 --- a/examples/java/src/test/java/dev/selenium/interactions/InteractionsTest.java +++ b/examples/java/src/test/java/dev/selenium/interactions/InteractionsTest.java @@ -3,30 +3,21 @@ import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.openqa.selenium.Cookie; -import java.util.Set; public class InteractionsTest extends BaseChromeTest { - @Test - public void getTitle() { - try { - driver.get("https://www.selenium.dev/"); - // get title - String title = driver.getTitle(); - Assertions.assertEquals(title, "Selenium"); - } finally { - driver.quit(); + @Test + public void getTitle() { + driver.get("https://www.selenium.dev/"); + // get title + String title = driver.getTitle(); + Assertions.assertEquals(title, "Selenium"); } - } - @Test - public void getCurrentUrl() { - try { - driver.get("https://www.selenium.dev/"); - // get current url - String url = driver.getCurrentUrl(); - Assertions.assertEquals(url, "https://www.selenium.dev/"); - } finally { - driver.quit(); + + @Test + public void getCurrentUrl() { + driver.get("https://www.selenium.dev/"); + // get current url + String url = driver.getCurrentUrl(); + Assertions.assertEquals(url, "https://www.selenium.dev/"); } - } } \ No newline at end of file diff --git a/examples/java/src/test/java/dev/selenium/interactions/PrintsPageTest.java b/examples/java/src/test/java/dev/selenium/interactions/PrintsPageTest.java index b6b6dae776f3..36130ff0ee03 100644 --- a/examples/java/src/test/java/dev/selenium/interactions/PrintsPageTest.java +++ b/examples/java/src/test/java/dev/selenium/interactions/PrintsPageTest.java @@ -5,7 +5,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; -import org.openqa.selenium.print.PageMargin; import org.openqa.selenium.print.PrintOptions; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chrome.ChromeDriver; From 4ab09eec4e35190557219834e1611dc4b2fe8600 Mon Sep 17 00:00:00 2001 From: Diego Molina Date: Fri, 23 Jan 2026 10:35:52 +0100 Subject: [PATCH 3/3] Apply suggestions from code review Co-authored-by: Swastik Baranwal --- .../src/test/java/dev/selenium/elements/InformationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/java/src/test/java/dev/selenium/elements/InformationTest.java b/examples/java/src/test/java/dev/selenium/elements/InformationTest.java index e5a3b89e834d..9b5ed42970f3 100644 --- a/examples/java/src/test/java/dev/selenium/elements/InformationTest.java +++ b/examples/java/src/test/java/dev/selenium/elements/InformationTest.java @@ -28,12 +28,12 @@ public void informationWithElements() { assertTrue(isEmailVisible); // isEnabled - // returns true if element is enabled else returns false + // returns true if element is enabled boolean isEnabledButton = driver.findElement(By.name("button_input")).isEnabled(); assertTrue(isEnabledButton); // isSelected - // returns true if element is checked else returns false + // returns true if element is checked boolean isSelectedCheck = driver.findElement(By.name("checkbox_input")).isSelected(); assertTrue(isSelectedCheck);