From 1fe83b8226790452dc1ff6bf4c840665bebc9c8c Mon Sep 17 00:00:00 2001 From: titusfortner Date: Tue, 21 May 2024 14:23:53 -0700 Subject: [PATCH 01/15] [dotnet] toggle starting test server with Java if Runfiles are not available --- .../common/Environment/EnvironmentManager.cs | 5 +- .../test/common/Environment/TestWebServer.cs | 100 ++++++++---------- 2 files changed, 50 insertions(+), 55 deletions(-) diff --git a/dotnet/test/common/Environment/EnvironmentManager.cs b/dotnet/test/common/Environment/EnvironmentManager.cs index 3fc16fac54222..dd21805b51cb6 100644 --- a/dotnet/test/common/Environment/EnvironmentManager.cs +++ b/dotnet/test/common/Environment/EnvironmentManager.cs @@ -24,9 +24,10 @@ public class EnvironmentManager private EnvironmentManager() { string dataFilePath; - var runfiles = Runfiles.Create(); + Runfiles runfiles = null; try { + runfiles = Runfiles.Create(); dataFilePath = runfiles.Rlocation("_main/dotnet/test/common/appconfig.json"); } catch (FileNotFoundException) @@ -143,6 +144,8 @@ private EnvironmentManager() try { string managerFilePath = ""; + runfiles ??= Runfiles.Create(); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { managerFilePath = runfiles.Rlocation("_main/dotnet/src/webdriver/manager/windows/selenium-manager.exe"); diff --git a/dotnet/test/common/Environment/TestWebServer.cs b/dotnet/test/common/Environment/TestWebServer.cs index f0e58d32fed19..50ec56c7a27c2 100644 --- a/dotnet/test/common/Environment/TestWebServer.cs +++ b/dotnet/test/common/Environment/TestWebServer.cs @@ -20,14 +20,16 @@ public class TestWebServer private string javaHomeDirectory; private string port; - private StringBuilder outputData = new StringBuilder(); - public TestWebServer(string projectRoot, TestWebServerConfig config) { this.projectRootPath = projectRoot; this.captureWebServerOutput = config.CaptureConsoleOutput; this.hideCommandPrompt = config.HideCommandPromptWindow; this.javaHomeDirectory = config.JavaHomeDirectory; + if (string.IsNullOrEmpty(this.javaHomeDirectory)) + { + this.javaHomeDirectory = System.Environment.GetEnvironmentVariable("JAVA_HOME"); + } this.port = config.Port; } @@ -39,16 +41,15 @@ public void Start() { var runfiles = Runfiles.Create(); standaloneTestJar = runfiles.Rlocation(standaloneTestJar); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + standaloneTestJar += ".exe"; + } } catch (FileNotFoundException) { var baseDirectory = AppContext.BaseDirectory; - standaloneTestJar = Path.Combine(baseDirectory, "../../../../../../bazel-bin/java/test/org/openqa/selenium/environment/appserver"); - } - - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - standaloneTestJar += ".exe"; + standaloneTestJar = Path.Combine(baseDirectory, "../../../../../../bazel-bin/java/test/org/openqa/selenium/environment/appserver_deploy.jar"); } Console.Write("Standalone jar is " + standaloneTestJar); @@ -59,65 +60,49 @@ public void Start() string.Format( "Test webserver jar at {0} didn't exist. Project root is {2}. Please build it using something like {1}.", standaloneTestJar, - "bazel build //java/test/org/openqa/selenium/environment:appserver_deploy.jar", + "bazel build //java/test/org/openqa/selenium/environment:appserver", projectRootPath)); } - //List javaSystemProperties = new List(); - StringBuilder processArgsBuilder = new StringBuilder(); - // foreach (string systemProperty in javaSystemProperties) - // { - // if (processArgsBuilder.Length > 0) - // { - // processArgsBuilder.Append(" "); - // } - // - // processArgsBuilder.AppendFormat("-D{0}", systemProperty); - // } - // - // if (processArgsBuilder.Length > 0) - // { - // processArgsBuilder.Append(" "); - // } - // - // processArgsBuilder.AppendFormat("-jar {0}", standaloneTestJar); - processArgsBuilder.AppendFormat(" {0}", this.port); - - Console.Write(processArgsBuilder.ToString()); + ProcessStartInfo startInfo = new ProcessStartInfo + { + WorkingDirectory = projectRootPath, + UseShellExecute = !(hideCommandPrompt || captureWebServerOutput), + CreateNoWindow = hideCommandPrompt, + RedirectStandardOutput = captureWebServerOutput, + RedirectStandardError = captureWebServerOutput + }; + + if (standaloneTestJar != null && standaloneTestJar.EndsWith(".jar")) + { + processArgsBuilder.AppendFormat("-jar \"{0}\" {1}", standaloneTestJar, this.port); + string javaExecutable = Path.Combine(javaHomeDirectory, "bin", "java"); + if (!File.Exists(javaExecutable)) + { + throw new FileNotFoundException($"Java executable not found at {javaExecutable}"); + } - webserverProcess = new Process(); - webserverProcess.StartInfo.FileName = standaloneTestJar; - // if (!string.IsNullOrEmpty(javaExecutablePath)) - // { - // webserverProcess.StartInfo.FileName = Path.Combine(javaExecutablePath, javaExecutableName); - // } - // else - // { - // webserverProcess.StartInfo.FileName = javaExecutableName; - // } - - webserverProcess.StartInfo.Arguments = processArgsBuilder.ToString(); - webserverProcess.StartInfo.WorkingDirectory = projectRootPath; - webserverProcess.StartInfo.UseShellExecute = !(hideCommandPrompt || captureWebServerOutput); - webserverProcess.StartInfo.CreateNoWindow = hideCommandPrompt; - if (!string.IsNullOrEmpty(this.javaHomeDirectory)) + startInfo.FileName = javaExecutable; + } + else { - webserverProcess.StartInfo.EnvironmentVariables["JAVA_HOME"] = this.javaHomeDirectory; + processArgsBuilder.AppendFormat(" {0}", this.port); + startInfo.FileName = standaloneTestJar; } - captureWebServerOutput = true; - - if (captureWebServerOutput) + Console.Write(processArgsBuilder.ToString()); + startInfo.Arguments = processArgsBuilder.ToString(); + if (!string.IsNullOrEmpty(this.javaHomeDirectory)) { - webserverProcess.StartInfo.RedirectStandardOutput = true; - webserverProcess.StartInfo.RedirectStandardError = true; + startInfo.EnvironmentVariables["JAVA_HOME"] = this.javaHomeDirectory; } + webserverProcess = new Process { StartInfo = startInfo }; webserverProcess.Start(); TimeSpan timeout = TimeSpan.FromSeconds(30); - DateTime endTime = DateTime.Now.Add(TimeSpan.FromSeconds(30)); + DateTime endTime = DateTime.Now.Add(timeout); bool isRunning = false; // Poll until the webserver is correctly serving pages. @@ -161,7 +146,14 @@ public void Stop() { using (var httpClient = new HttpClient()) { - using (var quitResponse = httpClient.GetAsync(EnvironmentManager.Instance.UrlBuilder.LocalWhereIs("quitquitquit")).GetAwaiter().GetResult()) + try + { + using (httpClient.GetAsync(EnvironmentManager.Instance.UrlBuilder.LocalWhereIs("quitquitquit")).GetAwaiter().GetResult()) + { + + } + } + catch (HttpRequestException) { } From 2489721fd692270e4dc3b7d817617a8e01a3707c Mon Sep 17 00:00:00 2001 From: titusfortner Date: Thu, 16 May 2024 11:02:32 -0700 Subject: [PATCH 02/15] [dotnet] allow driver to execute commands asynchronously --- dotnet/src/webdriver/ICommandExecutor.cs | 9 +++++++ .../Remote/DriverServiceCommandExecutor.cs | 13 +++++++++- .../webdriver/Remote/HttpCommandExecutor.cs | 12 ++++++++- dotnet/src/webdriver/WebDriver.cs | 26 ++++++++++++++++--- 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/dotnet/src/webdriver/ICommandExecutor.cs b/dotnet/src/webdriver/ICommandExecutor.cs index 68cfe200391f4..8635f413ba71b 100644 --- a/dotnet/src/webdriver/ICommandExecutor.cs +++ b/dotnet/src/webdriver/ICommandExecutor.cs @@ -17,6 +17,7 @@ // using System; +using System.Threading.Tasks; namespace OpenQA.Selenium { @@ -39,5 +40,13 @@ public interface ICommandExecutor : IDisposable /// The command you wish to execute /// A response from the browser Response Execute(Command commandToExecute); + + + /// + /// Executes a command Asynchronously + /// + /// The command you wish to execute + /// A task object representing the asynchronous operation + Task ExecuteAsync(Command commandToExecute); } } diff --git a/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs b/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs index 4b0fcb27ed7fc..db8802055f780 100644 --- a/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs @@ -17,6 +17,7 @@ // using System; +using System.Threading.Tasks; namespace OpenQA.Selenium.Remote { @@ -92,6 +93,16 @@ public HttpCommandExecutor HttpExecutor /// The command you wish to execute /// A response from the browser public Response Execute(Command commandToExecute) + { + return this.ExecuteAsync(commandToExecute).GetAwaiter().GetResult(); + } + + /// + /// Executes a command Asynchronously + /// + /// The command you wish to execute + /// A task object representing the asynchronous operation + public async Task ExecuteAsync(Command commandToExecute) { if (commandToExecute == null) { @@ -108,7 +119,7 @@ public Response Execute(Command commandToExecute) // command, so that we can get the finally block. try { - toReturn = this.internalExecutor.Execute(commandToExecute); + toReturn = await this.internalExecutor.ExecuteAsync(commandToExecute); } finally { diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 3dbb5e4efd179..19feb9b91895d 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -158,6 +158,16 @@ public bool TryAddCommand(string commandName, CommandInfo info) /// The command you wish to execute /// A response from the browser public virtual Response Execute(Command commandToExecute) + { + return this.ExecuteAsync(commandToExecute).GetAwaiter().GetResult(); + } + + /// + /// Executes a command Asynchronously + /// + /// The command you wish to execute + /// A task object representing the asynchronous operation + public virtual async Task ExecuteAsync(Command commandToExecute) { if (commandToExecute == null) { @@ -184,7 +194,7 @@ public virtual Response Execute(Command commandToExecute) HttpResponseInfo responseInfo = null; try { - responseInfo = Task.Run(async () => await this.MakeHttpRequest(requestInfo)).GetAwaiter().GetResult(); + responseInfo = await this.MakeHttpRequest(requestInfo); } catch (HttpRequestException ex) { diff --git a/dotnet/src/webdriver/WebDriver.cs b/dotnet/src/webdriver/WebDriver.cs index 3de43e25c452f..2660337c6ad43 100644 --- a/dotnet/src/webdriver/WebDriver.cs +++ b/dotnet/src/webdriver/WebDriver.cs @@ -24,6 +24,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Globalization; +using System.Threading.Tasks; namespace OpenQA.Selenium { @@ -556,16 +557,35 @@ internal ReadOnlyCollection GetElementsFromResponse(Response respon /// WebDriver Response internal Response InternalExecute(string driverCommandToExecute, Dictionary parameters) { - return this.Execute(driverCommandToExecute, parameters); + return this.InternalExecuteAsync(driverCommandToExecute, parameters).GetAwaiter().GetResult(); } + /// + /// Executes commands with the driver asynchronously + /// + /// Command that needs executing + /// Parameters needed for the command + /// A task object representing the asynchronous operation + internal Task InternalExecuteAsync(string driverCommandToExecute, + Dictionary parameters) + { + return this.ExecuteAsync(driverCommandToExecute, parameters); + } + + internal Response Execute(string driverCommandToExecute, + Dictionary parameters) + { + return this.ExecuteAsync(driverCommandToExecute, parameters).GetAwaiter().GetResult(); + } + + /// /// Executes a command with this driver . /// /// A value representing the command to execute. /// A containing the names and values of the parameters of the command. /// A containing information about the success or failure of the command and any data returned by the command. - protected virtual Response Execute(string driverCommandToExecute, Dictionary parameters) + protected virtual async Task ExecuteAsync(string driverCommandToExecute, Dictionary parameters) { Command commandToExecute = new Command(this.sessionId, driverCommandToExecute, parameters); @@ -573,7 +593,7 @@ protected virtual Response Execute(string driverCommandToExecute, Dictionary Date: Thu, 16 May 2024 11:06:02 -0700 Subject: [PATCH 03/15] [dotnet] implement Navigation BackAsync with async execution --- dotnet/src/webdriver/INavigation.cs | 7 +++++++ dotnet/src/webdriver/Navigator.cs | 12 +++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/dotnet/src/webdriver/INavigation.cs b/dotnet/src/webdriver/INavigation.cs index bff75d4743e6b..f12786a3e212e 100644 --- a/dotnet/src/webdriver/INavigation.cs +++ b/dotnet/src/webdriver/INavigation.cs @@ -17,6 +17,7 @@ // using System; +using System.Threading.Tasks; namespace OpenQA.Selenium { @@ -31,6 +32,12 @@ public interface INavigation /// void Back(); + /// + /// Move back a single entry in the browser's history. + /// + /// A task object representing the asynchronous operation + Task BackAsync(); + /// /// Move a single "item" forward in the browser's history. /// diff --git a/dotnet/src/webdriver/Navigator.cs b/dotnet/src/webdriver/Navigator.cs index f8f6047e91f5a..c80d48b718964 100644 --- a/dotnet/src/webdriver/Navigator.cs +++ b/dotnet/src/webdriver/Navigator.cs @@ -17,6 +17,7 @@ // using System; +using System.Threading.Tasks; using System.Collections.Generic; namespace OpenQA.Selenium @@ -42,7 +43,16 @@ public Navigator(WebDriver driver) /// public void Back() { - this.driver.InternalExecute(DriverCommand.GoBack, null); + BackAsync().GetAwaiter().GetResult(); + } + + /// + /// Move back a single entry in the browser's history. + /// + /// A task object representing the asynchronous operation + public async Task BackAsync() + { + await this.driver.InternalExecuteAsync(DriverCommand.GoBack, null); } /// From 087f345db6b38f8019e60f5de1daa42282d05744 Mon Sep 17 00:00:00 2001 From: titusfortner Date: Thu, 16 May 2024 11:45:02 -0700 Subject: [PATCH 04/15] [dotnet] wrap async executions inside task run --- dotnet/src/webdriver/Navigator.cs | 2 +- dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs | 2 +- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 2 +- dotnet/src/webdriver/WebDriver.cs | 5 ++--- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/dotnet/src/webdriver/Navigator.cs b/dotnet/src/webdriver/Navigator.cs index c80d48b718964..c69492bc3ae77 100644 --- a/dotnet/src/webdriver/Navigator.cs +++ b/dotnet/src/webdriver/Navigator.cs @@ -43,7 +43,7 @@ public Navigator(WebDriver driver) /// public void Back() { - BackAsync().GetAwaiter().GetResult(); + Task.Run(this.BackAsync).GetAwaiter().GetResult(); } /// diff --git a/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs b/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs index db8802055f780..7a32ae343fbad 100644 --- a/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs @@ -94,7 +94,7 @@ public HttpCommandExecutor HttpExecutor /// A response from the browser public Response Execute(Command commandToExecute) { - return this.ExecuteAsync(commandToExecute).GetAwaiter().GetResult(); + return Task.Run(() => this.ExecuteAsync(commandToExecute)).GetAwaiter().GetResult(); } /// diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 19feb9b91895d..ae6fd7c1edd09 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -159,7 +159,7 @@ public bool TryAddCommand(string commandName, CommandInfo info) /// A response from the browser public virtual Response Execute(Command commandToExecute) { - return this.ExecuteAsync(commandToExecute).GetAwaiter().GetResult(); + return Task.Run(() => this.ExecuteAsync(commandToExecute)).GetAwaiter().GetResult(); } /// diff --git a/dotnet/src/webdriver/WebDriver.cs b/dotnet/src/webdriver/WebDriver.cs index 2660337c6ad43..ce5ac465b64f9 100644 --- a/dotnet/src/webdriver/WebDriver.cs +++ b/dotnet/src/webdriver/WebDriver.cs @@ -557,7 +557,7 @@ internal ReadOnlyCollection GetElementsFromResponse(Response respon /// WebDriver Response internal Response InternalExecute(string driverCommandToExecute, Dictionary parameters) { - return this.InternalExecuteAsync(driverCommandToExecute, parameters).GetAwaiter().GetResult(); + return Task.Run(() => this.InternalExecuteAsync(driverCommandToExecute, parameters)).GetAwaiter().GetResult(); } /// @@ -575,10 +575,9 @@ internal Response InternalExecute(string driverCommandToExecute, Dictionary parameters) { - return this.ExecuteAsync(driverCommandToExecute, parameters).GetAwaiter().GetResult(); + return Task.Run(() => this.ExecuteAsync(driverCommandToExecute, parameters)).GetAwaiter().GetResult(); } - /// /// Executes a command with this driver . /// From c36913f8aa60a6d77ac82b7735bc666ef81dc488 Mon Sep 17 00:00:00 2001 From: titusfortner Date: Thu, 16 May 2024 17:04:28 -0700 Subject: [PATCH 05/15] [dotnet] set configure away to false when synchronizing tasks --- dotnet/src/webdriver/Navigator.cs | 2 +- dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs | 2 +- dotnet/src/webdriver/Remote/HttpCommandExecutor.cs | 2 +- dotnet/src/webdriver/WebDriver.cs | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dotnet/src/webdriver/Navigator.cs b/dotnet/src/webdriver/Navigator.cs index c69492bc3ae77..efa329b53ef07 100644 --- a/dotnet/src/webdriver/Navigator.cs +++ b/dotnet/src/webdriver/Navigator.cs @@ -43,7 +43,7 @@ public Navigator(WebDriver driver) /// public void Back() { - Task.Run(this.BackAsync).GetAwaiter().GetResult(); + Task.Run(this.BackAsync).ConfigureAwait(false).GetAwaiter().GetResult(); } /// diff --git a/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs b/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs index 7a32ae343fbad..af94264e4e05d 100644 --- a/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs @@ -94,7 +94,7 @@ public HttpCommandExecutor HttpExecutor /// A response from the browser public Response Execute(Command commandToExecute) { - return Task.Run(() => this.ExecuteAsync(commandToExecute)).GetAwaiter().GetResult(); + return Task.Run(() => this.ExecuteAsync(commandToExecute)).ConfigureAwait(false).GetAwaiter().GetResult(); } /// diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index ae6fd7c1edd09..53eec1ca57d08 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -159,7 +159,7 @@ public bool TryAddCommand(string commandName, CommandInfo info) /// A response from the browser public virtual Response Execute(Command commandToExecute) { - return Task.Run(() => this.ExecuteAsync(commandToExecute)).GetAwaiter().GetResult(); + return Task.Run(() => this.ExecuteAsync(commandToExecute)).ConfigureAwait(false).GetAwaiter().GetResult(); } /// diff --git a/dotnet/src/webdriver/WebDriver.cs b/dotnet/src/webdriver/WebDriver.cs index ce5ac465b64f9..a978bf2270c88 100644 --- a/dotnet/src/webdriver/WebDriver.cs +++ b/dotnet/src/webdriver/WebDriver.cs @@ -557,7 +557,7 @@ internal ReadOnlyCollection GetElementsFromResponse(Response respon /// WebDriver Response internal Response InternalExecute(string driverCommandToExecute, Dictionary parameters) { - return Task.Run(() => this.InternalExecuteAsync(driverCommandToExecute, parameters)).GetAwaiter().GetResult(); + return Task.Run(() => this.InternalExecuteAsync(driverCommandToExecute, parameters)).ConfigureAwait(false).GetAwaiter().GetResult(); } /// @@ -575,7 +575,7 @@ internal Response InternalExecute(string driverCommandToExecute, Dictionary parameters) { - return Task.Run(() => this.ExecuteAsync(driverCommandToExecute, parameters)).GetAwaiter().GetResult(); + return Task.Run(() => this.ExecuteAsync(driverCommandToExecute, parameters)).ConfigureAwait(false).GetAwaiter().GetResult(); } /// From 70d90b1bf6b2c9b3616ba1b1369257073cfe8d2f Mon Sep 17 00:00:00 2001 From: titusfortner Date: Fri, 17 May 2024 09:02:23 -0700 Subject: [PATCH 06/15] fix compile error --- dotnet/src/support/Events/EventFiringWebDriver.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dotnet/src/support/Events/EventFiringWebDriver.cs b/dotnet/src/support/Events/EventFiringWebDriver.cs index ac428cf2830b5..1e61be04402ca 100644 --- a/dotnet/src/support/Events/EventFiringWebDriver.cs +++ b/dotnet/src/support/Events/EventFiringWebDriver.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Drawing; +using System.Threading.Tasks; namespace OpenQA.Selenium.Support.Events { @@ -860,6 +861,11 @@ public void Back() } } + public Task BackAsync() + { + throw new NotImplementedException(); + } + /// /// Move the browser forward /// From c66a63d0a8a984e93f15f1ec4f39cf0bc87ef2ad Mon Sep 17 00:00:00 2001 From: titusfortner Date: Fri, 17 May 2024 09:06:22 -0700 Subject: [PATCH 07/15] implement navigation method on event firing webdriver --- .../src/support/Events/EventFiringWebDriver.cs | 18 +++++++++++------- dotnet/src/webdriver/Navigator.cs | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/dotnet/src/support/Events/EventFiringWebDriver.cs b/dotnet/src/support/Events/EventFiringWebDriver.cs index 1e61be04402ca..a23488042aa94 100644 --- a/dotnet/src/support/Events/EventFiringWebDriver.cs +++ b/dotnet/src/support/Events/EventFiringWebDriver.cs @@ -843,15 +843,24 @@ public EventFiringNavigation(EventFiringWebDriver driver) } /// - /// Move the browser back + /// Move the browser back a /// public void Back() + { + Task.Run(this.BackAsync).ConfigureAwait(false).GetAwaiter().GetResult(); + } + + /// + /// Move the browser back asynchronously + /// + /// A task object representing the asynchronous operation + public async Task BackAsync() { try { WebDriverNavigationEventArgs e = new WebDriverNavigationEventArgs(this.parentDriver); this.parentDriver.OnNavigatingBack(e); - this.wrappedNavigation.Back(); + await this.wrappedNavigation.BackAsync(); this.parentDriver.OnNavigatedBack(e); } catch (Exception ex) @@ -861,11 +870,6 @@ public void Back() } } - public Task BackAsync() - { - throw new NotImplementedException(); - } - /// /// Move the browser forward /// diff --git a/dotnet/src/webdriver/Navigator.cs b/dotnet/src/webdriver/Navigator.cs index efa329b53ef07..7efa2bc8dc0e3 100644 --- a/dotnet/src/webdriver/Navigator.cs +++ b/dotnet/src/webdriver/Navigator.cs @@ -47,7 +47,7 @@ public void Back() } /// - /// Move back a single entry in the browser's history. + /// Move back a single entry in the browser's history asynchronously. /// /// A task object representing the asynchronous operation public async Task BackAsync() From 66b4f5e6311463c07f19cfca3f5e057c093c900c Mon Sep 17 00:00:00 2001 From: titusfortner Date: Fri, 17 May 2024 09:18:12 -0700 Subject: [PATCH 08/15] implement helper for running async commands synchronously --- dotnet/src/webdriver/Internal/AsyncHelper.cs | 49 +++++++++++++++++++ dotnet/src/webdriver/Navigator.cs | 3 +- .../Remote/DriverServiceCommandExecutor.cs | 3 +- .../webdriver/Remote/HttpCommandExecutor.cs | 2 +- dotnet/src/webdriver/WebDriver.cs | 4 +- 5 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 dotnet/src/webdriver/Internal/AsyncHelper.cs diff --git a/dotnet/src/webdriver/Internal/AsyncHelper.cs b/dotnet/src/webdriver/Internal/AsyncHelper.cs new file mode 100644 index 0000000000000..9cc016f86ff71 --- /dev/null +++ b/dotnet/src/webdriver/Internal/AsyncHelper.cs @@ -0,0 +1,49 @@ +// +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace OpenQA.Selenium.Internal +{ + /// + /// Encapsulates methods for working with asynchronous tasks. + /// + internal static class AsyncHelper + { + private static readonly TaskFactory _myTaskFactory = new TaskFactory(CancellationToken.None, + TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default); + + public static TResult RunSync(Func> func) + { + return _myTaskFactory.StartNew(() => + { + return func(); + }).Unwrap().ConfigureAwait(false).GetAwaiter().GetResult(); + } + + public static void RunSync(Func func) + { + _myTaskFactory.StartNew(() => + { + return func(); + }).Unwrap().ConfigureAwait(false).GetAwaiter().GetResult(); + } + } +} diff --git a/dotnet/src/webdriver/Navigator.cs b/dotnet/src/webdriver/Navigator.cs index 7efa2bc8dc0e3..8476d10333e43 100644 --- a/dotnet/src/webdriver/Navigator.cs +++ b/dotnet/src/webdriver/Navigator.cs @@ -18,6 +18,7 @@ using System; using System.Threading.Tasks; +using OpenQA.Selenium.Internal; using System.Collections.Generic; namespace OpenQA.Selenium @@ -43,7 +44,7 @@ public Navigator(WebDriver driver) /// public void Back() { - Task.Run(this.BackAsync).ConfigureAwait(false).GetAwaiter().GetResult(); + AsyncHelper.RunSync(this.BackAsync); } /// diff --git a/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs b/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs index af94264e4e05d..e543f6ec386cf 100644 --- a/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/DriverServiceCommandExecutor.cs @@ -18,6 +18,7 @@ using System; using System.Threading.Tasks; +using OpenQA.Selenium.Internal; namespace OpenQA.Selenium.Remote { @@ -94,7 +95,7 @@ public HttpCommandExecutor HttpExecutor /// A response from the browser public Response Execute(Command commandToExecute) { - return Task.Run(() => this.ExecuteAsync(commandToExecute)).ConfigureAwait(false).GetAwaiter().GetResult(); + return AsyncHelper.RunSync(() => this.ExecuteAsync(commandToExecute)); } /// diff --git a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs index 53eec1ca57d08..4ba91797d6a80 100644 --- a/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs +++ b/dotnet/src/webdriver/Remote/HttpCommandExecutor.cs @@ -159,7 +159,7 @@ public bool TryAddCommand(string commandName, CommandInfo info) /// A response from the browser public virtual Response Execute(Command commandToExecute) { - return Task.Run(() => this.ExecuteAsync(commandToExecute)).ConfigureAwait(false).GetAwaiter().GetResult(); + return AsyncHelper.RunSync(() => this.ExecuteAsync(commandToExecute)); } /// diff --git a/dotnet/src/webdriver/WebDriver.cs b/dotnet/src/webdriver/WebDriver.cs index a978bf2270c88..726784b79d39f 100644 --- a/dotnet/src/webdriver/WebDriver.cs +++ b/dotnet/src/webdriver/WebDriver.cs @@ -557,7 +557,7 @@ internal ReadOnlyCollection GetElementsFromResponse(Response respon /// WebDriver Response internal Response InternalExecute(string driverCommandToExecute, Dictionary parameters) { - return Task.Run(() => this.InternalExecuteAsync(driverCommandToExecute, parameters)).ConfigureAwait(false).GetAwaiter().GetResult(); + return AsyncHelper.RunSync(() => this.InternalExecuteAsync(driverCommandToExecute, parameters)); } /// @@ -575,7 +575,7 @@ internal Response InternalExecute(string driverCommandToExecute, Dictionary parameters) { - return Task.Run(() => this.ExecuteAsync(driverCommandToExecute, parameters)).ConfigureAwait(false).GetAwaiter().GetResult(); + return AsyncHelper.RunSync(() => this.ExecuteAsync(driverCommandToExecute, parameters)); } /// From 94cc741fe72ce9ba73ce44b32fdd3a927faf18ec Mon Sep 17 00:00:00 2001 From: titusfortner Date: Fri, 17 May 2024 11:22:53 -0700 Subject: [PATCH 09/15] make async helper class public to use in support module --- dotnet/src/support/Events/EventFiringWebDriver.cs | 5 +++-- dotnet/src/webdriver/Internal/AsyncHelper.cs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dotnet/src/support/Events/EventFiringWebDriver.cs b/dotnet/src/support/Events/EventFiringWebDriver.cs index a23488042aa94..52f6073ec3ede 100644 --- a/dotnet/src/support/Events/EventFiringWebDriver.cs +++ b/dotnet/src/support/Events/EventFiringWebDriver.cs @@ -21,6 +21,7 @@ using System.Collections.ObjectModel; using System.Drawing; using System.Threading.Tasks; +using OpenQA.Selenium.Internal; namespace OpenQA.Selenium.Support.Events { @@ -843,11 +844,11 @@ public EventFiringNavigation(EventFiringWebDriver driver) } /// - /// Move the browser back a + /// Move the browser back /// public void Back() { - Task.Run(this.BackAsync).ConfigureAwait(false).GetAwaiter().GetResult(); + AsyncHelper.RunSync(this.BackAsync); } /// diff --git a/dotnet/src/webdriver/Internal/AsyncHelper.cs b/dotnet/src/webdriver/Internal/AsyncHelper.cs index 9cc016f86ff71..0ffaef76f0618 100644 --- a/dotnet/src/webdriver/Internal/AsyncHelper.cs +++ b/dotnet/src/webdriver/Internal/AsyncHelper.cs @@ -25,7 +25,7 @@ namespace OpenQA.Selenium.Internal /// /// Encapsulates methods for working with asynchronous tasks. /// - internal static class AsyncHelper + public static class AsyncHelper { private static readonly TaskFactory _myTaskFactory = new TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default); From 8dcf053c8b9c636bc49debbadb48f0ffbeebd752 Mon Sep 17 00:00:00 2001 From: titusfortner Date: Sat, 18 May 2024 16:10:12 -0700 Subject: [PATCH 10/15] BackAsync needs to configure away false --- dotnet/src/support/Events/EventFiringWebDriver.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet/src/support/Events/EventFiringWebDriver.cs b/dotnet/src/support/Events/EventFiringWebDriver.cs index 52f6073ec3ede..33f7814427cc6 100644 --- a/dotnet/src/support/Events/EventFiringWebDriver.cs +++ b/dotnet/src/support/Events/EventFiringWebDriver.cs @@ -861,7 +861,7 @@ public async Task BackAsync() { WebDriverNavigationEventArgs e = new WebDriverNavigationEventArgs(this.parentDriver); this.parentDriver.OnNavigatingBack(e); - await this.wrappedNavigation.BackAsync(); + await this.wrappedNavigation.BackAsync().ConfigureAwait(false); this.parentDriver.OnNavigatedBack(e); } catch (Exception ex) From 19df8a54f05850a5d81f51ff979049b127620d5b Mon Sep 17 00:00:00 2001 From: titusfortner Date: Thu, 16 May 2024 10:20:35 -0700 Subject: [PATCH 11/15] [dotnet] add webdriver bidi dependency --- dotnet/src/webdriver/WebDriver.csproj | 1 + .../nuget/packages/webdriverbidi.0.0.1.nupkg | Bin 0 -> 127290 bytes 2 files changed, 1 insertion(+) create mode 100644 third_party/dotnet/nuget/packages/webdriverbidi.0.0.1.nupkg diff --git a/dotnet/src/webdriver/WebDriver.csproj b/dotnet/src/webdriver/WebDriver.csproj index 354284b328755..f0cd4c48ebbe9 100644 --- a/dotnet/src/webdriver/WebDriver.csproj +++ b/dotnet/src/webdriver/WebDriver.csproj @@ -53,6 +53,7 @@ + diff --git a/third_party/dotnet/nuget/packages/webdriverbidi.0.0.1.nupkg b/third_party/dotnet/nuget/packages/webdriverbidi.0.0.1.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..99afa6c504946cbf0d30fb66d765e394da7c4f74 GIT binary patch literal 127290 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

