Skip to main content

NUnit with Selenium: NUnit Testing Framework to Run Tests on Online Selenium Grid

LambdaTest offers support with Selenium WebDriver to help you instantly execute your automation test scripts. LambdaTest is a cloud-based, cross browser testing tool offering a Selenium grid consisting 2000+ browsers and browser versions running on real operating systems to pace up automation testing of your web-app or website. In this topic, you will learn how to automate your website testing using NUnit Selenium on LambdaTest.

In this topic you will be learning:

  1. How to run a sample Selenium script with NUnit testing framework on LambdaTest Automation.
  2. How to specify which browsers to run the test on.
  3. How to run your test cases in parallel to reduce build times.
  4. How to test your locally hosted pages.

Prerequisites For Running NUnit Selenium Tests#

All the code samples in this documentation can be found in the NUnit LambdaTest Repository on git GitHub. You can either download or clone the repository to quickly run your tests.

Download and Install Selenium WebDriver from the official website

  • Make sure you work with latest version of C#.
  • .Net framework to deliver guidelines while developing a range of application using C#.
  • Download Selenium WebDriver Language Binding for C# and extract them to appropriate folder.
  • A .NET Core SDK of 2.1 or greater version.
  • You would also need LambdaTest tunnel binary file for testing your locally hosted or privately hosted projects.

Getting Started With NUnit Testing Framework and LambdaTest#

The first step in using LambdaTest platform is to understand LambdaTest’s Selenium Grid capabilities. Our Selenium Grid uses remote webdriver instead of normal Selenium client browser drivers so if you are migrating from locally run Selenium, you would have to invoke LambdaTest Selenium remote webdriver. Next you need to specify in your code, which browser, browser versions, operating systems, and resolution you wish to run your test on, along with defining LambdaTest specific capabilities. You can checkout LambdaTest Capabilities Generator tool to understand more about how you can define running browser environments and leverage advanced LambdaTest capabilities.

First Test With NUnit Selenium#

Let us begin with a simple Selenium Remote Webdriver test first. The C# script with NUnit testing framework below tests a simple to-do application with basic functionalities like mark items as done, add items in list, calculate total pending items etc. You can also find this at our NUnit GitHub repository.

Here is a code based for the same on NUnit testing framework.

You can use the Platform Configuration to specify the desired capabilities for any browser/platform combination you want for your test.

