并行运行的硒测试会导致错误:无效的会话ID

时间:2019-01-16 09:47:30

标签: c# selenium nunit

希望获得有关使我的测试可并行化的一些帮助。我有一个硒c#设置,它结合使用NUnit,C#和硒来在我的机器或CI服务器上本地顺序运行测试。

我之前已经研究过测试的并行化,但是无法进行跳转,并且按顺序运行很好。

当我添加NUnit [Parallelizable]标记时,我收到一个“ OpenQA.Selenium.WebDriverException:无效的会话ID”错误,基于我所做的阅读,我需要使我调用的每个新驱动程序都唯一。但是,我不确定如何执行此操作?甚至从此开始……在我目前的设置中这是否有可能?

我的测试目前正在进行有限的烟雾测试,只是删除了针对多个浏览器的重复回归测试,但是,我认为有必要极大地扩展我的测试能力范围。

从长远来看,我可能会考虑使用Browserstack或Sauselab,但是显然,这需要资金,而且我需要将其批准,所以我现在将寻求使其在本地运行。

这是我的代码的基本设置

测试文件:

第一个.cs测试文件

{
    [TestFixture]
    [Parallelizable]
    public class Featur2Tests1 : TestBase
    {
        [Test]
        [TestCaseSource(typeof(TestBase), "TestData")]
        public void test1(string BrowserName, string Environment, string System)
        {
            Setup(BrowserName, Environment, System);

            //Run test steps....
        }

        [Test]
        [TestCaseSource(typeof(TestBase), "TestData")]
        public void test2(string BrowserName, string Environment, string System)
        {
            Setup(BrowserName, Environment, System);

            //Run test steps....
        }
    }
}

第二个.cs测试文件

{
    [TestFixture]
    [Parallelizable]
    public class FeatureTests2 : TestBase
    {
        [Test]
        [TestCaseSource(typeof(TestBase), "TestData")]
        public void test1(string BrowserName, string Environment, string System)
        {
            Setup(BrowserName, Environment, System);

            //Run test steps....
        }

        [Test]
        [TestCaseSource(typeof(TestBase), "TestData")]
        public void test2(string BrowserName, string Environment, string System)
        {
            Setup(BrowserName, Environment, System);

            //Run test steps....
        }
    }
}

TestBase.cs我为每个测试设置的地方

{ 
    public class TestBase
    {
        public static IWebDriver driver;

        public void Setup(string BrowserName, string Environment, string System)
        {
            Driver.Intialize(BrowserName);
            //do additional setup before test run...
        }

        [TearDown]
        public void CleanUp()
        {
            Driver.Close();          
        }

        public static IEnumerable TestData
        {
            get
            {
                string[] browsers = Config.theBrowserList.Split(',');
                string[] Environments = Config.theEnvironmentList.Split(',');
                string[] Systems = Config.theSystemList.Split(',');
                foreach (string browser in browsers)
                {
                    foreach (string Environment in Environments)
                    {
                        foreach (string System in Systems)
                        {
                            yield return new TestCaseData(browser, Environment, System);
                        }
                    }
                }
            }
        }
    }
}

IEnumerable TestData来自名为config.resx的文件,并且包含以下数据:

  • {名称}:{值}
  • theBrowserList:Chrome,Edge,Firefox
  • theEnvironmentList:质量检查
  • theSystemList:WE

这是我在Driver.cs中创建驱动程序的地方

{
    public class Driver
    {
        public static IWebDriver Instance { get; set; }

        public static void Intialize(string browser)
        {
            string appDirectory = Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.Parent.FullName;
            string driverFolder = $"{appDirectory}/Framework.Ditto.AI.RioPlatform/bin/debug";
            if (browser == "Chrome")
            {
                ChromeOptions chromeOpts = new ChromeOptions();
                chromeOpts.AddUserProfilePreference("safebrowsing.enabled", true);
                chromeOpts.AddArgument("start-maximized");
                chromeOpts.AddArgument("log-level=3");
                Instance = new ChromeDriver(driverFolder, chromeOpts);
            }
            else if (browser == "IE")
            {
                var options = new InternetExplorerOptions { EnsureCleanSession = true };
                options.AddAdditionalCapability("IgnoreZoomLevel", true);
                Instance = new InternetExplorerDriver(driverFolder, options);
                Instance.Manage().Window.Maximize();
            }
            else if (browser == "Edge")
            {
                EdgeOptions edgeOpts = new EdgeOptions();
                Instance = new EdgeDriver(driverFolder, edgeOpts);
                Instance.Manage().Window.Maximize();
                Instance.Manage().Cookies.DeleteAllCookies();
            }
            else if (browser == "Firefox")
            {
                FirefoxOptions firefoxOpts = new FirefoxOptions();
                Instance = new FirefoxDriver(driverFolder, firefoxOpts);
                Instance.Manage().Window.Maximize();
            }
            else { Assert.Fail($"Browser Driver; {browser}, is not currently supported by Initialise method"); }
        }


        public static void Close(string browser = "other")
        {
            if (browser == "IE")
            {
                Process[] ies = Process.GetProcessesByName("iexplore");
                foreach (Process ie in ies)
                {
                    ie.Kill();
                }
            }
            else
            {
                Instance.Quit();
            }
        }
    }
}

4 个答案:

答案 0 :(得分:2)

所有测试都使用相同的驱动程序,该驱动程序在TestBase中定义为静态。这两个装置将并行运行,并且都将影响驱动器的状态。如果要使两个测试并行运行,则除了恒定值或只读值外,它们不能都使用相同的状态。

要做的第一件事是使驱动程序成为实例成员,以便每个派生的灯具都在不同的驱动程序上工作。如果仍然不能解决问题,那么至少可以将您带到解决方案的下一步。

答案 1 :(得分:1)

不要使用静态,这应该有助于解决您的问题

public IWebDriver Instance { get; set; }


using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;


namespace Nunit_ParalelizeTest
{
    public class Base
    {
        protected IWebDriver _driver;


        [TearDown]
        public void TearDown()
        {
            _driver.Close();
            _driver.Quit();
        }


        [SetUp]
        public void Setup()
        {
            _driver = new ChromeDriver();
            _driver.Manage().Window.Maximize();
        }
    }
}

答案 2 :(得分:0)

我看到TestBase的设置方法之上没有[Setup]。造成无效的会话,是因为您试图关闭一个不存在的窗口。同时尝试将driver.close()替换为driver.quit();

答案 3 :(得分:0)

您应在每次测试中分别调用驱动程序,否则,nunit将为所有实例仅打开一个驱动程序。希望这对你有意义。