193#m3;cNFM|T4LM> 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

XPVf~WwlUs@nh)?E>Pq&n!1W-H#oOc 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 literal 0 HcmV?d00001 From 1d290bad5ce9e50ebfbea13e700e8547035f1118 Mon Sep 17 00:00:00 2001 From: titusfortner Date: Tue, 21 May 2024 16:56:23 -0700 Subject: [PATCH 12/15] [dotnet] tests should default to bidi disabled --- dotnet/test/common/Environment/DriverFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet/test/common/Environment/DriverFactory.cs b/dotnet/test/common/Environment/DriverFactory.cs index 448dfc61d1a98..17da7fe0853dd 100644 --- a/dotnet/test/common/Environment/DriverFactory.cs +++ b/dotnet/test/common/Environment/DriverFactory.cs @@ -67,7 +67,7 @@ public IWebDriver CreateDriverWithOptions(Type driverType, DriverOptions driverO { browser = Browser.Chrome; options = GetDriverOptions(driverType, driverOptions); - options.UseWebSocketUrl = true; + options.UseWebSocketUrl = System.Environment.GetEnvironmentVariable("WEBDRIVER_BIDI") == "true"; var chromeOptions = (ChromeOptions)options; chromeOptions.AddArguments("--no-sandbox", "--disable-dev-shm-usage"); From 42eb875442c795385ad2432c992a153349702859 Mon Sep 17 00:00:00 2001 From: titusfortner Date: Tue, 21 May 2024 17:10:15 -0700 Subject: [PATCH 13/15] [dotnet] start a BiDi session if webSocketUrl is set --- dotnet/src/webdriver/WebDriver.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/dotnet/src/webdriver/WebDriver.cs b/dotnet/src/webdriver/WebDriver.cs index 726784b79d39f..43d1d3efbf478 100644 --- a/dotnet/src/webdriver/WebDriver.cs +++ b/dotnet/src/webdriver/WebDriver.cs @@ -25,6 +25,7 @@ using System.Collections.ObjectModel; using System.Globalization; using System.Threading.Tasks; +using WebDriverBiDi; namespace OpenQA.Selenium { @@ -46,6 +47,7 @@ public class WebDriver : IWebDriver, ISearchContext, IJavaScriptExecutor, IFinds private SessionId sessionId; private String authenticatorId; private List registeredCommands = new List(); + private BiDiDriver biDiDriver; ///

