web-dev-qa-db-ja.com

Seleniumテストを並行して実行するとエラーが発生する:無効なセッションID

テストを並列化可能にするためのヘルプを探しています。私は、NUnit、C#、Seleniumの組み合わせを使用して、自分のマシンまたはCIサーバーでローカルに順次テストを実行するSelenium c#セットアップを持っています。

私は以前にテストの並列化を調査しましたが、ジャンプすることができず、シーケンスで実行することは問題ありませんでした。

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

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

すべてのテストで、TestBaseで静的として定義されている同じドライバーを使用します。 2つのフィクスチャは並行して実行され、どちらもドライバーの状態に影響します。 2つのテストを並行して実行する場合、定数または読み取り専用の値を除いて、両方が同じ状態を使用することはできません。

最初にすることは、ドライバーをインスタンスメンバーにして、派生した各フィクスチャが異なるドライバーで動作するようにすることです。それでも問題が解決しない場合は、少なくとも次のステップに進みます。

2
Charlie

静的を使用しないでください。これは問題の解決に役立ちます。

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

TestBaseのセットアップメソッドの上に_[Setup]_がないようです。存在しないウィンドウを閉じようとしているため、無効なセッションが発生しています。また、driver.close()driver.quit();に置き換えてみてください

0
Kaushik