From 0666f7ed75a5f5d3f4f21a4645c834dcfd1fd2ab Mon Sep 17 00:00:00 2001 From: bhecquet Date: Wed, 1 Apr 2026 10:52:27 +0200 Subject: [PATCH 1/3] #17274: Apply filtering only on merged capabilities --- .../grid/node/relay/RelaySessionFactory.java | 5 +- .../node/relay/RelaySessionFactoryTest.java | 65 +++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java b/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java index 8dd43d5a90e39..307958b8822f3 100644 --- a/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java +++ b/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java @@ -164,7 +164,10 @@ public Either apply(CreateSessionRequest sess "New session request capabilities do not " + "match the stereotype.")); } - capabilities = capabilities.merge(filterRelayCapabilities(stereotype)); + capabilities = capabilities.merge(stereotype); + System.out.println(capabilities); + capabilities = filterRelayCapabilities(capabilities); + System.out.println(capabilities); LOG.info("Starting session for " + capabilities); diff --git a/java/test/org/openqa/selenium/grid/node/relay/RelaySessionFactoryTest.java b/java/test/org/openqa/selenium/grid/node/relay/RelaySessionFactoryTest.java index 952675c6290b2..22a7cfc6dd28a 100644 --- a/java/test/org/openqa/selenium/grid/node/relay/RelaySessionFactoryTest.java +++ b/java/test/org/openqa/selenium/grid/node/relay/RelaySessionFactoryTest.java @@ -223,4 +223,69 @@ void remoteResponseOverridesStereotypeSePrefixedCaps() { // Remote response value should win over stereotype (merge overlays remote on top) assertThat(sessionCaps.getCapability("se:downloadsEnabled")).isEqualTo(false); } + + @Test + void requestedAppiumApplicationWinsOverBrowserName() { + String fakeSessionId = UUID.randomUUID().toString(); + + // Remote returns its own se:downloadsEnabled value + Map responsePayload = + Map.of( + "value", + Map.of( + "sessionId", + fakeSessionId, + "capabilities", + Map.of( + "platformName", "android", + "se:downloadsEnabled", false))); + + Route route = + Route.post("/session") + .to( + () -> + req -> { + HttpResponse response = new HttpResponse(); + response.setStatus(200); + response.setContent(Contents.asJson(responsePayload)); + return response; + }); + + PassthroughHttpClient.Factory clientFactory = new PassthroughHttpClient.Factory(route); + Tracer tracer = DefaultTestTracer.createTracer(); + + Capabilities stereotype = + new ImmutableCapabilities( + "browserName", "chrome", + "platformName", "android", + "se:downloadsEnabled", true); + + RelaySessionFactory factory = + new RelaySessionFactory( + tracer, + clientFactory, + Duration.ofSeconds(300), + URI.create("http://localhost:4723"), + null, + "", + stereotype); + + Capabilities requestCaps = + new ImmutableCapabilities( + "appium:app", "http://localhost/app.apk", + "platformName", "android"); + + CreateSessionRequest sessionRequest = + new CreateSessionRequest(Set.of(Dialect.W3C), requestCaps, Map.of()); + + Either result = factory.apply(sessionRequest); + + assertThat(result.isRight()).isTrue(); + ActiveSession session = result.right(); + Capabilities sessionCaps = session.getCapabilities(); + + // Remote response value should win over stereotype (merge overlays remote on top) + assertThat(sessionCaps.getCapability("appium:app")).isEqualTo("http://localhost/app.apk"); + assertThat(sessionCaps.getCapability("browserName")).isEqualTo(null); + } } From ef26129c9a4ad882043ad3653654b63aa49b892f Mon Sep 17 00:00:00 2001 From: bhecquet Date: Wed, 1 Apr 2026 11:23:02 +0200 Subject: [PATCH 2/3] #17274: clean code --- .../openqa/selenium/grid/node/relay/RelaySessionFactory.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java b/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java index 307958b8822f3..ccd6fd7852f23 100644 --- a/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java +++ b/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java @@ -165,9 +165,7 @@ public Either apply(CreateSessionRequest sess } capabilities = capabilities.merge(stereotype); - System.out.println(capabilities); capabilities = filterRelayCapabilities(capabilities); - System.out.println(capabilities); LOG.info("Starting session for " + capabilities); From fe95ce2e47ecb29953fb2ab5507020d8af536cbf Mon Sep 17 00:00:00 2001 From: bhecquet Date: Wed, 1 Apr 2026 11:25:36 +0200 Subject: [PATCH 3/3] #17274: clean code --- .../openqa/selenium/grid/node/relay/RelaySessionFactory.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java b/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java index ccd6fd7852f23..949d96f9ca311 100644 --- a/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java +++ b/java/src/org/openqa/selenium/grid/node/relay/RelaySessionFactory.java @@ -164,8 +164,7 @@ public Either apply(CreateSessionRequest sess "New session request capabilities do not " + "match the stereotype.")); } - capabilities = capabilities.merge(stereotype); - capabilities = filterRelayCapabilities(capabilities); + capabilities = filterRelayCapabilities(capabilities.merge(stereotype)); LOG.info("Starting session for " + capabilities);