/// Initializes a new instance of the class. @@ -654,6 +656,13 @@ protected void StartSession(ICapabilities capabilities) ReturnedCapabilities returnedCapabilities = new ReturnedCapabilities(rawCapabilities); this.capabilities = returnedCapabilities; this.sessionId = new SessionId(response.SessionId); + + if (!string.IsNullOrEmpty((string)this.capabilities.GetCapability("webSocketUrl"))) + { + this.biDiDriver = new BiDiDriver(DefaultCommandTimeout); + string webSocketUrl = this.capabilities.GetCapability("webSocketUrl").ToString(); + AsyncHelper.RunSync(() => this.biDiDriver.StartAsync(webSocketUrl)); + } } /// @@ -1037,6 +1046,8 @@ public void RemoveVirtualAuthenticator(string authenticatorId) /// public string AuthenticatorId { get; } + internal BiDiDriver BiDiDriver => biDiDriver; + /// /// Add a credential to the Virtual Authenticator/ /// From 73000585ff6712ba199f433230d2b4975cf9dc4b Mon Sep 17 00:00:00 2001 From: titusfortner Date: Tue, 21 May 2024 18:32:02 -0700 Subject: [PATCH 14/15] [dotnet] implement navigation commands with WebDriver BiDi --- .../support/Events/EventFiringWebDriver.cs | 70 +++++++++---- dotnet/src/webdriver/INavigation.cs | 26 +++++ dotnet/src/webdriver/Navigator.cs | 99 ++++++++++++++++--- dotnet/src/webdriver/WebDriver.cs | 6 ++ .../test/common/Environment/DriverFactory.cs | 2 + dotnet/test/common/NavigationTest.cs | 35 +++++-- 6 files changed, 201 insertions(+), 37 deletions(-) diff --git a/dotnet/src/support/Events/EventFiringWebDriver.cs b/dotnet/src/support/Events/EventFiringWebDriver.cs index 33f7814427cc6..a7e824235a1a5 100644 --- a/dotnet/src/support/Events/EventFiringWebDriver.cs +++ b/dotnet/src/support/Events/EventFiringWebDriver.cs @@ -852,7 +852,7 @@ public void Back() } /// - /// Move the browser back asynchronously + /// Move the browser backward as an asynchronous task /// /// A task object representing the asynchronous operation public async Task BackAsync() @@ -875,12 +875,21 @@ public async Task BackAsync() /// Move the browser forward /// public void Forward() + { + AsyncHelper.RunSync(this.ForwardAsync); + } + + /// + /// Move the browser forward as an asynchronous task + /// + /// A task object representing the asynchronous operation + public async Task ForwardAsync() { try { WebDriverNavigationEventArgs e = new WebDriverNavigationEventArgs(this.parentDriver); this.parentDriver.OnNavigatingForward(e); - this.wrappedNavigation.Forward(); + await this.wrappedNavigation.ForwardAsync().ConfigureAwait(false); this.parentDriver.OnNavigatedForward(e); } catch (Exception ex) @@ -890,17 +899,33 @@ public void Forward() } } + /// - /// Navigate to a url for your test + /// Navigate to a url /// /// String of where you want the browser to go to public void GoToUrl(string url) { + AsyncHelper.RunSync(() => this.GoToUrlAsync(url)); + } + + /// + /// Navigate to a url as an asynchronous task + /// + /// String of where you want the browser to go to + /// A task object representing the asynchronous operation + public async Task GoToUrlAsync(string url) + { + if (url == null) + { + throw new ArgumentNullException(nameof(url), "url cannot be null"); + } + try { WebDriverNavigationEventArgs e = new WebDriverNavigationEventArgs(this.parentDriver, url); this.parentDriver.OnNavigating(e); - this.wrappedNavigation.GoToUrl(url); + await this.wrappedNavigation.GoToUrlAsync(url).ConfigureAwait(false); this.parentDriver.OnNavigated(e); } catch (Exception ex) @@ -911,38 +936,46 @@ public void GoToUrl(string url) } /// - /// Navigate to a url for your test + /// Navigate to a url /// /// Uri object of where you want the browser to go to public void GoToUrl(Uri url) + { + AsyncHelper.RunSync(() => this.GoToUrlAsync(url)); + } + + /// + /// Navigate to a url as an asynchronous task + /// + /// Uri object of where you want the browser to go to + /// A task object representing the asynchronous operation + public async Task GoToUrlAsync(Uri url) { if (url == null) { throw new ArgumentNullException(nameof(url), "url cannot be null"); } - try - { - WebDriverNavigationEventArgs e = new WebDriverNavigationEventArgs(this.parentDriver, url.ToString()); - this.parentDriver.OnNavigating(e); - this.wrappedNavigation.GoToUrl(url); - this.parentDriver.OnNavigated(e); - } - catch (Exception ex) - { - this.parentDriver.OnException(new WebDriverExceptionEventArgs(this.parentDriver, ex)); - throw; - } + await this.GoToUrlAsync(url.ToString()).ConfigureAwait(false); } /// /// Refresh the browser /// public void Refresh() + { + AsyncHelper.RunSync(this.RefreshAsync); + } + + /// + /// Refresh the browser as an asynchronous task + /// + /// A task object representing the asynchronous operation + public async Task RefreshAsync() { try { - this.wrappedNavigation.Refresh(); + await this.wrappedNavigation.RefreshAsync().ConfigureAwait(false); } catch (Exception ex) { @@ -950,6 +983,7 @@ public void Refresh() throw; } } + } /// diff --git a/dotnet/src/webdriver/INavigation.cs b/dotnet/src/webdriver/INavigation.cs index f12786a3e212e..e81cd1041a5fa 100644 --- a/dotnet/src/webdriver/INavigation.cs +++ b/dotnet/src/webdriver/INavigation.cs @@ -44,6 +44,12 @@ public interface INavigation /// Does nothing if we are on the latest page viewed. void Forward(); + /// + /// Move a single "item" forward in the browser's history. + /// + /// A task object representing the asynchronous operation + Task ForwardAsync(); + /// /// Load a new web page in the current browser window. /// @@ -59,6 +65,13 @@ public interface INavigation /// void GoToUrl(string url); + /// + /// Load a new web page in the current browser window. + /// + /// The URL to load. It is best to use a fully qualified URL + /// A task object representing the asynchronous operation + Task GoToUrlAsync(string url); + /// /// Load a new web page in the current browser window. /// @@ -74,9 +87,22 @@ public interface INavigation /// void GoToUrl(Uri url); + /// + /// Load a new web page in the current browser window. + /// + /// The URL to load. + /// A task object representing the asynchronous operation + Task GoToUrlAsync(Uri url); + /// /// Refreshes the current page. /// void Refresh(); + + /// + /// Refreshes the current page. + /// + /// A task object representing the asynchronous operation + Task RefreshAsync(); } } diff --git a/dotnet/src/webdriver/Navigator.cs b/dotnet/src/webdriver/Navigator.cs index 8476d10333e43..dc27699dafdb8 100644 --- a/dotnet/src/webdriver/Navigator.cs +++ b/dotnet/src/webdriver/Navigator.cs @@ -20,6 +20,7 @@ using System.Threading.Tasks; using OpenQA.Selenium.Internal; using System.Collections.Generic; +using WebDriverBiDi.BrowsingContext; namespace OpenQA.Selenium { @@ -48,12 +49,22 @@ public void Back() } /// - /// Move back a single entry in the browser's history asynchronously. + /// Move back a single entry in the browser's history as an asynchronous task. /// /// A task object representing the asynchronous operation public async Task BackAsync() { - await this.driver.InternalExecuteAsync(DriverCommand.GoBack, null); + if (this.driver.BiDiDriver != null) + { + var traverseHistoryCommandParameters = + new TraverseHistoryCommandParameters(driver.BrowsingContextId, -1); + await this.driver.BiDiDriver.BrowsingContext.TraverseHistoryAsync(traverseHistoryCommandParameters) + .ConfigureAwait(false); + } + else + { + await this.driver.InternalExecuteAsync(DriverCommand.GoBack, null).ConfigureAwait(false); + } } /// @@ -61,40 +72,85 @@ public async Task BackAsync() /// public void Forward() { - this.driver.InternalExecute(DriverCommand.GoForward, null); + AsyncHelper.RunSync(this.ForwardAsync); } /// - /// Navigate to a url for your test + /// Move the browser forward as an asynchronous task + /// + /// A task object representing the asynchronous operation + public async Task ForwardAsync() + { + if (this.driver.BiDiDriver != null) + { + var traverseHistoryCommandParameters = + new TraverseHistoryCommandParameters(driver.BrowsingContextId, 1); + await this.driver.BiDiDriver.BrowsingContext.TraverseHistoryAsync(traverseHistoryCommandParameters) + .ConfigureAwait(false); + } + else + { + await this.driver.InternalExecuteAsync(DriverCommand.GoForward, null).ConfigureAwait(false); + } + } + + /// + /// Navigate to a url /// /// String of where you want the browser to go to public void GoToUrl(string url) + { + AsyncHelper.RunSync(() => this.GoToUrlAsync(url)); + } + + /// + /// Navigate to a url as an asynchronous task + /// + /// String of where you want the browser to go to + /// A task object representing the asynchronous operation + public async Task GoToUrlAsync(string url) { if (url == null) { throw new ArgumentNullException(nameof(url), "URL cannot be null."); } - Dictionary parameters = new Dictionary + if (this.driver.BiDiDriver != null) { - { "url", url } - }; - this.driver.InternalExecute(DriverCommand.Get, parameters); - + await driver.BiDiDriver.BrowsingContext.NavigateAsync(new NavigateCommandParameters(driver.BrowsingContextId, url)).ConfigureAwait(false); + } + else + { + Dictionary parameters = new Dictionary + { + { "url", url } + }; + this.driver.InternalExecute(DriverCommand.Get, parameters); + } } /// - /// Navigate to a url for your test + /// Navigate to a url /// /// Uri object of where you want the browser to go to public void GoToUrl(Uri url) + { + AsyncHelper.RunSync(() => this.GoToUrlAsync(url)); + } + + /// + /// Navigate to a url as an asynchronous task + /// + /// Uri of where you want the browser to go to + /// A task object representing the asynchronous operation + public async Task GoToUrlAsync(Uri url) { if (url == null) { throw new ArgumentNullException(nameof(url), "URL cannot be null."); } - this.GoToUrl(url.ToString()); + await this.GoToUrlAsync(url.ToString()).ConfigureAwait(false); } /// @@ -102,8 +158,25 @@ public void GoToUrl(Uri url) /// public void Refresh() { - // driver.SwitchTo().DefaultContent(); - this.driver.InternalExecute(DriverCommand.Refresh, null); + AsyncHelper.RunSync(this.RefreshAsync); + } + + /// + /// Refresh the browser as an asynchronous task + /// + /// A task object representing the asynchronous operation + public async Task RefreshAsync() + { + if (this.driver.BiDiDriver != null) + { + var reloadCommandParameters = + new ReloadCommandParameters(driver.BrowsingContextId); + await this.driver.BiDiDriver.BrowsingContext.ReloadAsync(reloadCommandParameters).ConfigureAwait(false); + } + else + { + await this.driver.InternalExecuteAsync(DriverCommand.Refresh, null).ConfigureAwait(false); + } } } } diff --git a/dotnet/src/webdriver/WebDriver.cs b/dotnet/src/webdriver/WebDriver.cs index 43d1d3efbf478..887247b692791 100644 --- a/dotnet/src/webdriver/WebDriver.cs +++ b/dotnet/src/webdriver/WebDriver.cs @@ -26,6 +26,7 @@ using System.Globalization; using System.Threading.Tasks; using WebDriverBiDi; +using WebDriverBiDi.BrowsingContext; namespace OpenQA.Selenium { @@ -47,6 +48,7 @@ public class WebDriver : IWebDriver, ISearchContext, IJavaScriptExecutor, IFinds private SessionId sessionId; private String authenticatorId; private List registeredCommands = new List(); + private string browsingContextId = string.Empty; private BiDiDriver biDiDriver; /// @@ -662,6 +664,8 @@ protected void StartSession(ICapabilities capabilities) this.biDiDriver = new BiDiDriver(DefaultCommandTimeout); string webSocketUrl = this.capabilities.GetCapability("webSocketUrl").ToString(); AsyncHelper.RunSync(() => this.biDiDriver.StartAsync(webSocketUrl)); + GetTreeCommandResult tree = AsyncHelper.RunSync(() => this.biDiDriver.BrowsingContext.GetTreeAsync(new GetTreeCommandParameters())); + this.browsingContextId = tree.ContextTree[0].BrowsingContextId; } } @@ -1046,6 +1050,8 @@ public void RemoveVirtualAuthenticator(string authenticatorId) /// public string AuthenticatorId { get; } + internal string BrowsingContextId => browsingContextId; + internal BiDiDriver BiDiDriver => biDiDriver; /// diff --git a/dotnet/test/common/Environment/DriverFactory.cs b/dotnet/test/common/Environment/DriverFactory.cs index 17da7fe0853dd..7c90a4cf5fff9 100644 --- a/dotnet/test/common/Environment/DriverFactory.cs +++ b/dotnet/test/common/Environment/DriverFactory.cs @@ -114,6 +114,8 @@ public IWebDriver CreateDriverWithOptions(Type driverType, DriverOptions driverO { browser = Browser.Firefox; options = GetDriverOptions(driverType, driverOptions); + options.UseWebSocketUrl = System.Environment.GetEnvironmentVariable("WEBDRIVER_BIDI") == "true"; + service = CreateService(); if (!string.IsNullOrEmpty(this.browserBinaryLocation)) { diff --git a/dotnet/test/common/NavigationTest.cs b/dotnet/test/common/NavigationTest.cs index ee40894aa047c..e629c76e58896 100644 --- a/dotnet/test/common/NavigationTest.cs +++ b/dotnet/test/common/NavigationTest.cs @@ -1,5 +1,6 @@ using NUnit.Framework; using System; +using WebDriverBiDi; namespace OpenQA.Selenium { @@ -12,10 +13,20 @@ public class NavigationTest : DriverTestFixture [NeedsFreshDriver(IsCreatedBeforeTest = true)] public void ShouldNotHaveProblemNavigatingWithNoPagesBrowsed() { - INavigation navigation; - navigation = driver.Navigate(); - navigation.Back(); - navigation.Forward(); + INavigation navigation = driver.Navigate(); + + if (((WebDriver)driver).Capabilities.HasCapability("webSocketUrl")) + { + var ex1 = Assert.Throws(() => navigation.Back()); + Assert.True(ex1.Message.Contains("no such history entry")); + var ex2 = Assert.Throws(() => navigation.Forward()); + Assert.True(ex2.Message.Contains("no such history entry")); + } + else + { + navigation.Back(); + navigation.Forward(); + } } [Test] @@ -40,7 +51,7 @@ public void ShouldAcceptInvalidUrlsUsingUris() INavigation navigation; navigation = driver.Navigate(); Assert.That(() => navigation.GoToUrl((Uri)null), Throws.InstanceOf()); - // new Uri("") and new Uri("isidsji30342??éåµñ©æ") + // new Uri("") and new Uri("isidsji30342??éåµñ©æ") // throw an exception, so we needn't worry about them. } @@ -86,9 +97,21 @@ public void ShouldRefreshPage() Assert.AreEqual("Fish and chips!", changedDiv.Text); driver.Navigate().Refresh(); + WaitFor(() => + { + try + { + var text = changedDiv.Text; + return false; + } + catch (StaleElementReferenceException) + { + return true; + } + }, "Page did not refresh"); + changedDiv = driver.FindElement(By.Id("dynamo")); Assert.AreEqual("What's for dinner?", changedDiv.Text); } - } } From fcb4798dbd7636106f7d47c7e12cd9d7d93010d8 Mon Sep 17 00:00:00 2001 From: titusfortner Date: Wed, 22 May 2024 10:08:42 -0700 Subject: [PATCH 15/15] [dotnet] implement waiting for readiness state based on page load strategy --- dotnet/src/webdriver/Navigator.cs | 20 ++++++++++++++++++-- dotnet/test/common/NavigationTest.cs | 13 ------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/dotnet/src/webdriver/Navigator.cs b/dotnet/src/webdriver/Navigator.cs index dc27699dafdb8..9b7062c183267 100644 --- a/dotnet/src/webdriver/Navigator.cs +++ b/dotnet/src/webdriver/Navigator.cs @@ -30,6 +30,14 @@ namespace OpenQA.Selenium internal class Navigator : INavigation { private WebDriver driver; + private static readonly Dictionary PageLoadStrategyMapper = new() + { + {"normal", ReadinessState.Complete}, + {"default", ReadinessState.Complete}, + {"eager", ReadinessState.Interactive}, + {"none", ReadinessState.None} + }; + private ReadinessState readinessState; /// /// Initializes a new instance of the class @@ -38,6 +46,7 @@ internal class Navigator : INavigation public Navigator(WebDriver driver) { this.driver = driver; + this.readinessState = PageLoadStrategyMapper[(string)driver.Capabilities.GetCapability("pageLoadStrategy")]; } /// @@ -117,7 +126,11 @@ public async Task GoToUrlAsync(string url) if (this.driver.BiDiDriver != null) { - await driver.BiDiDriver.BrowsingContext.NavigateAsync(new NavigateCommandParameters(driver.BrowsingContextId, url)).ConfigureAwait(false); + NavigateCommandParameters navigateCommandParameters = new NavigateCommandParameters(driver.BrowsingContextId, url) + { + Wait = this.readinessState + }; + await driver.BiDiDriver.BrowsingContext.NavigateAsync(navigateCommandParameters).ConfigureAwait(false); } else { @@ -170,7 +183,10 @@ public async Task RefreshAsync() if (this.driver.BiDiDriver != null) { var reloadCommandParameters = - new ReloadCommandParameters(driver.BrowsingContextId); + new ReloadCommandParameters(driver.BrowsingContextId) + { + Wait = this.readinessState + }; await this.driver.BiDiDriver.BrowsingContext.ReloadAsync(reloadCommandParameters).ConfigureAwait(false); } else diff --git a/dotnet/test/common/NavigationTest.cs b/dotnet/test/common/NavigationTest.cs index e629c76e58896..15f4e5c02287c 100644 --- a/dotnet/test/common/NavigationTest.cs +++ b/dotnet/test/common/NavigationTest.cs @@ -97,19 +97,6 @@ public void ShouldRefreshPage() Assert.AreEqual("Fish and chips!", changedDiv.Text); driver.Navigate().Refresh(); - WaitFor(() => - { - try - { - var text = changedDiv.Text; - return false; - } - catch (StaleElementReferenceException) - { - return true; - } - }, "Page did not refresh"); - changedDiv = driver.FindElement(By.Id("dynamo")); Assert.AreEqual("What's for dinner?", changedDiv.Text); }