JaroF
JaroF

Reputation: 68

Browserstack Nunit testing - run locally

After 2 days of trying reaching out for somebody to shed some light on this. My ideal setup for writing tests is that a test will be developed using local browser (which I can get to work). Then have bunch of tests running on various devices on Browserstack (which I can get them to run). Now the issue is as soon as I have a test in a project that I've setup using link below, I am unable to run tests locally.

https://automate.browserstack.com/dashboard/v2/quick-start/get-started

For example created another project to test local chrome using IWebDriver:

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;


namespace NunitSeleniumDemo
{
    public class LocalTests
    {
        [SetUp]
        public void Setup()
        {

        }

        [Test]
        public void NunitSeleniumTest()
        {
            String path = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..\\..\\..\\"));
            IWebDriver driver = new ChromeDriver(path + "\\drivers");
            driver.Manage().Window.Maximize();
            driver.Url = "https://bstackdemo.com/";

            DefaultWait<IWebDriver> fluentWait = new DefaultWait<IWebDriver>(driver);
            fluentWait.Timeout = TimeSpan.FromSeconds(5);
            fluentWait.PollingInterval = TimeSpan.FromMilliseconds(250);
            fluentWait.Until(driver => driver.Title == "StackDemo");

            driver.Close();
            driver.Quit();

        }
    }
}

That runs perfectly and I can see local Chrome open and going to the website.

as soon as I copy that into Browserstack project it only runs on Browserstack cloud.

From Browserstack Project (same code)

public class CopiedToBrowserstack
{
    [SetUp]
    public void Setup()
    {

    }

    [Test]
    public void CopiedToBrowserStackTest()
    {
        String path = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..\\..\\..\\"));
        IWebDriver driver = new ChromeDriver(path + "\\drivers");
        driver.Manage().Window.Maximize();
        driver.Url = "https://bstackdemo.com/";

        DefaultWait<IWebDriver> fluentWait = new DefaultWait<IWebDriver>(driver);
        fluentWait.Timeout = TimeSpan.FromSeconds(5);
        fluentWait.PollingInterval = TimeSpan.FromMilliseconds(250);
        fluentWait.Until(driver => driver.Title == "StackDemo");

        driver.Close();
        driver.Quit();

    }
}

what controls where it runs? Had my fair bit with yml file, but no luck.

thanks for your help and time.

EDIT: could be helpful from /log/adapter.log? Not sure why it's invoking browserstack-sdk or where/how to turn it off.

2025-01-26 21:10:34.7637|INFO|BStack.VisualStudio.TestAdapter.BStackAdapter|nunit test started from test explorer
2025-01-26 21:10:34.8502|INFO|A.b|Invoking browserstack-sdk with args: --skip-build-browserstack "C:\vs_code\NUnit-BrowserStack\NUnit-BrowserStack\bin\Debug\net8.0\SingleTest.dll"" --settings "C:\Users\j_f\AppData\Local\Temp\.browserstack\.runsettings" --filter "(FullyQualifiedName=NunitSeleniumDemo.CopiedToBrowserstack.CopiedToBrowserStackTest)"
2025-01-26 21:10:34.8502|INFO|A.b|Setting test assembly Path - C:\vs_code\NUnit-BrowserStack\NUnit-BrowserStack\bin\Debug\net8.0\SingleTest.dll
2025-01-26 21:10:34.8713|INFO|A.b|Debugger is attached, setting VSTEST_HOST_DEBUG
2025-01-26 21:11:04.4375|INFO|A.b|Exec: dotnet browserstack-sdk --skip-build-browserstack "C:\vs_code\NUnit-BrowserStack\NUnit-BrowserStack\bin\Debug\net8.0\SingleTest.dll"
2025-01-26 21:11:04.4488|INFO|A.b|0 : 
2025-01-26 21:10:35.6979|INFO|browserstack_sdk.Program|HandleAdapterProcessExit: registering process exit handler for pid: 24172
2025-01-26 21:10:35.7506|INFO|browserstack_sdk.utils|Using dotnet: C:\Program Files\dotnet\dotnet.exe
2025-01-26 21:10:39.3091|INFO|browserstack_sdk.Program|Detected Selenium version 4.7.0
2025-01-26 21:10:39.3091|INFO|browserstack_sdk.Program|Running for f/w nunit 3.13.3
2025-01-26 21:10:39.5407|INFO|browserstack_sdk.Program|Detected dotnet version 9.0.101
2025-01-26 21:10:39.6924|INFO|browserstack_sdk.Program|Adapter Flow Triggered with testDllPath: C:\vs_code\NUnit-BrowserStack\NUnit-BrowserStack\bin\Debug\net8.0\SingleTest.dll
2025-01-26 21:10:39.6924|INFO|browserstack_sdk.Program|Setting Event Listener Path: C:\vs_code\NUnit-BrowserStack\NUnit-BrowserStack\bin\Debug\net8.0\BrowserstackEventListener.addins and BrowserstackListener Dll path :: BrowserstackListener.dll
2025-01-26 21:10:39.6924|INFO|browserstack_sdk.Program|SetupObservability: File already exists
2025-01-26 21:10:39.6924|INFO|browserstack_sdk.utils|Architecture Info - OS: Win32NT, OSVersion: Microsoft Windows NT 10.0.22631.0, Process Arch: X64, System Arch: X64
GIT FOUND

