簡體   English   中英

如何使用一個驅動程序實例運行c#多個硒單元測試?

[英]How to Run c# Multiple Selenium Unit Test with one driver instance?

我在使用一個驅動程序實例運行多個C#硒單元測試時遇到問題。

請在下面找到我的課程。

文件夾:Com.Main.Web.Selenium

SeleniumTestInitialize.cs是包含驅動程序的主類。

[DeploymentItem(@"Resources\IEDriverServer.exe")]
public class SeleniumTestInitialize
{
    public TestContext TestContext
    {
        get { return testContextInstance; }
        set { testContextInstance = value; }
    }
    private TestContext testContextInstance;

    public bool SeleniumExecutionTerminateFlag=false;

    public SeleniumTestInitialize seleniumTestInitalize;
    public FindWebDriverElement findWebDriverElement;
    public JavaScriptCalls javaScriptCalls;
    public OperateOnWebDriverElement operateOnWebDriverElement;
   **public RemoteWebDriver driver;** 
   // how to use this driver object across multiple unit test classes

    public string baseURL;

    public void SeleniumSetup()
    {
        try
        {
            Console.WriteLine("Starting Driver...........");
            seleniumTestInitalize = new SeleniumTestInitialize();
            var options = new InternetExplorerOptions
            {
                IntroduceInstabilityByIgnoringProtectedModeSettings = true,
                //ForceCreateProcessApi=true
                EnableNativeEvents = false,
                RequireWindowFocus = false,
                IgnoreZoomLevel = true
            };
            driver = new InternetExplorerDriver(TestContext.DeploymentDirectory, options);
            javaScriptCalls = new JavaScriptCalls(driver);
            findWebDriverElement = new FindWebDriverElement(javaScriptCalls);
            operateOnWebDriverElement = new OperateOnWebDriverElement(findWebDriverElement);
            GoToSite(ConfigParameters.WEB_APPLICATION_URL);
            driver.Manage().Window.Maximize();
        }
        catch (Exception e)
        {
            log.Debug("Error Starting Web Driver...........");
            Console.WriteLine(e.StackTrace);
        }

    }

    public bool SeleniumInitalizeCheck()
    {
        if (seleniumTestInitalize != null)
            return true;
        else
            return false;
    }

    public void SeleniumQuit()
    {
        Console.WriteLine("Quitting Driver...........");
        try
        {
            if (driver != null)
            {
                driver.Quit();
            }

            log.Info("Closing Web Driver...........");
            ProcessMgn.killProcessByNames("IEDriverServer");//Make sure the process is killed
        }
        catch (Exception e)
        {
            Console.WriteLine(e.StackTrace);
        }
    }

    public void GoToSite(string urlToOpen)
    {
        driver.Navigate().GoToUrl(urlToOpen);
    }
}

文件夾com.main.tests

Test01.cs

[TestClass]
public class Test01 : SeleniumTestInitialize
{

    [TestInitialize]
    public void Setup()
    {
        SeleniumExecutionTerminateFlag = false;

        if (!SeleniumInitalizeCheck())
        {
            SeleniumSetup();
        }
    }

    [TestCleanup]
    public void TearDown()
    {
        if (SeleniumExecutionTerminateFlag)
        {
            SeleniumQuit();
        }  
    }

    [TestMethod]
    [DataSource("Microsoft.VisualStudio.TestTools.DataSource.TestCase", "http://tfsserver:8080/tfs/PoL;project", "1320", DataAccessMethod.Sequential)]
    public void UCP002_M1()
    {
        var userName = this.TestContext.DataRow["UserName"].ToString();
        var passWord = this.TestContext.DataRow["PassWord"].ToString();
        //use the local host adress for your project here->
        baseURL = this.TestContext.DataRow["URL"].ToString();



        driver.Navigate().GoToUrl(baseURL);

        //driver.FindElement(By.XPath("//html/body/div[2]/div/a/p/desc")).Click();
        //driver.FindElement(By.Id("registerLink")).Click();
        driver.FindElement(By.Id("ctl00_LoginTextBox")).Clear();
        driver.FindElement(By.Id("ctl00_LoginTextBox")).SendKeys(userName);
        driver.FindElement(By.Id("ctl00_PasswordTextbox")).Clear();
        driver.FindElement(By.Id("ctl00_PasswordTextbox")).SendKeys(passWord);
        driver.FindElement(By.Id("ctl00_LogInButton")).Click();
    }


}

