Skip to content

Commit

Permalink
[dotnet] Adding support for Firefox and Chromium Android options
Browse files Browse the repository at this point in the history
  • Loading branch information
jimevans committed Sep 29, 2021
1 parent dc59524 commit 08ddd4d
Show file tree
Hide file tree
Showing 5 changed files with 280 additions and 0 deletions.
58 changes: 58 additions & 0 deletions dotnet/src/webdriver/Chromium/ChromiumAndroidOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// <copyright file="ChromiumAndroidOptions.cs" company="WebDriver Committers">
// 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.
// </copyright>

using OpenQA.Selenium.Internal;

namespace OpenQA.Selenium.Chromium
{
/// <summary>
/// Generates the capabilities for automating Chromium applications on Android
/// </summary>
public class ChromiumAndroidOptions : AndroidOptions
{
private string androidProcess;
private bool androidUseRunningApp;

/// <summary>
/// Initializes a new instance of the <see cref="ChromiumAndroidOptions"/> class.
/// </summary>
/// <param name="androidPackage"></param>
public ChromiumAndroidOptions(string androidPackage) : base(androidPackage)
{
}

/// <summary>
/// Gets or sets a value indicating whether to use an already running app.
/// </summary>
public bool UseRunningApp
{
get { return this.androidUseRunningApp; }
set { this.androidUseRunningApp = value; }
}

/// <summary>
/// Gets or sets the process name of the Activity hosting the app. If not given, it
/// is assumed to be the same as <see cref="AndroidActivity"/>.
/// </summary>
public string AndroidProcess
{
get { return this.androidProcess; }
set { this.androidProcess = value; }
}
}
}
40 changes: 40 additions & 0 deletions dotnet/src/webdriver/Chromium/ChromiumOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ public abstract class ChromiumOptions : DriverOptions
private string mobileEmulationDeviceName;
private ChromiumMobileEmulationDeviceSettings mobileEmulationDeviceSettings;
private ChromiumPerformanceLoggingPreferences perfLoggingPreferences;
private ChromiumAndroidOptions androidOptions;

/// <summary>
/// Initializes a new instance of the <see cref="ChromiumOptions"/> class.
Expand Down Expand Up @@ -175,6 +176,15 @@ public ChromiumPerformanceLoggingPreferences PerformanceLoggingPreferences
set { this.perfLoggingPreferences = value; }
}

/// <summary>
/// Gets or sets the options for automating Chromium applications on Android.
/// </summary>
public ChromiumAndroidOptions AndroidOptions
{
get { return this.androidOptions; }
set { this.androidOptions = value; }
}

/// <summary>
/// Gets or sets a value indicating whether the <see cref="ChromiumDriver"/> instance
/// should use the legacy OSS protocol dialect or a dialect compliant with the W3C
Expand Down Expand Up @@ -644,6 +654,11 @@ private Dictionary<string, object> BuildChromeOptionsDictionary()
chromeOptions[PerformanceLoggingPreferencesChromeOption] = this.GeneratePerformanceLoggingPreferencesDictionary();
}

if (this.androidOptions != null)
{
this.AddAndroidOptions(chromeOptions);
}

if (this.windowTypes.Count > 0)
{
chromeOptions[WindowTypesChromeOption] = this.windowTypes;
Expand All @@ -657,6 +672,31 @@ private Dictionary<string, object> BuildChromeOptionsDictionary()
return chromeOptions;
}

private void AddAndroidOptions(Dictionary<string, object> chromeOptions)
{
chromeOptions["androidPackage"] = this.androidOptions.AndroidPackage;

if (!string.IsNullOrEmpty(this.androidOptions.AndroidDeviceSerial))
{
chromeOptions["androidDeviceSerial"] = this.androidOptions.AndroidDeviceSerial;
}

if (!string.IsNullOrEmpty(this.androidOptions.AndroidActivity))
{
chromeOptions["androidActivity"] = this.androidOptions.AndroidActivity;
}

if (!string.IsNullOrEmpty(this.androidOptions.AndroidProcess))
{
chromeOptions["androidProcess"] = this.androidOptions.AndroidProcess;
}

if (this.androidOptions.UseRunningApp)
{
chromeOptions["androidUseRunningApp"] = this.androidOptions.UseRunningApp;
}
}

