簡體   English   中英

使用Selenium WebDriver和NUnit C#在Parallel中運行測試后,如何關閉多個瀏覽器窗口

[英]How to close down multiple browser windows after running tests in Parallel using Selenium WebDriver and NUnit C#

每次測試后,我目前正在使用以下代碼關閉瀏覽器:

    [TearDown]
    public void StopBrowser()
    {
            if (Driver == null)
                return;
            Driver.Quit();
    }

當運行單個測試時,這很好用,但是當我使用NUnit的[Parallelizable]標簽在並行中運行多個測試時,由於沒有這樣的會話錯誤,我的測試開始失敗,無法連接到遠程服務器錯誤,然后是對象引用錯誤最重要的是,這肯定與並行測試有關。

請在下面找到我在[SetUp]方法中使用的代碼:

    public IWebDriver Driver { get; set; }

    public string TestUrl;

    [SetUp]
    public void Setup()
    {
        string Browser = "Chrome";

        if (Browser == "Chrome")
        {
            ChromeOptions options = new ChromeOptions();
            options.AddArgument("--start-maximized");
            Driver = new ChromeDriver(options);
        }
        else if (Browser == "Firefox")
        {
            FirefoxDriverService service = FirefoxDriverService.CreateDefaultService();
            service.FirefoxBinaryPath = @"C:\Program Files (x86)\Mozilla Firefox\firefox.exe";
            Driver = new FirefoxDriver(service);
        }
        else if (Browser == "Edge")
        {
            EdgeDriverService service = EdgeDriverService.CreateDefaultService();
            Driver = new EdgeDriver(service);
        }

基本頁代碼:

    public class BasePage<TObjectRepository> where TObjectRepository : BasePageObjectRepository
    {

        public BasePage(IWebDriver driver, TObjectRepository repository)
        {
            Driver = driver;
            ObjectRepository = repository;
        }



        public IWebDriver Driver { get; }
        internal TObjectRepository ObjectRepository { get; }
    }

BasePageObjectRepository代碼:

public class BasePageObjectRepository
{
    protected readonly IWebDriver Driver;

    public BasePageObjectRepository(IWebDriver driver)
    {
        Driver = driver;
    }
}

我的測試只是在其相關頁面內調用特定的函數,然后頁面內的代碼僅具有Selenium代碼,該代碼指向該Pages對象存儲庫中的元素,即

ObjectRepository.LoginButton.Click();

我不確定我的測試設置方式是否是部分導致問題的原因,但是對此我所能提供的任何幫助將不勝感激

編輯:在幫助中添加了更多我的代碼:

BaseTest類:

    [TestFixture]
public class BaseTest
{
    public IWebDriver Driver { get; set; }

    public string TestUrl;


    [SetUp]
    public void Setup()
    {
        string Browser = "Chrome";

        if (Browser == "Chrome")
        {
            ChromeOptions options = new ChromeOptions();
            options.AddArgument("--start-maximized");
            Driver = new ChromeDriver(options);
        }
        else if (Browser == "Firefox")
        {
            FirefoxDriverService service = FirefoxDriverService.CreateDefaultService();
            service.FirefoxBinaryPath = @"C:\Program Files (x86)\Mozilla Firefox\firefox.exe";
            Driver = new FirefoxDriver(service);
        }
        else if (Browser == "Edge")
        {
            EdgeDriverService service = EdgeDriverService.CreateDefaultService();
            Driver = new EdgeDriver(service);
        }

        Driver.Manage().Window.Maximize();

        string Environment;
        Environment = "Test";



        if (Environment == "Test")
        {
            TestUrl = "https://walberton-test.azurewebsites.net/";
        }
        else if (Environment == "Live")
        {
            TestUrl = "";
        }

     }
}

[OneTimeTearDown]
public void TeardownAllBrowsers()
{
    Driver.Close();
    Driver.Quit();
}

測試之一的示例:

[TestFixture]
public class TimeLogsTestChrome: BaseTest
{
    [Test]
    [Parallelizable]
    [Category("Time Logs Test for Chrome")]
    public void AssertTimeLogsHeading()
    {
        Driver = new ChromeDriver();
        Driver.Manage().Window.Maximize();
        var loginPage = new LoginPage(Driver);
        var dashboard = new Dashboard(Driver);
        var timeSheets = new Timesheets(Driver);
        loginPage.GoTo("Test");
        loginPage.EnterEmailAddress("Valid");
        loginPage.EnterPassword("Valid");
        loginPage.ClickLoginButtonForLoginToDashboard();
        dashboard.ClickTimesheetsButton();
        timeSheets.AssertHeading();
        Driver.Close();
    }
}

測試基礎代碼示例:

internal class Timesheets : BasePage<TimesheetsPageObjectRepository>
{

    public Timesheets(IWebDriver driver) : base(driver, new TimesheetsPageObjectRepository(driver))
    {
    }

    internal void AssertHeading()
    {
        try
        {
            Assert.AreEqual("Timesheets", ObjectRepository.TimesheetHeading);
        }
        catch (Exception ex)
        {
            throw;
        }
    }

    internal void ClickAddTimesheetButton()
    {
        ObjectRepository.AddTimesheetButton.Click();
    }

    internal void ClickSubmitTimeButton()
    {
        ObjectRepository.SubmitTimeButton.Click();
        Thread.Sleep(5000);
    }
}

具有大多數FindElement代碼的頁面對象存儲庫的部分示例:

internal class TimesheetsPageObjectRepository : BasePageObjectRepository
{

    public TimesheetsPageObjectRepository(IWebDriver driver) : base(driver) { }

    public string TimesheetHeading => Driver.FindElement(By.ClassName("pull-left")).Text;

}

燈具中的NUnit測試都共享相同的燈具實例。 這是程序員必須牢記的NUnit設計的基本原理之一,因為測試很容易通過使用共享狀態來互相踩踏。 即使在非並行情況下,您也必須提防相互干擾的測試,但是並行會使情況變得更糟。

在您的情況下,最可能的罪魁禍首是燈具的Driver屬性。 它是由每個測試的設置來設置的保存在其中的所有內容都由每個測試關閉。 那不是你想要的。

我還注意到,驅動程序被定義了兩次,一次在燈具中,一次在基類中。 您尚未發布足夠的代碼來讓我理解您為什么這樣做,但這似乎有問題。

您必須確定夾具中的所有測試是否都打算使用相同的驅動程序。 我懷疑這不是您想要的,因為驅動程序本身可能具有可變狀態。 但是,您可以使用任何一種方式進行設置。

要對所有測試使用相同的驅動程序 ,請使其成為燈具的屬性。 用OneTimeSetUp方法初始化它,然后用OneTimeTearDown方法釋放它。

要對每個測試使用不同的驅動程序 ,請不要使其成為屬性。 而是在每個測試中初始化局部變量,然后在測試本身中釋放它。

暫無
暫無

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

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