From 4ce4d281bac9c0d771b1258ca3b05af3d29e5f9c Mon Sep 17 00:00:00 2001 From: Max Ewing Date: Fri, 5 Aug 2022 09:36:39 +0100 Subject: [PATCH] feat: additional capabilities (#131) Additional capabilities are often required to support the use of managed Selenium Grid services (e.g. account details are often passed this way). Consumers using their own Selenium Grids may also see some benefits to being able to pass these as well. --- README.md | 2 + .../BrowserOptionsWithProfileSupport.cs | 53 ++++++++++++++++++- .../Extensions/DriverOptionsExtensions.cs | 38 +++++++++++++ .../power-apps-bindings.yml | 2 + 4 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 bindings/src/Capgemini.PowerApps.SpecFlowBindings/Extensions/DriverOptionsExtensions.cs diff --git a/README.md b/README.md index 98f0511..7705c70 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,8 @@ browserOptions: # optional - will use default EasyRepro options if not set height: 1080 startMaximized: false driversPath: ChromeWebDriver # optional - [Recommended when running tests from Azure DevOps Microsoft-hosted agent](https://docs.microsoft.com/en-us/azure/devops/pipelines/test/continuous-test-selenium?view=azure-devops#decide-how-you-will-deploy-and-test-your-app) + additionalCapabilities: # optional - additional capabilities to pass to the WebDriver + capabilityName: capabilityValue applicationUser: # optional - populate if creating test data for users other than the current user tenantId: SPECFLOW_POWERAPPS_TENANTID optional # mandatory clientId: SPECFLOW_POWERAPPS_CLIENTID # mandatory diff --git a/bindings/src/Capgemini.PowerApps.SpecFlowBindings/Configuration/BrowserOptionsWithProfileSupport.cs b/bindings/src/Capgemini.PowerApps.SpecFlowBindings/Configuration/BrowserOptionsWithProfileSupport.cs index 1a4cdad..bfae4ec 100644 --- a/bindings/src/Capgemini.PowerApps.SpecFlowBindings/Configuration/BrowserOptionsWithProfileSupport.cs +++ b/bindings/src/Capgemini.PowerApps.SpecFlowBindings/Configuration/BrowserOptionsWithProfileSupport.cs @@ -1,21 +1,40 @@ namespace Capgemini.PowerApps.SpecFlowBindings.Configuration { using System; + using System.Collections.Generic; using System.IO; + using Capgemini.PowerApps.SpecFlowBindings.Extensions; using Microsoft.Dynamics365.UIAutomation.Browser; + using OpenQA.Selenium; using OpenQA.Selenium.Chrome; + using OpenQA.Selenium.Edge; using OpenQA.Selenium.Firefox; + using OpenQA.Selenium.IE; /// - /// Extends the EasyRepro class with additonal support for chrome profiles. + /// Extends the EasyRepro class with support for additional configuration. /// public class BrowserOptionsWithProfileSupport : BrowserOptions, ICloneable { + /// + /// Initializes a new instance of the class. + /// + public BrowserOptionsWithProfileSupport() + : base() + { + this.AdditionalCapabilities = new Dictionary(); + } + /// /// Gets or sets the directory to use as the user profile. /// public string ProfileDirectory { get; set; } + /// + /// Gets or sets the additional capabilities. + /// + public Dictionary AdditionalCapabilities { get; set; } + /// public object Clone() { @@ -32,6 +51,8 @@ public override ChromeOptions ToChrome() options.AddArgument($"--user-data-dir={this.ProfileDirectory}"); } + this.AddAdditionalCapabilities(options); + return options; } @@ -46,7 +67,37 @@ public override FirefoxOptions ToFireFox() options.AddArgument($"-profile \"{this.ProfileDirectory}\""); } + this.AddAdditionalCapabilities(options); + return options; } + + /// + public override EdgeOptions ToEdge() + { + var options = base.ToEdge(); + + this.AddAdditionalCapabilities(options); + + return options; + } + + /// + public override InternetExplorerOptions ToInternetExplorer() + { + var options = base.ToInternetExplorer(); + + this.AddAdditionalCapabilities(options); + + return options; + } + + private void AddAdditionalCapabilities(DriverOptions options) + { + foreach (var desiredCapability in this.AdditionalCapabilities) + { + options.AddGlobalCapability(desiredCapability.Key, desiredCapability.Value); + } + } } } diff --git a/bindings/src/Capgemini.PowerApps.SpecFlowBindings/Extensions/DriverOptionsExtensions.cs b/bindings/src/Capgemini.PowerApps.SpecFlowBindings/Extensions/DriverOptionsExtensions.cs new file mode 100644 index 0000000..c816056 --- /dev/null +++ b/bindings/src/Capgemini.PowerApps.SpecFlowBindings/Extensions/DriverOptionsExtensions.cs @@ -0,0 +1,38 @@ +namespace Capgemini.PowerApps.SpecFlowBindings.Extensions +{ + using OpenQA.Selenium; + using OpenQA.Selenium.Chrome; + using OpenQA.Selenium.Firefox; + using OpenQA.Selenium.IE; + + /// + /// Extensions to the class. + /// + public static class DriverOptionsExtensions + { + /// + /// Adds a global capability to driver options. + /// + /// The driver options. + /// The name of the capability. + /// The value of the capability. + internal static void AddGlobalCapability(this DriverOptions options, string name, object value) + { + switch (options) + { + case ChromeOptions chromeOptions: + chromeOptions.AddAdditionalCapability(name, value, true); + break; + case FirefoxOptions firefoxOptions: + firefoxOptions.AddAdditionalCapability(name, value, true); + break; + case InternetExplorerOptions internetExplorerOptions: + internetExplorerOptions.AddAdditionalCapability(name, value, true); + break; + default: + options.AddAdditionalCapability(name, value); + break; + } + } + } +} diff --git a/bindings/tests/Capgemini.PowerApps.SpecFlowBindings.UiTests/power-apps-bindings.yml b/bindings/tests/Capgemini.PowerApps.SpecFlowBindings.UiTests/power-apps-bindings.yml index b6950e2..0a62001 100644 --- a/bindings/tests/Capgemini.PowerApps.SpecFlowBindings.UiTests/power-apps-bindings.yml +++ b/bindings/tests/Capgemini.PowerApps.SpecFlowBindings.UiTests/power-apps-bindings.yml @@ -7,6 +7,8 @@ browserOptions: height: 1080 startMaximized: false driversPath: ChromeWebDriver + additionalCapabilities: + capabilityName: capabilityVaue applicationUser: tenantId: POWERAPPS_SPECFLOW_BINDINGS_TEST_TENANTID clientId: POWERAPPS_SPECFLOW_BINDINGS_TEST_CLIENTID