private Dictionary<string, object> GeneratePerformanceLoggingPreferencesDictionary()
{
Dictionary<string, object> perfLoggingPrefsDictionary = new Dictionary<string, object>();
Expand Down
69 changes: 69 additions & 0 deletions dotnet/src/webdriver/Firefox/FirefoxAndroidOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
// <copyright file="FirefoxAndroidOptions.cs" company="WebDriver Committers">
// 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.
// </copyright>

using System.Collections.Generic;
using System.Collections.ObjectModel;
using OpenQA.Selenium.Internal;

namespace OpenQA.Selenium.Firefox
{
/// <summary>
/// Generates the capabilities for automating Firefox applications on Android
/// </summary>
public class FirefoxAndroidOptions : AndroidOptions
{
private string androidPackage;
private string androidDeviceSerial;
private string androidActivity;
private List<string> androidIntentArguments = new List<string>();

/// <summary>
/// Initializes a new instance of the <see cref="FirefoxAndroidOptions"/> class.
/// </summary>
/// <param name="androidPackage"></param>
public FirefoxAndroidOptions(string androidPackage) : base(androidPackage)
{
}

/// <summary>
/// Gets a read-only list of the intent arguments set for this set of options.
/// </summary>
public ReadOnlyCollection<string> AndroidIntentArguments
{
get { return this.androidIntentArguments.AsReadOnly(); }
}

/// <summary>
/// Argument to launch the intent with. The given intent arguments are appended to the "am start" command.
/// </summary>
/// <param name="arguments">The argument to add.</param>
public void AddIntentArgument(string argument)
{
this.AddIntentArguments(argument);
}

/// <summary>
/// Arguments to launch the intent with. The given intent arguments are appended to the "am start" command.
/// </summary>
/// <param name="arguments">The arguments to add.</param>
public void AddIntentArguments(params string[] arguments)
{
this.androidIntentArguments.AddRange(arguments);
}
}
}
41 changes: 41 additions & 0 deletions dotnet/src/webdriver/Firefox/FirefoxOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ public class FirefoxOptions : DriverOptions
private Dictionary<string, object> profilePreferences = new Dictionary<string, object>();
private Dictionary<string, object> additionalFirefoxOptions = new Dictionary<string, object>();
private Dictionary<string, object> environmentVariables = new Dictionary<string, object>();
private FirefoxAndroidOptions androidOptions;

/// <summary>
/// Initializes a new instance of the <see cref="FirefoxOptions"/> class.
Expand Down Expand Up @@ -134,6 +135,15 @@ public bool EnableDevToolsProtocol
set { this.enableDevToolsProtocol = value; }
}

/// <summary>
/// Gets or sets the options for automating Firefox on Android.
/// </summary>
public FirefoxAndroidOptions AndroidOptions
{
get { return this.androidOptions; }
set { this.androidOptions = value; }
}

/// <summary>
/// Adds an argument to be used in launching the Firefox browser.
/// </summary>
Expand Down Expand Up @@ -377,6 +387,11 @@ private Dictionary<string, object> GenerateFirefoxOptionsDictionary()
firefoxOptions[FirefoxEnvCapability] = this.environmentVariables;
}

if (this.androidOptions != null)
{
this.AddAndroidOptions(firefoxOptions);
}

foreach (KeyValuePair<string, object> pair in this.additionalFirefoxOptions)
{
firefoxOptions.Add(pair.Key, pair.Value);
Expand All @@ -394,5 +409,31 @@ private void SetPreferenceValue(string preferenceName, object preferenceValue)

this.profilePreferences[preferenceName] = preferenceValue;
}

private void AddAndroidOptions(Dictionary<string, object> firefoxOptions)
{
firefoxOptions["androidPackage"] = this.androidOptions.AndroidPackage;

if (!string.IsNullOrEmpty(this.androidOptions.AndroidDeviceSerial))
{
firefoxOptions["androidDeviceSerial"] = this.androidOptions.AndroidDeviceSerial;
}

if (!string.IsNullOrEmpty(this.androidOptions.AndroidActivity))
{
firefoxOptions["androidActivity"] = this.androidOptions.AndroidActivity;
}

if (this.androidOptions.AndroidIntentArguments.Count > 0)
{
List<object> args = new List<object>();
foreach (string argument in this.androidOptions.AndroidIntentArguments)
{
args.Add(argument);
}

firefoxOptions["androidIntentArguments"] = args;
}
}
}
}
72 changes: 72 additions & 0 deletions dotnet/src/webdriver/Internal/AndroidOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// <copyright file="AndroidOptions.cs" company="WebDriver Committers">
// 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.
// </copyright>

using System;

namespace OpenQA.Selenium.Internal
{
/// <summary>
/// Provides a base class for options for browsers to be automated on Android.
/// </summary>
public class AndroidOptions
{
private string androidPackage;
private string androidDeviceSerial;
private string androidActivity;

/// <summary>
/// Initializes a new instance of the <see cref="AndroidOptions"/> class.
/// </summary>
/// <param name="androidPackage"></param>
protected AndroidOptions(string androidPackage)
{
if (string.IsNullOrEmpty(androidPackage))
{
throw new ArgumentException("The Android package cannot be null or the empty string", "androidPackage");
}

this.androidPackage = androidPackage;
}

/// <summary>
/// The package name of the application to automate.
/// </summary>
public string AndroidPackage
{
get { return this.androidPackage; }
}

/// <summary>
/// The serial number of the device on which to launch the application.
/// </summary>
public string AndroidDeviceSerial
{
get { return this.androidDeviceSerial; }
set { this.androidDeviceSerial = value; }
}

/// <summary>
/// Gets or sets the name of the Activity hosting the app.
/// </summary>
public string AndroidActivity
{
get { return this.androidActivity; }
set { this.androidActivity = value; }
}
}
}

0 comments on commit 08ddd4d

Please sign in to comment.