Параллельные тесты Selenium, приводящие к ошибке: неверный идентификатор сеанса - PullRequest
0 голосов
/ 16 января 2019

Нужна помощь в создании параллельных тестов. У меня есть установка selenium c #, которая использует комбинацию NUnit, C # и selenium для последовательного запуска тестов локально на моей машине или на сервере CI.

Ранее я изучал распараллеливание тестирования, но не смог выполнить переход, и выполнение в последовательности прошло нормально.

В тот момент, когда я добавляю тег NUnit [Parallelizable], я получаю ошибку 'OpenQA.Selenium.WebDriverException: неверный идентификатор сеанса', основываясь на чтении, которое я сделал, мне нужно сделать каждый новый драйвер, который я называю уникальным , Тем не менее, я не уверен, как это сделать? или даже начать в этом отношении ... это вообще возможно в моей текущей настройке?

Мои тесты в настоящее время проводят ограниченные тесты дыма и просто убирают повторяющиеся регрессионные тесты для нескольких браузеров, однако я предвижу необходимость значительно расширить мой охват возможностями тестирования.

Я, вероятно, буду рассчитывать на получение Browserstack или Sauselab в долгосрочной перспективе, но очевидно, что для этого требуется финансирование, и мне нужно получить его подписанное, поэтому я буду стремиться к тому, чтобы оно работало локально.

вот посмотрите на базовую настройку моего кода

тестовые файлы:

1-й .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....
        }
    }
}

2-й тестовый файл .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: QA
  • 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();
            }
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Все ваши тесты используют один и тот же драйвер, который определен в TestBase как статический. Два прибора будут работать параллельно и будут влиять на состояние водителя. Если вы хотите, чтобы два теста выполнялись параллельно, они не могут использовать одно и то же состояние, за исключением значений константы или только для чтения.

Первое, что нужно сделать, - это сделать драйвер членом-экземпляром, чтобы каждый из производных приборов работал с отдельным драйвером. Если это не решит проблему, это, по крайней мере, приведет вас к следующему шагу к решению.

0 голосов
/ 30 января 2019

не используйте статические, и это должно помочь решить вашу проблему

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();
        }
    }
}
0 голосов
/ 16 января 2019

Я вижу, что нет [Setup] поверх метода настройки в TestBase. Недопустимый сеанс вызван тем, что вы пытаетесь закрыть окно, которого там нет. Также попробуйте заменить driver.close() на driver.quit();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...