Remote WebDriver in C#

By FoxLearn 12/27/2024 1:37:35 AM   12
Selenium allows you to automate browsers on remote computers when a Selenium Grid is set up.

The computer running the code is called the client computer, while the computer hosting the browser and driver is the remote computer or end-node. To run tests on the remote computer, you need to use the Remote WebDriver class and provide the grid's URL and port.

Difference between WebDriver and RemoteWebDriver

Selenium WebDriver is a tool for automating the execution of test cases across different browsers. Its primary object is a browser, and it uses the Selenium RemoteWebDriver to implement the WebDriver interface in order to run the tests.

What is a Selenium RemoteWebDriver?

The RemoteWebDriver class implements the WebDriver interface to run test scripts on a remote machine via the RemoteWebDriver server.

Remote WebDriver Architecture

Remote WebDriver consists of a server and a client.

  • The server listens for requests from the Remote WebDriver client and forwards them to the appropriate browser driver (e.g., FirefoxDriver, IEDriver, or ChromeDriver).
  • The client libraries act as the Remote WebDriver client, converting test script requests into JSON payloads, which are then sent to the server using the JSON wire protocol.

Advantages of Selenium RemoteWebDriver

Advantages of Selenium RemoteWebDriver include the ability to run automation test suites on multiple machines simultaneously, support for OS-independent testing (allowing tests on browsers not available on the current OS), the ability to capture exceptions with screenshots for easier issue identification, and the capability to test web applications on a remote server before they go live, saving time and cost by detecting bugs early.

When to use Selenium RemoteWebDriver?

Selenium Remote WebDriver is useful for testing websites in a local environment, allowing QAs to test staging sites before launch and debug issues before customers encounter them.

Using Chromedriver Remote

To use ChromeDriver in a remote environment (e.g., when running tests on a remote server or in a cloud-based testing platform like Selenium Grid or a cloud provider), you need to configure Selenium to connect to the remote WebDriver. This involves setting up a Remote WebDriver and connecting it to a remote server that manages the Chrome browser instance.

To begin using ChromeDriver remotely in C#, you can install the Selenium WebDriver via NuGet.

Install-Package Selenium.WebDriver

Next, You need to download the ChromeDriver

It's required to interact with the Google Chrome browser. Ensure that you have Chrome installed and the corresponding ChromeDriver executable is available for your environment.

// Instantiate the remote WebDriver
var options = new ChromeOptions();
driver = new RemoteWebDriver(GridUrl, options);

For example:

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Remote;
using System;
using System.Net;

namespace RemoteSeleniumExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // Define the desired capabilities for the remote WebDriver
            var chromeOptions = new ChromeOptions();
            chromeOptions.AddArgument("--headless"); // Optional: Run Chrome in headless mode

            // Set up remote WebDriver URL (e.g., Selenium Grid hub URL)
            Uri gridUrl = new Uri("http://<GRID_HUB_URL>:4444/wd/hub");

            // Set up desired capabilities
            var capabilities = new DesiredCapabilities();
            capabilities.SetCapability(ChromeOptions.Capability, chromeOptions);

            // Instantiate the remote WebDriver
            IWebDriver driver = new RemoteWebDriver(gridUrl, capabilities);

            // Perform actions on the remote browser
            driver.Navigate().GoToUrl("https://www.example.com");
            Console.WriteLine("Page title is: " + driver.Title);

            // Close the browser session
            driver.Quit();
        }
    }
}

Chrome, Edge, and Firefox allow setting a custom download directory, but when this is done on a remote computer, the directory is on the remote machine's file system. Selenium provides a way to enable downloads so that files can be transferred to the client computer.

Enable Downloads in the Grid

To enable downloads in the grid, you must add a specific flag when starting the grid in either node or standalone mode, regardless of the client.

--enable-managed-downloads true
// Enable Downloads in the Client
ChromeOptions options = new ChromeOptions
{
     EnableDownloads = true
};

driver = new RemoteWebDriver(GridUrl, options);

Uploading a file in Remote WebDriver sessions is more complex because the file is typically on the client machine, while the remote driver looks for the file on its own local system. To solve this, Selenium uses a Local File Detector. When set, it sends the file from the client to the remote machine, making it accessible to the driver.

((RemoteWebDriver)driver).FileDetector = new LocalFileDetector();
IWebElement fileInput = driver.FindElement(By.CssSelector("input[type=file]"));
fileInput.SendKeys(uploadFile);
driver.FindElement(By.Id("file-submit")).Click();

List Downloadable Files

Selenium does not wait for files to finish downloading. The file list it provides is an immediate snapshot of the files currently in the directory for the given session.

IReadOnlyList<string> names = ((RemoteWebDriver)driver).GetDownloadableFiles();

Download a File

Selenium searches for the specified file in the list and downloads it to the provided target directory.

((RemoteWebDriver)driver).DownloadFile(downloadableFile, targetDirectory);

Delete Downloaded Files

By default, the download directory is deleted at the end of the session, but you can also choose to delete all files during the session.

((RemoteWebDriver)driver).DeleteDownloadableFiles();

Each browser has unique functionality specific to that browser, and each Selenium binding provides a different method to use these features in a Remote Session.

var customCommandDriver = driver as ICustomDriverCommandExecutor;
customCommandDriver.RegisterCustomDriverCommands(FirefoxDriver.CustomCommandDefinitions);
var screenshotResponse = customCommandDriver.ExecuteCustomDriverCommand(FirefoxDriver.GetFullPageScreenshotCommand, null);

With this setup, you can easily run Selenium tests in a remote environment using ChromeDriver.