Upvotes: 0

Views: 41

Answers (2)

VDes
VDes

Reputation: 66

Your project is configured with the BrowserStack SDK for running tests, and it defaults to sending tests to BrowserStack's cloud. To run tests locally, you need a way to bypass the BrowserStack SDK interception for local tests.

Use an environment variable to differentiate between running tests locally and on BS.

  1. Use an environment variable to indicate whether the test should run.
bool isLocal = Environment.GetEnvironmentVariable("RUN_LOCAL") == "true"; 
  1. Update your test class:
    using NUnit.Framework;
    using OpenQA.Selenium;
    using OpenQA.Selenium.Chrome;
    using OpenQA.Selenium.Remote;
    using System;
    
    namespace NunitSeleniumDemo
    {
        public class CopiedToBrowserstack
        {
            IWebDriver driver;
    
            [SetUp]
            public void Setup()
            {
                bool isLocal = Environment.GetEnvironmentVariable("RUN_LOCAL") == "true";
    
                if (isLocal)
                {
                    // Local setup
                    string path = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..\\..\\..\\"));
                    driver = new ChromeDriver(path + "\\drivers");
                }
                else
                {
                    // BrowserStack setup
                    var capabilities = new OpenQA.Selenium.Chrome.ChromeOptions();
                    capabilities.BrowserVersion = "latest";
                    capabilities.PlatformName = "Windows 10";
                    capabilities.AddAdditionalCapability("bstack:options", new
                    {
                        os = "Windows",
                        osVersion = "10",
                        buildName = "Your Build Name",
                        sessionName = "Your Test Name",
                        userName = "your_browserstack_username",
                        accessKey = "your_browserstack_access_key",
                    }, true);
    
                    driver = new RemoteWebDriver(new Uri("https://hub.browserstack.com/wd/hub"), capabilities);
                }
    
                driver.Manage().Window.Maximize();
            }
    
            [Test]
            public void CopiedToBrowserStackTest()
            {
                driver.Url = "https://bstackdemo.com/";
    
                var fluentWait = new OpenQA.Selenium.Support.UI.DefaultWait<IWebDriver>(driver)
                {
                    Timeout = TimeSpan.FromSeconds(5),
                    PollingInterval = TimeSpan.FromMilliseconds(250)
                };
    
                fluentWait.Until(driver => driver.Title == "StackDemo");
    
                driver.Quit();
            }
        }
    }

  1. For local execution, set the env variable RUN_LOCAL=true, for BS execution = false

Upvotes: 0

Prakash K
Prakash K

Reputation: 1

You can use the below parameter in the yml file to run the script locally.

browserstackAutomation: false

Upvotes: 0

Related Questions