Skip to content

Commit 2beaa59

Browse files
authored
[java][bidi] Enable BiDi for Chromium browsers. Extend tests for BiDi supporting browsers. (#11626)
1 parent d97e441 commit 2beaa59

File tree

7 files changed

+125
-62
lines changed

7 files changed

+125
-62
lines changed

java/src/org/openqa/selenium/chromium/ChromiumDriver.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.openqa.selenium.remote.Browser.OPERA;
2323

2424
import java.net.URI;
25+
import java.net.URISyntaxException;
2526
import java.util.List;
2627
import java.util.Map;
2728
import java.util.Optional;
@@ -36,6 +37,9 @@
3637
import org.openqa.selenium.PersistentCapabilities;
3738
import org.openqa.selenium.WebDriver;
3839
import org.openqa.selenium.WebDriverException;
40+
import org.openqa.selenium.bidi.BiDi;
41+
import org.openqa.selenium.bidi.BiDiException;
42+
import org.openqa.selenium.bidi.HasBiDi;
3943
import org.openqa.selenium.devtools.CdpEndpointFinder;
4044
import org.openqa.selenium.devtools.CdpInfo;
4145
import org.openqa.selenium.devtools.CdpVersionFinder;
@@ -68,6 +72,7 @@
6872
*/
6973
public class ChromiumDriver extends RemoteWebDriver
7074
implements HasAuthentication,
75+
HasBiDi,
7176
HasCasting,
7277
HasCdp,
7378
HasDevTools,
@@ -92,6 +97,8 @@ public class ChromiumDriver extends RemoteWebDriver
9297
private final HasLaunchApp launch;
9398
private Optional<Connection> connection;
9499
private final Optional<DevTools> devTools;
100+
private final Optional<URI> biDiUri;
101+
private final Optional<BiDi> biDi;
95102
protected HasCasting casting;
96103
protected HasCdp cdp;
97104

@@ -108,6 +115,23 @@ protected ChromiumDriver(
108115

109116
HttpClient.Factory factory = HttpClient.Factory.createDefault();
110117
Capabilities originalCapabilities = super.getCapabilities();
118+
119+
Optional<String> webSocketUrl =
120+
Optional.ofNullable((String) originalCapabilities.getCapability("webSocketUrl"));
121+
122+
this.biDiUri =
123+
webSocketUrl.map(
124+
uri -> {
125+
try {
126+
return new URI(uri);
127+
} catch (URISyntaxException e) {
128+
LOG.warning(e.getMessage());
129+
}
130+
return null;
131+
});
132+
133+
this.biDi = createBiDi(biDiUri);
134+
111135
Optional<URI> cdpUri =
112136
CdpEndpointFinder.getReportedUri(capabilityKey, originalCapabilities)
113137
.flatMap(uri -> CdpEndpointFinder.getCdpEndPoint(factory, uri));
@@ -231,6 +255,30 @@ public Optional<DevTools> maybeGetDevTools() {
231255
return devTools;
232256
}
233257

258+
private Optional<BiDi> createBiDi(Optional<URI> biDiUri) {
259+
if (!biDiUri.isPresent()) {
260+
return Optional.empty();
261+
}
262+
263+
URI wsUri =
264+
biDiUri.orElseThrow(
265+
() -> new BiDiException("This version of Chromium driver does not support BiDi"));
266+
267+
HttpClient.Factory clientFactory = HttpClient.Factory.createDefault();
268+
ClientConfig wsConfig = ClientConfig.defaultConfig().baseUri(wsUri);
269+
HttpClient wsClient = clientFactory.createClient(wsConfig);
270+
271+
org.openqa.selenium.bidi.Connection biDiConnection =
272+
new org.openqa.selenium.bidi.Connection(wsClient, wsUri.toString());
273+
274+
return Optional.of(new BiDi(biDiConnection));
275+
}
276+
277+
@Override
278+
public Optional<BiDi> maybeGetBiDi() {
279+
return biDi;
280+
}
281+
234282
@Override
235283
public List<Map<String, String>> getCastSinks() {
236284
return casting.getCastSinks();

java/test/org/openqa/selenium/WindowSwitchingTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import static org.openqa.selenium.WaitingConditions.windowHandleCountToBeGreaterThan;
2525
import static org.openqa.selenium.support.ui.ExpectedConditions.alertIsPresent;
2626
import static org.openqa.selenium.testing.TestUtilities.isInternetExplorer;
27+
import static org.openqa.selenium.testing.drivers.Browser.CHROME;
2728
import static org.openqa.selenium.testing.drivers.Browser.FIREFOX;
2829
import static org.openqa.selenium.testing.drivers.Browser.HTMLUNIT;
2930
import static org.openqa.selenium.testing.drivers.Browser.IE;
@@ -152,6 +153,7 @@ void testShouldThrowNoSuchWindowExceptionOnAnyElementOperationIfAWindowIsClosed(
152153
@NoDriverAfterTest
153154
@Test
154155
@Ignore(IE)
156+
@Ignore(value = CHROME, reason = "https://bugs.chromium.org/p/chromedriver/issues/detail?id=4468")
155157
public void testShouldBeAbleToIterateOverAllOpenWindows() {
156158
driver.get(pages.xhtmlTestPage);
157159
String original = driver.getWindowHandle();

java/test/org/openqa/selenium/bidi/BiDiSessionTest.java

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,38 +18,25 @@
1818
package org.openqa.selenium.bidi;
1919

2020
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
21+
import static org.openqa.selenium.testing.drivers.Browser.IE;
22+
import static org.openqa.selenium.testing.drivers.Browser.SAFARI;
2123

2224
import java.util.Collections;
23-
import org.junit.jupiter.api.AfterEach;
2425
import org.junit.jupiter.api.Test;
25-
import org.openqa.selenium.firefox.FirefoxDriver;
26-
import org.openqa.selenium.firefox.FirefoxOptions;
27-
import org.openqa.selenium.testing.drivers.Browser;
26+
import org.openqa.selenium.testing.JupiterTestBase;
27+
import org.openqa.selenium.testing.NotYetImplemented;
2828

29-
class BiDiSessionTest {
30-
31-
private FirefoxDriver driver;
29+
class BiDiSessionTest extends JupiterTestBase {
3230

3331
@Test
32+
@NotYetImplemented(SAFARI)
33+
@NotYetImplemented(IE)
3434
void shouldBeAbleToCreateABiDiSession() {
35-
FirefoxOptions options = (FirefoxOptions) Browser.FIREFOX.getCapabilities();
36-
// Enable BiDi
37-
options.setCapability("webSocketUrl", true);
38-
39-
driver = new FirefoxDriver(options);
40-
41-
BiDi biDi = driver.getBiDi();
35+
BiDi biDi = ((HasBiDi) driver).getBiDi();
4236

4337
BiDiSessionStatus status =
4438
biDi.send(new Command<>("session.status", Collections.emptyMap(), BiDiSessionStatus.class));
4539
assertThat(status).isNotNull();
46-
assertThat(status.getMessage()).isEqualTo("Session already started");
47-
}
48-
49-
@AfterEach
50-
public void quitDriver() {
51-
if (driver != null) {
52-
driver.quit();
53-
}
40+
assertThat(status.getMessage()).isNotEmpty();
5441
}
5542
}

java/test/org/openqa/selenium/bidi/BiDiTest.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919

2020
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
2121
import static org.openqa.selenium.testing.Safely.safelyCall;
22+
import static org.openqa.selenium.testing.drivers.Browser.CHROME;
23+
import static org.openqa.selenium.testing.drivers.Browser.EDGE;
24+
import static org.openqa.selenium.testing.drivers.Browser.IE;
25+
import static org.openqa.selenium.testing.drivers.Browser.SAFARI;
2226

2327
import java.util.concurrent.CompletableFuture;
2428
import java.util.concurrent.ExecutionException;
@@ -30,32 +34,30 @@
3034
import org.openqa.selenium.By;
3135
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
3236
import org.openqa.selenium.bidi.browsingcontext.NavigationResult;
37+
import org.openqa.selenium.bidi.browsingcontext.ReadinessState;
3338
import org.openqa.selenium.bidi.log.JavascriptLogEntry;
3439
import org.openqa.selenium.bidi.log.LogLevel;
3540
import org.openqa.selenium.environment.webserver.AppServer;
3641
import org.openqa.selenium.environment.webserver.NettyAppServer;
37-
import org.openqa.selenium.firefox.FirefoxDriver;
38-
import org.openqa.selenium.firefox.FirefoxOptions;
39-
import org.openqa.selenium.testing.drivers.Browser;
42+
import org.openqa.selenium.testing.JupiterTestBase;
43+
import org.openqa.selenium.testing.NotYetImplemented;
4044

41-
class BiDiTest {
45+
class BiDiTest extends JupiterTestBase {
4246

4347
String page;
4448
private AppServer server;
45-
private FirefoxDriver driver;
4649

4750
@BeforeEach
4851
public void setUp() {
49-
FirefoxOptions options = (FirefoxOptions) Browser.FIREFOX.getCapabilities();
50-
options.setCapability("webSocketUrl", true);
51-
52-
driver = new FirefoxDriver(options);
53-
5452
server = new NettyAppServer();
5553
server.start();
5654
}
5755

5856
@Test
57+
@NotYetImplemented(SAFARI)
58+
@NotYetImplemented(IE)
59+
@NotYetImplemented(CHROME)
60+
@NotYetImplemented(EDGE)
5961
void canNavigateAndListenToErrors()
6062
throws ExecutionException, InterruptedException, TimeoutException {
6163
try (LogInspector logInspector = new LogInspector(driver)) {
@@ -65,7 +67,7 @@ void canNavigateAndListenToErrors()
6567
BrowsingContext browsingContext = new BrowsingContext(driver, driver.getWindowHandle());
6668

6769
page = server.whereIs("/bidi/logEntryAdded.html");
68-
NavigationResult info = browsingContext.navigate(page);
70+
NavigationResult info = browsingContext.navigate(page, ReadinessState.COMPLETE);
6971

7072
assertThat(browsingContext.getId()).isNotEmpty();
7173
assertThat(info.getNavigationId()).isNull();

java/test/org/openqa/selenium/bidi/browsingcontext/BrowsingContextTest.java

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,92 +20,110 @@
2020
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
2121
import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType;
2222
import static org.openqa.selenium.testing.Safely.safelyCall;
23+
import static org.openqa.selenium.testing.drivers.Browser.CHROME;
24+
import static org.openqa.selenium.testing.drivers.Browser.EDGE;
25+
import static org.openqa.selenium.testing.drivers.Browser.IE;
26+
import static org.openqa.selenium.testing.drivers.Browser.SAFARI;
2327

2428
import java.util.List;
2529
import org.junit.jupiter.api.AfterEach;
2630
import org.junit.jupiter.api.BeforeEach;
2731
import org.junit.jupiter.api.Test;
28-
import org.junit.jupiter.api.extension.RegisterExtension;
29-
import org.openqa.selenium.WebDriver;
3032
import org.openqa.selenium.WindowType;
3133
import org.openqa.selenium.bidi.BiDiException;
3234
import org.openqa.selenium.environment.webserver.AppServer;
3335
import org.openqa.selenium.environment.webserver.NettyAppServer;
34-
import org.openqa.selenium.testing.NeedsFreshDriver;
35-
import org.openqa.selenium.testing.SeleniumExtension;
36+
import org.openqa.selenium.testing.JupiterTestBase;
37+
import org.openqa.selenium.testing.NotYetImplemented;
3638

37-
class BrowsingContextTest {
39+
class BrowsingContextTest extends JupiterTestBase {
3840

39-
@RegisterExtension static SeleniumExtension seleniumExtension = new SeleniumExtension();
4041
private AppServer server;
41-
private WebDriver driver;
4242

4343
@BeforeEach
4444
public void setUp() {
45-
driver = seleniumExtension.getDriver();
46-
4745
server = new NettyAppServer();
4846
server.start();
4947
}
5048

5149
@Test
50+
@NotYetImplemented(SAFARI)
51+
@NotYetImplemented(IE)
5252
void canCreateABrowsingContextForGivenId() {
5353
String id = driver.getWindowHandle();
5454
BrowsingContext browsingContext = new BrowsingContext(driver, id);
5555
assertThat(browsingContext.getId()).isEqualTo(id);
5656
}
5757

5858
@Test
59+
@NotYetImplemented(SAFARI)
60+
@NotYetImplemented(IE)
5961
void canCreateAWindow() {
6062
BrowsingContext browsingContext = new BrowsingContext(driver, WindowType.WINDOW);
6163
assertThat(browsingContext.getId()).isNotEmpty();
6264
}
6365

6466
@Test
67+
@NotYetImplemented(SAFARI)
68+
@NotYetImplemented(IE)
69+
@NotYetImplemented(CHROME)
70+
@NotYetImplemented(EDGE)
6571
void canCreateAWindowWithAReferenceContext() {
6672
BrowsingContext browsingContext =
6773
new BrowsingContext(driver, WindowType.WINDOW, driver.getWindowHandle());
6874
assertThat(browsingContext.getId()).isNotEmpty();
6975
}
7076

7177
@Test
78+
@NotYetImplemented(SAFARI)
79+
@NotYetImplemented(IE)
7280
void canCreateATab() {
7381
BrowsingContext browsingContext = new BrowsingContext(driver, WindowType.TAB);
7482
assertThat(browsingContext.getId()).isNotEmpty();
7583
}
7684

7785
@Test
86+
@NotYetImplemented(SAFARI)
87+
@NotYetImplemented(IE)
88+
@NotYetImplemented(CHROME)
89+
@NotYetImplemented(EDGE)
7890
void canCreateATabWithAReferenceContext() {
7991
BrowsingContext browsingContext =
8092
new BrowsingContext(driver, WindowType.TAB, driver.getWindowHandle());
8193
assertThat(browsingContext.getId()).isNotEmpty();
8294
}
8395

8496
@Test
97+
@NotYetImplemented(SAFARI)
98+
@NotYetImplemented(IE)
8599
void canNavigateToAUrl() {
86100
BrowsingContext browsingContext = new BrowsingContext(driver, WindowType.TAB);
87101

88102
String url = server.whereIs("/bidi/logEntryAdded.html");
89103
NavigationResult info = browsingContext.navigate(url);
90104

91105
assertThat(browsingContext.getId()).isNotEmpty();
92-
assertThat(info.getNavigationId()).isNull();
93106
assertThat(info.getUrl()).contains("/bidi/logEntryAdded.html");
94107
}
95108

96109
@Test
110+
@NotYetImplemented(SAFARI)
111+
@NotYetImplemented(IE)
97112
void canNavigateToAUrlWithReadinessState() {
98113
BrowsingContext browsingContext = new BrowsingContext(driver, WindowType.TAB);
99114

100115
String url = server.whereIs("/bidi/logEntryAdded.html");
101116
NavigationResult info = browsingContext.navigate(url, ReadinessState.COMPLETE);
102117

103118
assertThat(browsingContext.getId()).isNotEmpty();
104-
assertThat(info.getNavigationId()).isNull();
105119
assertThat(info.getUrl()).contains("/bidi/logEntryAdded.html");
106120
}
107121

108122
@Test
123+
@NotYetImplemented(SAFARI)
124+
@NotYetImplemented(IE)
125+
@NotYetImplemented(CHROME)
126+
@NotYetImplemented(EDGE)
109127
void canGetTreeWithAChild() {
110128
String referenceContextId = driver.getWindowHandle();
111129
BrowsingContext parentWindow = new BrowsingContext(driver, referenceContextId);
@@ -124,6 +142,10 @@ void canGetTreeWithAChild() {
124142
}
125143

126144
@Test
145+
@NotYetImplemented(SAFARI)
146+
@NotYetImplemented(IE)
147+
@NotYetImplemented(CHROME)
148+
@NotYetImplemented(EDGE)
127149
void canGetTreeWithDepth() {
128150
String referenceContextId = driver.getWindowHandle();
129151
BrowsingContext parentWindow = new BrowsingContext(driver, referenceContextId);
@@ -141,7 +163,8 @@ void canGetTreeWithDepth() {
141163
}
142164

143165
@Test
144-
@NeedsFreshDriver
166+
@NotYetImplemented(SAFARI)
167+
@NotYetImplemented(IE)
145168
void canGetAllTopLevelContexts() {
146169
BrowsingContext window1 = new BrowsingContext(driver, driver.getWindowHandle());
147170
BrowsingContext window2 = new BrowsingContext(driver, WindowType.WINDOW);
@@ -152,6 +175,8 @@ void canGetAllTopLevelContexts() {
152175
}
153176

154177
@Test
178+
@NotYetImplemented(SAFARI)
179+
@NotYetImplemented(IE)
155180
void canCloseAWindow() {
156181
BrowsingContext window1 = new BrowsingContext(driver, WindowType.WINDOW);
157182
BrowsingContext window2 = new BrowsingContext(driver, WindowType.WINDOW);
@@ -162,6 +187,8 @@ void canCloseAWindow() {
162187
}
163188

164189
@Test
190+
@NotYetImplemented(SAFARI)
191+
@NotYetImplemented(IE)
165192
void canCloseATab() {
166193
BrowsingContext tab1 = new BrowsingContext(driver, WindowType.TAB);
167194
BrowsingContext tab2 = new BrowsingContext(driver, WindowType.TAB);
@@ -176,6 +203,9 @@ void canCloseATab() {
176203

177204
@AfterEach
178205
public void quitDriver() {
179-
safelyCall(seleniumExtension::removeDriver, server::stop);
206+
if (driver != null) {
207+
driver.quit();
208+
}
209+
safelyCall(server::stop);
180210
}
181211
}

0 commit comments

Comments
 (0)