Skip to content

Commit c7a4cdf

Browse files
committed
[dotnet] implement navigation commands with WebDriver BiDi
1 parent 96241de commit c7a4cdf

File tree

2 files changed

+79
-19
lines changed

2 files changed

+79
-19
lines changed

dotnet/src/webdriver/Navigator.cs

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
using System;
2020
using System.Collections.Generic;
2121
using System.Threading.Tasks;
22+
using WebDriverBiDi.BrowsingContext;
2223

2324
namespace OpenQA.Selenium
2425
{
@@ -28,6 +29,7 @@ namespace OpenQA.Selenium
2829
internal class Navigator : INavigation
2930
{
3031
private WebDriver driver;
32+
private string browsingContextId;
3133

3234
/// <summary>
3335
/// Initializes a new instance of the <see cref="Navigator"/> class
@@ -36,6 +38,8 @@ internal class Navigator : INavigation
3638
public Navigator(WebDriver driver)
3739
{
3840
this.driver = driver;
41+
// TODO: store the value of the current window's context id on the driver object
42+
this.browsingContextId = driver.CurrentWindowHandle;
3943
}
4044

4145
/// <summary>
@@ -55,7 +59,17 @@ public void Back()
5559
/// <returns>A task object representing the asynchronous operation.</returns>
5660
public async Task BackAsync()
5761
{
58-
await this.driver.InternalExecuteAsync(DriverCommand.GoBack, null).ConfigureAwait(false);
62+
if (this.driver.BiDiDriver != null)
63+
{
64+
var traverseHistoryCommandParameters =
65+
new TraverseHistoryCommandParameters(this.browsingContextId, -1);
66+
await this.driver.BiDiDriver.BrowsingContext.TraverseHistoryAsync(traverseHistoryCommandParameters)
67+
.ConfigureAwait(false);
68+
}
69+
else
70+
{
71+
await this.driver.InternalExecuteAsync(DriverCommand.GoBack, null).ConfigureAwait(false);
72+
}
5973
}
6074

6175
/// <summary>
@@ -75,7 +89,17 @@ public void Forward()
7589
/// <returns>A task object representing the asynchronous operation.</returns>
7690
public async Task ForwardAsync()
7791
{
78-
await this.driver.InternalExecuteAsync(DriverCommand.GoForward, null).ConfigureAwait(false);
92+
if (this.driver.BiDiDriver != null)
93+
{
94+
var traverseHistoryCommandParameters =
95+
new TraverseHistoryCommandParameters(this.browsingContextId, 1);
96+
await this.driver.BiDiDriver.BrowsingContext.TraverseHistoryAsync(traverseHistoryCommandParameters)
97+
.ConfigureAwait(false);
98+
}
99+
else
100+
{
101+
await this.driver.InternalExecuteAsync(DriverCommand.GoForward, null).ConfigureAwait(false);
102+
}
79103
}
80104

81105
/// <summary>
@@ -102,11 +126,18 @@ public async Task GoToUrlAsync(string url)
102126
throw new ArgumentNullException(nameof(url), "URL cannot be null.");
103127
}
104128

105-
Dictionary<string, object> parameters = new Dictionary<string, object>
129+
if (this.driver.BiDiDriver != null)
106130
{
107-
{ "url", url }
108-
};
109-
await this.driver.InternalExecuteAsync(DriverCommand.Get, parameters).ConfigureAwait(false);
131+
await driver.BiDiDriver.BrowsingContext.NavigateAsync(new NavigateCommandParameters(this.browsingContextId, url)).ConfigureAwait(false);
132+
}
133+
else
134+
{
135+
Dictionary<string, object> parameters = new Dictionary<string, object>
136+
{
137+
{ "url", url }
138+
};
139+
await this.driver.InternalExecuteAsync(DriverCommand.Get, parameters).ConfigureAwait(false);
140+
}
110141
}
111142

