【问题标题】:Selenium tests running in parallel causing error: invalid session idSelenium 测试并行运行导致错误:无效的会话 ID
【发布时间】:2019-01-16 09:47:30
【问题描述】:

希望在使我的测试可并行化方面获得一些帮助。我有一个 selenium c# 设置,它使用 NUnit、C# 和 selenium 的组合在我的机器或 CI 服务器上按顺序运行测试。

我之前研究过测试的并行化,但无法实现跳跃,并且按顺序运行很好。

在我添加 NUnit [Parallelizable] 标记的那一刻,我收到一个“OpenQA.Selenium.WebDriverException : invalid session 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 的文件并包含以下数据:

  • {名称}:{值}
  • 浏览器列表:Chrome、Edge、Firefox
  • 环境列表:QA
  • 系统列表:我们

这是我在 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.Platform/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();
            }
        }
    }
}

【问题讨论】:

    标签: c# selenium nunit


    【解决方案1】:

    您的所有测试都使用相同的驱动程序,该驱动程序在 TestBase 中定义为静态。这两个夹具将并行运行,并且都会影响驱动程序的状态。如果您希望两个测试并行运行,则它们不能都使用相同的状态,常量或只读值除外。

    首先要做的是让驱动程序成为实例成员,以便每个派生的固定装置都与不同的驱动程序一起工作。如果这不能解决问题,它至少会带您进入解决方案的下一步。

    【讨论】:

    • 感谢您的回答,我知道我的不同测试线程发生冲突,但是,我不确定我应该如何进行下一步。我从各种教程和其他友好的互联网陌生人中提取了代码。这在很大程度上是一种学习练习和工作。有什么读物可以指点我的方向吗?
    • 我希望有什么东西。它必须由同样了解 NUnit 工作原理的 Web 开发人员编写。我是后者,不是前者。我可以告诉你为什么你的并行性不起作用(见上文),但我没有全面了解你的鞋子里的人可能想要做什么。如果从驱动程序中删除静电没有帮助,请更新您的问题,我们会再试一次。
    【解决方案2】:

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

    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();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 没有理由仅仅因为它的名称是 SetUp 就将属性放在方法上。由测试代码直接调用。
      【解决方案4】:

      您应该在每个测试中单独调用驱动程序,否则,nunit 只会为所有实例打开一个驱动程序。希望这对你有意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-18
        • 2019-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-21
        • 2021-10-24
        相关资源
        最近更新 更多