From 0391d22da4c1bb0e433d85722192c3986170719b Mon Sep 17 00:00:00 2001 From: Aleksey Meleshko Date: Wed, 29 Jul 2026 10:06:13 +0200 Subject: [PATCH 1/2] Update to Selenium 4.46.0 +semver:feature Update plugins and dependencies versions. Update DevTools references to v150. Add new signature of method to emulateConditionsByRule with more parameters --- pom.xml | 10 ++++----- .../browser/devtools/DevToolsHandling.java | 4 ++-- .../browser/devtools/EmulationHandling.java | 14 ++++++------ .../browser/devtools/JavaScriptHandling.java | 6 ++--- .../browser/devtools/NetworkHandling.java | 22 +++++++++++++++---- .../devtools/DeviceEmulationTest.java | 4 ++-- .../devtools/NetworkSpeedEmulationTest.java | 10 ++++----- .../devtools/OverrideUserAgentTest.java | 2 +- 8 files changed, 43 insertions(+), 29 deletions(-) diff --git a/pom.xml b/pom.xml index 55d38ba..d9de632 100644 --- a/pom.xml +++ b/pom.xml @@ -70,7 +70,7 @@ com.github.aquality-automation aquality-selenium-core - 4.15.0 + 4.16.0 org.apache.commons @@ -80,7 +80,7 @@ com.fasterxml.jackson.core jackson-databind - 2.21.3 + 2.22.1 org.slf4j @@ -116,7 +116,7 @@ org.jacoco jacoco-maven-plugin - 0.8.14 + 0.8.15 pre-unit-test @@ -144,7 +144,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.5.5 + 3.5.6 ${surefireArgLine} -Dfile.encoding=UTF-8 false @@ -223,7 +223,7 @@ org.sonatype.central central-publishing-maven-plugin - 0.10.0 + 0.11.0 true central diff --git a/src/main/java/aquality/selenium/browser/devtools/DevToolsHandling.java b/src/main/java/aquality/selenium/browser/devtools/DevToolsHandling.java index af80694..dca1dc1 100644 --- a/src/main/java/aquality/selenium/browser/devtools/DevToolsHandling.java +++ b/src/main/java/aquality/selenium/browser/devtools/DevToolsHandling.java @@ -9,8 +9,8 @@ import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.Event; import org.openqa.selenium.devtools.HasDevTools; -import org.openqa.selenium.devtools.v148.performance.Performance; -import org.openqa.selenium.devtools.v148.performance.model.Metric; +import org.openqa.selenium.devtools.v150.performance.Performance; +import org.openqa.selenium.devtools.v150.performance.model.Metric; import java.util.List; import java.util.Map; diff --git a/src/main/java/aquality/selenium/browser/devtools/EmulationHandling.java b/src/main/java/aquality/selenium/browser/devtools/EmulationHandling.java index 7beba7b..e96e7e9 100644 --- a/src/main/java/aquality/selenium/browser/devtools/EmulationHandling.java +++ b/src/main/java/aquality/selenium/browser/devtools/EmulationHandling.java @@ -2,13 +2,13 @@ import org.apache.commons.lang3.StringUtils; import org.openqa.selenium.devtools.Command; -import org.openqa.selenium.devtools.v148.dom.model.RGBA; -import org.openqa.selenium.devtools.v148.emulation.Emulation; -import org.openqa.selenium.devtools.v148.emulation.model.DevicePosture; -import org.openqa.selenium.devtools.v148.emulation.model.DisplayFeature; -import org.openqa.selenium.devtools.v148.emulation.model.MediaFeature; -import org.openqa.selenium.devtools.v148.emulation.model.ScreenOrientation; -import org.openqa.selenium.devtools.v148.page.model.Viewport; +import org.openqa.selenium.devtools.v150.dom.model.RGBA; +import org.openqa.selenium.devtools.v150.emulation.Emulation; +import org.openqa.selenium.devtools.v150.emulation.model.DevicePosture; +import org.openqa.selenium.devtools.v150.emulation.model.DisplayFeature; +import org.openqa.selenium.devtools.v150.emulation.model.MediaFeature; +import org.openqa.selenium.devtools.v150.emulation.model.ScreenOrientation; +import org.openqa.selenium.devtools.v150.page.model.Viewport; import java.util.Collections; import java.util.List; diff --git a/src/main/java/aquality/selenium/browser/devtools/JavaScriptHandling.java b/src/main/java/aquality/selenium/browser/devtools/JavaScriptHandling.java index a899ddc..209341d 100644 --- a/src/main/java/aquality/selenium/browser/devtools/JavaScriptHandling.java +++ b/src/main/java/aquality/selenium/browser/devtools/JavaScriptHandling.java @@ -12,9 +12,9 @@ import org.openqa.selenium.devtools.idealized.Javascript; import org.openqa.selenium.devtools.idealized.ScriptId; import org.openqa.selenium.devtools.idealized.target.model.SessionID; -import org.openqa.selenium.devtools.v148.page.Page; -import org.openqa.selenium.devtools.v148.page.model.ScriptIdentifier; -import org.openqa.selenium.devtools.v148.runtime.Runtime; +import org.openqa.selenium.devtools.v150.page.Page; +import org.openqa.selenium.devtools.v150.page.model.ScriptIdentifier; +import org.openqa.selenium.devtools.v150.runtime.Runtime; import org.openqa.selenium.logging.EventType; import org.openqa.selenium.logging.HasLogEvents; import org.openqa.selenium.remote.Augmenter; diff --git a/src/main/java/aquality/selenium/browser/devtools/NetworkHandling.java b/src/main/java/aquality/selenium/browser/devtools/NetworkHandling.java index 106e466..047da38 100644 --- a/src/main/java/aquality/selenium/browser/devtools/NetworkHandling.java +++ b/src/main/java/aquality/selenium/browser/devtools/NetworkHandling.java @@ -8,7 +8,7 @@ import org.openqa.selenium.UsernameAndPassword; import org.openqa.selenium.devtools.NetworkInterceptor; import org.openqa.selenium.devtools.idealized.Network; -import org.openqa.selenium.devtools.v148.network.model.*; +import org.openqa.selenium.devtools.v150.network.model.*; import org.openqa.selenium.remote.http.*; import java.net.URI; @@ -22,11 +22,11 @@ import static aquality.selenium.browser.AqualityServices.getBrowser; import static aquality.selenium.logging.LocalizedLoggerUtility.logByLevel; -import static org.openqa.selenium.devtools.v148.network.Network.*; +import static org.openqa.selenium.devtools.v150.network.Network.*; /** * DevTools commands for version-independent network interception. - * For more information, see {@link org.openqa.selenium.devtools.v148.network.Network} and {@link Network}. + * For more information, see {@link org.openqa.selenium.devtools.v150.network.Network} and {@link Network}. */ public class NetworkHandling { public static final String LOC_NETWORK_INTERCEPTOR_START = "loc.browser.network.interceptor.start"; @@ -358,7 +358,21 @@ public void emulateConditions(Boolean offline, Number latency, Number downloadTh */ public void emulateConditionsByRule(Boolean offline, List matchedNetworkConditions) { tools.sendCommand(enable(Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty())); - tools.sendCommand(emulateNetworkConditionsByRule(offline, matchedNetworkConditions)); + tools.sendCommand(emulateNetworkConditionsByRule(Optional.of(offline), Optional.empty(), matchedNetworkConditions)); + } + + /** + * Activates emulation of network conditions for individual requests using URL match patterns. + * Unlike the deprecated Network.emulateNetworkConditions this method does not affect `navigator` state. + * Use Network.overrideNetworkState to explicitly modify `navigator` behavior. + * + * @param offline True to emulate internet disconnection. + * @param emulateOfflineServiceWorker True to emulate offline service worker. + * @param matchedNetworkConditions List of network conditions to apply. + */ + public void emulateConditionsByRule(Boolean offline, Boolean emulateOfflineServiceWorker, List matchedNetworkConditions) { + tools.sendCommand(enable(Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty())); + tools.sendCommand(emulateNetworkConditionsByRule(Optional.of(offline), Optional.of(emulateOfflineServiceWorker), matchedNetworkConditions)); } /** diff --git a/src/test/java/tests/usecases/devtools/DeviceEmulationTest.java b/src/test/java/tests/usecases/devtools/DeviceEmulationTest.java index 934ff37..2597357 100644 --- a/src/test/java/tests/usecases/devtools/DeviceEmulationTest.java +++ b/src/test/java/tests/usecases/devtools/DeviceEmulationTest.java @@ -3,8 +3,8 @@ import aquality.selenium.browser.AqualityServices; import aquality.selenium.browser.devtools.EmulationHandling; import com.google.common.collect.ImmutableMap; -import org.openqa.selenium.devtools.v147.emulation.Emulation; -import org.openqa.selenium.devtools.v147.emulation.model.DisplayFeature; +import org.openqa.selenium.devtools.v149.emulation.Emulation; +import org.openqa.selenium.devtools.v149.emulation.model.DisplayFeature; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; diff --git a/src/test/java/tests/usecases/devtools/NetworkSpeedEmulationTest.java b/src/test/java/tests/usecases/devtools/NetworkSpeedEmulationTest.java index 351e123..1e53925 100644 --- a/src/test/java/tests/usecases/devtools/NetworkSpeedEmulationTest.java +++ b/src/test/java/tests/usecases/devtools/NetworkSpeedEmulationTest.java @@ -3,8 +3,8 @@ import aquality.selenium.browser.AqualityServices; import aquality.selenium.browser.devtools.NetworkHandling; import org.openqa.selenium.TimeoutException; -import org.openqa.selenium.devtools.v148.network.model.ConnectionType; -import org.openqa.selenium.devtools.v148.network.model.NetworkConditions; +import org.openqa.selenium.devtools.v150.network.model.ConnectionType; +import org.openqa.selenium.devtools.v150.network.model.NetworkConditions; import org.testng.Assert; import org.testng.annotations.Test; import tests.BaseTest; @@ -30,11 +30,11 @@ private NetworkHandling network() { private List getNetworkConditions(int downloadThroughput, int uploadThroughput, ConnectionType connectionType) { return Collections.singletonList(new NetworkConditions(welcomeForm.getUrl(), LATENCY, downloadThroughput, uploadThroughput, - Optional.of(connectionType), Optional.empty(), Optional.empty(), Optional.empty())); + Optional.of(connectionType), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty())); } private List getNetworkConditions(int downloadThroughput, int uploadThroughput) { return Collections.singletonList(new NetworkConditions(welcomeForm.getUrl(), LATENCY, downloadThroughput, uploadThroughput, - Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty())); + Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty())); } @Test @@ -43,7 +43,7 @@ public void networkSpeedEmulationTest() { getBrowser().goTo(welcomeForm.getUrl()); Assert.assertTrue(welcomeForm.state().waitForDisplayed(), "Form must be opened"); boolean isOffline = true; - network().emulateConditionsByRule(isOffline, getNetworkConditions(-1, -1)); + network().emulateConditionsByRule(isOffline, isOffline, getNetworkConditions(-1, -1)); network().overrideState(isOffline, LATENCY, -1, -1); getBrowser().refresh(); getBrowser().waitForPageToLoad(); diff --git a/src/test/java/tests/usecases/devtools/OverrideUserAgentTest.java b/src/test/java/tests/usecases/devtools/OverrideUserAgentTest.java index 879a592..78bc07b 100644 --- a/src/test/java/tests/usecases/devtools/OverrideUserAgentTest.java +++ b/src/test/java/tests/usecases/devtools/OverrideUserAgentTest.java @@ -8,7 +8,7 @@ import manytools.BrowserLanguageForm; import manytools.UserAgentForm; import org.openqa.selenium.devtools.idealized.Network; -import org.openqa.selenium.devtools.v147.emulation.Emulation; +import org.openqa.selenium.devtools.v149.emulation.Emulation; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; From d4e3abb31e383d10188773657840faa4ddd202be Mon Sep 17 00:00:00 2001 From: Aleksey Meleshko Date: Wed, 29 Jul 2026 12:47:38 +0200 Subject: [PATCH 2/2] Stabilize ManyTools site navigation and waits --- src/test/java/manytools/ManyToolsForm.java | 12 ++++++++++-- src/test/java/manytools/RequestHeadersForm.java | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/test/java/manytools/ManyToolsForm.java b/src/test/java/manytools/ManyToolsForm.java index 67e4dc8..c3a67f4 100644 --- a/src/test/java/manytools/ManyToolsForm.java +++ b/src/test/java/manytools/ManyToolsForm.java @@ -1,6 +1,7 @@ package manytools; import aquality.selenium.browser.AqualityServices; +import aquality.selenium.core.elements.ElementState; import aquality.selenium.core.utilities.IActionRetrier; import aquality.selenium.elements.interfaces.IButton; import aquality.selenium.elements.interfaces.ILabel; @@ -12,8 +13,9 @@ public abstract class ManyToolsForm> extends Form { private static final String BASE_URL = "https://manytools.org/"; - private final ILabel lblValue = getFormLabel().findChildElement(By.xpath(".//code"), getName(), ILabel.class); - private final IButton btnAgree = getElementFactory().getButton(By.xpath("//button[@mode='primary']"), "Agree"); + private final ILabel lblValue = getFormLabel().findChildElement(By.xpath(".//code"), getName(), ILabel.class, ElementState.EXISTS_IN_ANY_STATE); + private final ILabel lblConsentDialog = getElementFactory().getLabel(By.id("cmpwrapper"), "Cookie consent dialog", ElementState.EXISTS_IN_ANY_STATE); + private final IButton btnDecline = lblConsentDialog.findElementInShadowRoot(By.id("cmpbntnotxt"), "Decline cookies", IButton.class); protected ManyToolsForm(String name) { super(By.id("maincontent"), name); @@ -25,7 +27,13 @@ protected ManyToolsForm(String name) { public T open() { AqualityServices.get(IActionRetrier.class).doWithRetry(() -> { AqualityServices.getBrowser().goTo(BASE_URL + getUrlPart()); + state().waitForDisplayed(); }, Collections.singletonList(TimeoutException.class)); + + if (lblConsentDialog.state().isExist() && btnDecline.state().isDisplayed()) { + btnDecline.click(); + lblConsentDialog.state().waitForNotDisplayed(); + } return (T) this; } diff --git a/src/test/java/manytools/RequestHeadersForm.java b/src/test/java/manytools/RequestHeadersForm.java index 96a5ba6..5c66809 100644 --- a/src/test/java/manytools/RequestHeadersForm.java +++ b/src/test/java/manytools/RequestHeadersForm.java @@ -23,7 +23,7 @@ public String getValue() { } public String getNullableValue(String headerName) { - getFormLabel().state().waitForDisplayed(); + getHeaderValueLabel.apply("Accept").state().waitForDisplayed(); ILabel valueLabel = getHeaderValueLabel.apply(headerName); return valueLabel.state().isDisplayed() ? valueLabel.getText() : null; }