using NUnit.Framework;using OpenQA.Selenium;using OpenQA.Selenium.Remote;using System;using System.Configuration;  namespace LambdaTestCSharp{   public class Program    {        private static IWebDriver driver;        private static String ltUserName;        private static String ltAppKey;        private static String platform;        private static String browser;        private static String browserVersion;        static void Main(string[] args)        {            InitCaps();            DesiredCapabilities caps1 = new DesiredCapabilities();            caps1.SetCapability("platform", platform);            caps1.SetCapability("browserName", browser); // name of your browser            caps1.SetCapability("version", browserVersion); // version of your selected browser            caps1.SetCapability("name", "CSharpTestSample");            caps1.SetCapability("build", "LambdaTestSampleApp");            caps1.SetCapability("user", ltUserName);            caps1.SetCapability("accessKey", ltAppKey);            Console.WriteLine(ConfigurationSettings.AppSettings["LTUrl"]);              driver = new RemoteWebDriver(new Uri(ConfigurationSettings.AppSettings["LTUrl"]), caps1, TimeSpan.FromSeconds(600));            driver.Manage().Window.Maximize();            driver.Url = "";              // Click on First Check box            IWebElement firstCheckBox = driver.FindElement(By.Name("li1"));            firstCheckBox.Click();              // Click on Second Check box            IWebElement secondCheckBox = driver.FindElement(By.Name("li2"));            secondCheckBox.Click();              // Enter Item name            IWebElement textfield = driver.FindElement(By.Id("sampletodotext"));            textfield.SendKeys(itemName);              // Click on Add button            IWebElement addButton = driver.FindElement(By.Id("addbutton"));            addButton.Click();              // Verified Added Item name            IWebElement itemtext = driver.FindElement(By.XPath("/html/body/div/div/div/ul/li[6]/span"));            String getText = itemtext.Text;            Assert.IsTrue(itemName.Contains(getText));              driver.Quit(); //really important statement for preventing your test execution from a timeout.        }        public static void InitCaps()          {            if (String.IsNullOrEmpty(Environment.GetEnvironmentVariable("LT_USERNAME")))            {                ltUserName = ConfigurationSettings.AppSettings["LTUser"];            }            if (String.IsNullOrEmpty(Environment.GetEnvironmentVariable("LT_APPKEY")))                  ltAppKey = ConfigurationSettings.AppSettings["LTAccessKey"];              if (String.IsNullOrEmpty(Environment.GetEnvironmentVariable("LT_OPERATING_SYSTEM")))                  platform = ConfigurationSettings.AppSettings["OS"];              if (String.IsNullOrEmpty(Environment.GetEnvironmentVariable("LT_BROWSER")))                  browser = ConfigurationSettings.AppSettings["Browser"];              if (String.IsNullOrEmpty(Environment.GetEnvironmentVariable("LT_BROWSER_VERSION")))                  browserVersion = ConfigurationSettings.AppSettings["BrowserVersion"];        }    }}

The Selenium Webdriver test would open a URL, mark the first two items in the list as done, add an item in the list, and return the total number of pending item. Your results would be displayed on the test console (or command-line interface if you are using terminal/cmd) and on LambdaTest dashboard. LambdaTest Dashboard will help you view all your text logs, screenshots and video recording for your entire Selenium tests.

Executing The NUnit Selenium Tests#

You would need to execute the below command in your terminal/cmd.


Going Into Details: What is NUnit Testing Framework?#

NUnit testing framework is an open-source unit testing framework in C# which is derived from JUnit and dedicated for drafting as well as executing unit tests for all Microsoft.NET programming languages. NUnit is cross platform compatible and works efficiently with custom test runners. Test annotations used in NUnit Selenium not only helps to pace up your test execution but also helps in specifying numerous input in a single test. The major advantage of NUnit is its compatibility with Selenium based automation.

If you are already aware of NUnit testing framework or if you are planning on learning it soon then this topic would be resourceful for you to start performing automation testing with Selenium using NUnit on LambdaTest, a cross browser testing tool that offers a Selenium grid consisting a library of 2000+ browsers to provide you with wider test coverage.

In this topic, you will learn how to integrate LambdaTest Selenium cloud grid with your NUnit Selenium testing suite. We are also going to demonstrate automation testing for your locally hosted web pages using NUnit Selenium, so you are more relieved while migrating your web page live on the internet. We would also demonstrate execution of parallel testing for speeding up your effort on test builds.

Understanding & Configuring NUnit Desired Capabilities#

As we said earlier the first step is to configure your test scripts to connect with LambdaTest Selenium automation gird. In the above mentioned C# code for NUnit Selenium, the first thing you would notice is the invoking of remote webdriver instead of the native browser webdrivers. So for example if you are planning to run on Firefox browser in your local machine, you would be using Firefox browser driver like this:

ChromeDriver driver = new ChromeDriver();

However, to run on LambdaTest Selenium grid, you would have to change it remote webdriver and at the same time pass capabilities related to browser, browser versions etc. In simple terms, it would look something like this:

driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);

In the C# code, we are passing browser, browser version, and operating system information, along with LambdaTest Selenium grid capabilities via capabilities object.

Our Capabilities Generator will automatically generate the program, based on your provided input. For Instance, if you select the below configurations:

Operating SystemWindows 10
BrowserGoogle Chrome
Browser Version71.0
Resolution1920 x 1080
Selenium Version3.13.0

Then, LambdaTest Capabilities Generator will automatically generate the below program:

DesiredCapabilities capabilities = new DesiredCapabilities();capabilities.SetCapability("build", "your build name");capabilities.SetCapability("name", "your test name");capabilities.SetCapability("platform", "Windows 10"); // Selected Operating Systemcapabilities.SetCapability("browserName", "Chrome"); // Selected browser namecapabilities.SetCapability("version","71.0");        // Selected browser versioncapabilities.SetCapability("resolution","1280x800"); // Selected screen resolutioncapabilities.SetCapability("selenium_version","3.13.0"); // Selected Selenium versioncapabilities.SetCapability("visual",true);capabilities.SetCapability("chrome.driver",2.42);

The most important capabilities to understand here are ‘browserName’, ‘versions’, and ‘platform’. They define which browser environment you wish to run the test on. Rest of the capabilities are important in test management and debugging. We have a inbuilt capabilities generator tool as well that you use to generate capabilities code for your test suite.

You can also checkout our documentation on Selenium Automation Capabilities to understand more about individual capabilities.

Advanced LambdaTest Capabilities#

In addition to default Selenium Grid capabilities, LambdaTest also has platform specific capabilities like video recording of test runs, console logs of each test run, network logs of each test run, custom profiles for specific browsers, etc. Do checkout our documentations on LambdaTest Advanced capabilities as well.

Testing Locally Hosted Projects using NUnit Selenium#

With LambdaTest, you can even perform cross browser testing on your locally stored web pages with the help of LambdaTest tunnel. LambdaTest tunnel establishes an SSH(Secure Shell) connection from your local machine to LambdaTest cloud servers. Test your website on local and identify bugs before your customer do it for you. LambdaTest tunnel also allows you to perform cross browser testing of your locally hosted web pages through various IP addresses belonging to different parts of the globe. LambdaTest tunnel also helps in testing those web-apps or websites that are only permissible inside your specific corporate firewall. Wish to know more about LambdaTest tunnel?

Follow our documentation on LambdaTest tunnel to know it all. OS specific instructions to download and setup tunnel binary can be found at the following links.

Download the binary file of:

After downloading, open cmd(Command Prompt) / terminal and route the pointer to the same location where you extract the downloaded binary zip file. Then, type the below command and hit Enter to launch LambdaTest tunnel.

LT -user [user's login email] -key [user's access key]

For example, If you have the following:

Login Email[email protected]
Access Key987zyx987

Then, the command would be:

LT -user [email protected].com -key 987zyx987

The above command will set up LambdaTest tunnel successfully! Now, for performing automation testing using C# with NUnit Selenium you need to add the below to your capabilities.

DesiredCapabilities capabilities = new DesiredCapabilities();        capabilities.SetCapability("tunnel", true);

You may also use LambdaTest Capabilities Generator for providing you with the above capability

Tunnel Reference: For a full reference of all tunnel features we support, visit our tunnel page.

Mark Tests As Pass Or Fail#

Based on the motive with which you aim to perform automation testing using C# and NUnit Selenium on LambdaTest’s Selenium grid cloud, you can mark an automation test as either pass or fail. This would depend upon the expected behavior for your test case. You can mark pass or fail using the below code fragment in your automation script:


Parallel Testing using NUnit Testing Framework#

Parallel Testing is one of the most demanding features of LambdaTest Selenium Grid. By parallel testing, you can run more than one test case, simultaneously. This means that Parallel testing would allow you to execute numerous automation test cases altogether. So you execute a single test scenario across different browsers or could run different test scenarios across the same browser but with different browser versions. Wondering how many parallel test cases can you run? That depends entirely on the number of concurrent session under your opted plan.

For instance, if you have a bucket of 100 automated test cases, and the average time for execution of a single test is around 6 minutes. The time taken normally to completely execute all your test cases sequentially would be 600 minutes i.e. 10 hours. However, if you are opting for a plan which offers 2 concurrent sessions then you can perform 2 parallel test cases. This would divide your time in half as the total time taken through parallel testing with 2 concurrent sessions for the above scenario would be 300 minutes i.e. 5 hours. Similarly, if you have got 4 concurrent sessions with you then the time taken would be quarter with respect to sequential testing. This way you could fasten your release cycles as much as you want.

NUnit testing framework is really useful in running parallel tests. For instance, in our above example, you may notice that we are running our test on a single environment. If you want to cover multiple environments you would have to change the hard code every time. Or you would have to use arrays, or multi-threading or something similar.

With LambdaTest, you can pace up your test build activities by performing parallel automation testing using C# and NUnit Selenium. Boost quality assurance of your product by performing extensive and fast-paced automated cross browser testing process with LambdaTest parallel testing.

Check out the same code below to understand it better. You can also find it at our GitHub page here.

Parallel Testing Example#

using System;using OpenQA.Selenium;using OpenQA.Selenium.Remote;using NUnit.Framework;using ParallelSelenium.Utils;using System.Threading;using System.Collections.Generic;  namespace ParallelLTSelenium{    [TestFixture("chrome", "67.0", "Windows 10")]    [TestFixture("internet explorer", "11.0", "Windows 7")]    [TestFixture("firefox", "41.0", "Windows 7")]    [TestFixture("chrome", "30.0", "Windows 7")]    [TestFixture("internet explorer", "9.0", "Windows 7")]    [TestFixture("firefox", "30.0", "Windows 7")]    [TestFixture("chrome", "38.0", "Windows 7")]    [TestFixture("internet explorer", "10.0", "Windows 7")]    [TestFixture("firefox", "35.0", "Windows 7")]    [Parallelizable(ParallelScope.Children)]    public class ParallelLTTests    {          ThreadLocal<IWebDriver> driver = new ThreadLocal<IWebDriver>();        private String browser;        private String version;        private String os;          public ParallelLTTests(String browser, String version, String os)        {            this.browser = browser;            this.version = version;            this.os = os;        }          [SetUp]        public void Init()        {            String seleniumUri = "http://{0}:{1}/wd/hub";            DesiredCapabilities capabilities = new DesiredCapabilities();            capabilities.SetCapability(CapabilityType.BrowserName, browser);            capabilities.SetCapability(CapabilityType.Version, version);            capabilities.SetCapability(CapabilityType.Platform, os);            //Requires if you want to test internal web app.            if (Constants.tunnel != false)            {                capabilities.SetCapability("tunnel", Constants.tunnel);            }            if ( != null)            {                capabilities.SetCapability("build",;            }              if (Constants.seleniumPort != null && Constants.seleniumHost != null)            {              seleniumUri = String.Format(seleniumUri, Constants.seleniumHost, Constants.seleniumPort);            }            capabilities.SetCapability("user", Constants.Username);            capabilities.SetCapability("accessKey", Constants.Accesskey);            capabilities.SetCapability("name",               String.Format("{0}:{1}: [{2}]",               TestContext.CurrentContext.Test.ClassName,               TestContext.CurrentContext.Test.MethodName,               TestContext.CurrentContext.Test.Properties.Get("Description")));            driver.Value = new RemoteWebDriver(new Uri(seleniumUri), capabilities, TimeSpan.FromSeconds(600));                          driver.Value.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));        }          [Test]        public void Todotest()        {            {            driver.Url = "";              Assert.AreEqual("Sample page -", driver.Title);            String itemName = "Yey, Let's add it to list";            // Click on First Check box            IWebElement firstCheckBox = driver.FindElement(By.Name("li1"));            firstCheckBox.Click();              // Click on Second Check box            IWebElement secondCheckBox = driver.FindElement(By.Name("li2"));            secondCheckBox.Click();              // Enter Item name            IWebElement textfield = driver.FindElement(By.Id("sampletodotext"));            textfield.SendKeys(itemName);              // Click on Add button            IWebElement addButton = driver.FindElement(By.Id("addbutton"));            addButton.Click();              // Verified Added Item name            IWebElement itemtext = driver.FindElement(By.XPath("/html/body/div/div/div/ul/li[6]/span"));            String getText = itemtext.Text;            Assert.IsTrue(itemName.Contains(getText));                              }        }          [TearDown]        public void Cleanup()        {            bool passed = TestContext.CurrentContext.Result.Outcome.Status == NUnit.Framework.Interfaces.TestStatus.Passed;            try            {                // Logs the result to Lambdatest                ((IJavaScriptExecutor)driver.Value).ExecuteScript("lambda-status=" + (passed ? "passed" : "failed"));            }            finally            {                // Terminates the remote webdriver session                driver.Value.Quit();            }        }    }}

Here is the Constants file for parallel tests.

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ParallelLTSelenium{    public static class Constants    {        internal static string Username = "undefined";        internal static string AccessKey= "undefined";         internal static boolean tunnel = Environment.GetEnvironmentVariable("TUNNEL");        internal static string seleniumPort = Environment.GetEnvironmentVariable("SELENIUM_PORT");        internal static string build = "C# Sample App";        internal static string seleniumHost = Environment.GetEnvironmentVariable("SELENIUM_HOST");     }}

If you notice, with simple annotations and parameters, you can now run your test suite on multiple browsers every time, without changing the browsers parameters in code files every time.


To prevent over-exploitation of the platform we have added a capacity constraint on the number of tests that can be queued at our platform. Your maximum queue capacity will be dependent upon the number of concurrent sessions your LambdaTest account is eligible for. Below formula will help you calculate the maximum capacity for your queue.

Maximum Queueing Capacity

Maximum number of test cases that can be queued = n + 150

Here, n = number of concurrent sessions.

For example, if your LambdaTest account is eligible to avail 10 concurrent sessions. Then, your queue can have a maximum of 10 + 150 i.e. 160 queued test cases. Scheduling & Execution of these queued test cases will be automatically handled by LambdaTest for you

LambdaTest Queuing Policy: We have also added a limitation on the total amount of time a queued item will remain in queue before it gets timed out.

Queuing Timeout
There is also a limit on how long a test case can stay in the queue. If your test case stays in the queue for more than 15 minutes, the test case would be timed out and would not be executed.

Last updated on