112143
/// <summary>
@@ -153,8 +184,16 @@ public void Refresh()
153184
/// <returns>A task object representing the asynchronous operation.</returns>
154185
public async Task RefreshAsync()
155186
{
156-
// driver.SwitchTo().DefaultContent();
157-
await this.driver.InternalExecuteAsync(DriverCommand.Refresh, null).ConfigureAwait(false);
187+
if (this.driver.BiDiDriver != null)
188+
{
189+
var reloadCommandParameters =
190+
new ReloadCommandParameters(this.browsingContextId);
191+
await this.driver.BiDiDriver.BrowsingContext.ReloadAsync(reloadCommandParameters).ConfigureAwait(false);
192+
}
193+
else
194+
{
195+
await this.driver.InternalExecuteAsync(DriverCommand.Refresh, null).ConfigureAwait(false);
196+
}
158197
}
159198
}
160199
}

dotnet/test/common/NavigationTest.cs

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using NUnit.Framework;
22
using System;
33
using System.Threading.Tasks;
4+
using WebDriverBiDi;
45

56
namespace OpenQA.Selenium
67
{
@@ -13,10 +14,20 @@ public class NavigationTest : DriverTestFixture
1314
[NeedsFreshDriver(IsCreatedBeforeTest = true)]
1415
public void ShouldNotHaveProblemNavigatingWithNoPagesBrowsed()
1516
{
16-
INavigation navigation;
17-
navigation = driver.Navigate();
18-
navigation.Back();
19-
navigation.Forward();
17+
INavigation navigation = driver.Navigate();
18+
19+
if (((WebDriver)driver).Capabilities.HasCapability("webSocketUrl"))
20+
{
21+
var ex1 = Assert.Throws<WebDriverBiDiException>(() => navigation.Back());
22+
Assert.True(ex1!.Message.Contains("no such history entry"));
23+
var ex2 = Assert.Throws<WebDriverBiDiException>(() => navigation.Forward());
24+
Assert.True(ex2!.Message.Contains("no such history entry"));
25+
}
26+
else
27+
{
28+
Assert.DoesNotThrow(() => navigation.Back());
29+
Assert.DoesNotThrow(() => navigation.Forward());
30+
}
2031
}
2132

2233
[Test]
@@ -25,8 +36,8 @@ public void ShouldGoBackAndForward()
2536
INavigation navigation;
2637
navigation = driver.Navigate();
2738

28-
driver.Url = macbethPage;
29-
driver.Url = simpleTestPage;
39+
navigation.GoToUrl(macbethPage);
40+
navigation.GoToUrl(simpleTestPage);
3041

3142
navigation.Back();
3243
Assert.AreEqual(macbethTitle, driver.Title);
@@ -96,8 +107,18 @@ public void ShouldRefreshPage()
96107
public Task ShouldNotHaveProblemNavigatingWithNoPagesBrowsedAsync()
97108
{
98109
var navigation = driver.Navigate();
99-
Assert.DoesNotThrowAsync(async () => await navigation.BackAsync());
100-
Assert.DoesNotThrowAsync(async () => await navigation.ForwardAsync());
110+
if (((WebDriver)driver).Capabilities.HasCapability("webSocketUrl"))
111+
{
112+
var ex1 = Assert.ThrowsAsync<WebDriverBiDiException>(async () => await navigation.BackAsync());
113+
Assert.True(ex1!.Message.Contains("no such history entry"));
114+
var ex2 = Assert.ThrowsAsync<WebDriverBiDiException>(async () => await navigation.ForwardAsync());
115+
Assert.True(ex2!.Message.Contains("no such history entry"));
116+
}
117+
else
118+
{
119+
Assert.DoesNotThrow(() => navigation.Back());
120+
Assert.DoesNotThrow(() =>navigation.Forward());
121+
}
101122
return Task.CompletedTask;
102123
}
103124

@@ -141,9 +162,9 @@ public void ShouldGoToUrlUsingUriAsync()
141162
var navigation = driver.Navigate();
142163

143164
navigation.GoToUrlAsync(new Uri(macbethPage));
144-
Assert.AreEqual(driver.Title, macbethTitle);
145-
navigation.GoToUrl(new Uri(simpleTestPage));
146-
Assert.AreEqual(simpleTestTitle, driver.Title);
165+
Assert.AreEqual(macbethTitle, driver.Title);
166+
navigation.GoToUrlAsync(new Uri(simpleTestPage));
167+
Assert.AreEqual(driver.Title, simpleTestTitle);
147168
}
148169

149170
[Test]

0 commit comments

Comments
 (0)