Test02.cs

[TestClass]
public class Test02 : SeleniumTestInitialize
{

    [TestInitialize]
    public void Setup()
    {
        SeleniumExecutionTerminateFlag = false;

        if (!SeleniumInitalizeCheck())
        {
            SeleniumSetup();
        }
    }

    [TestCleanup]
    public void TearDown()
    {
        if (SeleniumExecutionTerminateFlag)
        {
            SeleniumQuit();
        }  
    }

    [TestMethod]
    [DataSource("Microsoft.VisualStudio.TestTools.DataSource.TestCase", "http://tfsserver:8080/tfs/PoL;project", "1320", DataAccessMethod.Sequential)]
    public void Test02()
    {
       //some test script
    }


}

我創建了一個有序的測試,並按執行順序對測試進行了優先排序。 但是,它調用的驅動程序的兩個實例意味着瀏覽器的兩倍。

我的問題是如何在所有硒單元測試中共享一個驅動程序對象? 在開始處創建並在末尾關閉驅動程序。 謝謝。

您可以看一下該線程,在這里我回答了它的工作方式: 如何在同一瀏覽器實例中運行多個測試方法而不關閉它(C#,SeleniumWebDriverz NUnit)?

基本上,我使用了:

 using Microsoft.VisualStudio.TestTools.UnitTesting;

代替:

 using NUnit.Framework;

所以現在我有了下一個層次結構:

[TestFixture]
 [TestFixtureSetup] // this is where I initialize my WebDriver " new FirefoxDriver(); "
  [Test] //first test
  [Test] //second test
  [Test] //third test
[TestFixtureTearDown] // this is where I close my driver

進行此更改后,我的瀏覽器將僅打開一次TestFixture(如果您使用“使用Microsoft.VisualStudio.TestTools.UnitTesting;”,則打開TestClass),並且該固定裝置中的所有[Test]-都將在同一瀏覽器實例中運行。 完成所有測試后,瀏覽器將關閉。

希望這對將來有幫助。 問我是否需要其他幫助。

HI如果您正在使用NUnit.Framework;

代碼執行計划如下。 對於第一個測試用例

[TestFixtureSetup]   ---->For each test case this will work so here we can          
                          initialize  the driver instance.              
[TestMethod]         ----->test method will goes here
[TearDown]           -----> clean up code
                         **For Second Test Case**
[TestFixtureSetup]               
[TestMethod]
[TearDown]

如果必須在一個瀏覽器實例中運行兩個測試用例,請不要關閉TearDown內部的驅動程序。 並在TextFixtureSetup下初始化驅動程序

    [TestFixture()]
        public class TestClass
        {

            [TestFixtureSetUp]
            public void Init()
            {
                Driver.initialize(new InternetExplorerDriver());
            }
            [TearDown]
           public void Close()
            {
//dont do any driver.close()
            }
         [TestMethod]
        public void TestCase001()
        {
        //your code goes here
        }
 [TestMethod]
        public void TestCase002()
        {
        //your code goes here
        }

我使用了NUnit Framework:

using NUnit.Framework;

然后,我像這樣設置WebDriver的初始化,測試和拆卸:

[TestFixture()]
class NUnitSeleniumTests
{
    [OneTimeSetUp]
    public void Init()
    {
        driverIE = new InternetExplorerDriver(ConfigurationManager.AppSettings["IEDriver"]);
        driverIE.Manage().Window.Maximize();

        // other setup logic
    }

    [Test]
    public void TestMethod1()
    {
        // Test logic
    }

    [Test]
    public void TestMethod2()
    {
        // Test logic
    }

    ...
    ...
    ...

    [Test]
    public void TestMethodN()
    {
        // Test logic
    }


    [OneTimeTearDown]
    public void  Close()
    {
        driverIE.Close();
    }
}

當我運行所有測試時,將初始化WebDriver driverIE。 然后,在測試運行結束之前關閉WebDriver實例之前,所有測試都將在該WebDriver實例中執行。

默認情況下,測試按字母順序執行; 每個測試也可以獨立執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM