3
votes

Tests Selenium exécutés en parallèle provoquant une erreur: ID de session non valide

Je cherche à obtenir de l'aide pour rendre mes tests parallélisables. J'ai une configuration sélénium c # qui utilise une combinaison de NUnit, C # et sélénium pour exécuter des tests en séquence localement sur ma machine ou sur le serveur CI.

J'ai déjà étudié la parallélisation des tests, mais je n'ai pas pu faire le saut, et courir dans une séquence était bien.

Au moment où j'ajoute la balise NUnit [Parallelizable], j'obtiens une erreur 'OpenQA.Selenium.WebDriverException: ID de session invalide', en fonction de la lecture que j'ai faite, je dois faire chaque nouveau pilote que j'appelle unique. Cependant, je ne sais pas comment faire cela? ou même commencer d'ailleurs ... est-ce même possible dans ma configuration actuelle?

Mes tests font actuellement des tests de fumée limités et suppriment simplement les tests de régression répétitifs contre plusieurs navigateurs, cependant, je prévois un J'ai besoin d'étendre considérablement ma couverture de capacité de test.

Je chercherai probablement à obtenir Browserstack ou Sauselab à long terme, mais évidemment, cela nécessite un financement, et je dois le faire approuver, alors je le ferai cherche à le faire fonctionner localement pour le moment.

voici un aperçu de la configuration de base de mon code

fichiers de test:

1er test .cs fichier

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

2ème fichier de test .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);
                        }
                    }
                }
            }
        }
    }
}

TestBase.cs où ma configuration pour chaque test

{
    [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....
        }
    }
}

Le IEnumerable TestData provient d'un fichier appelé config.resx et contient les données suivantes:

  • {Name}: {Value}
  • theBrowserList: Chrome, Edge, Firefox
  • theEnvironmentList: contrôle qualité
  • theSystemList: NOUS

C'est ici que je crée mon pilote dans Driver.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....
        }
    }
}


0 commentaires

4 Réponses :


0
votes

Je vois qu'il n'y a pas de [Setup] en plus de la méthode de configuration dans la TestBase. Une session non valide est due au fait que vous essayez de fermer une fenêtre qui n'est pas là. Essayez également de remplacer driver.close () par driver.quit();


1 commentaires

Il n'y a aucune raison de mettre un attribut sur une méthode simplement parce que son nom est SetUp. Il est appelé directement par le code de test.



2
votes

Tous vos tests utilisent le même pilote, qui est défini dans TestBase comme statique. Les deux appareils fonctionneront en parallèle et affecteront tous les deux l'état du pilote. Si vous souhaitez que deux tests s'exécutent en parallèle, ils ne peuvent pas tous les deux utiliser le même état, à l'exception des valeurs constantes ou en lecture seule.

La première chose à faire serait de faire du pilote un membre d'instance, afin que chacun des appareils dérivés fonctionne avec un pilote différent. Si cela ne résout pas le problème, cela vous mènera au moins à l'étape suivante vers une solution.


2 commentaires

Merci pour votre réponse, je comprends que mes différents fils de test sont en conflit, cependant, je ne sais pas comment je dois procéder avec mes prochaines étapes. J'ai rassemblé le code à partir de divers tutoriels et d'autres gentils étrangers sur Internet. Cela a été un exercice d'apprentissage et un travail. Y a-t-il une lecture que vous pourriez m'indiquer dans la direction de s'il vous plaît?


J'aimerais qu'il y ait quelque chose. Il devrait être rédigé par un développeur Web qui comprend également le fonctionnement de NUnit. Je suis le dernier, pas le premier. Je peux vous dire pourquoi votre parallélisme ne fonctionne pas (voir ci-dessus) mais je n'ai pas une image complète de ce que quelqu'un à votre place pourrait vouloir faire. Si la suppression de l'électricité statique du pilote n'aide pas, veuillez mettre à jour votre question et nous réessayerons.



1
votes

n'utilisez pas de statique et cela devrait vous aider à résoudre votre problème

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 commentaires

0
votes

Vous devez appeler le pilote séparément dans chaque test, sinon, nunit ouvre un seul pilote pour toutes les instances. J'espère que cela vous rend sensible.


0 commentaires