![](/img/trans.png)
[英]How to run Selenium webdriver C# tests on multiple browser in 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.