我是C#的新手,我无法使驱动程序线程安全。我可以在第二个浏览器打开后立即打开两个浏览器,第一个驱动程序丢失其引用。
下面是我的代码我有三个班级
namespace TestAutomation{
[TestFixture]
[Parallelizable(ParallelScope.Children)]
public class UnitTest1 : Setup
{
[Test, Property("TestCaseID","123")]
public void TestMethod1(this IWebDriver driver1)
{
driver1.Navigate().GoToUrl("https://www.google.com");
driver1.FindElement(By.Name("q")).SendKeys("test1");
Thread.Sleep(10000);
}
[Test, Property("TestCaseID", "234")]
public void TestMethod2()
{
driver.Navigate().GoToUrl("https://www.google.com");
driver.FindElement(By.Name("q")).SendKeys("test2");
Thread.Sleep(15000);
}
}}
设置类
namespace TestAutomation{
public class Setup:WebDriverManager
{
[SetUp]
public void setupBrowser()
{
driver = new ChromeDriver("C:\\Users\\Downloads\\chromedriver_win32");
}
[TearDown]
public void CloseBrowser()
{
driver.Close();
driver.Quit();
// driver.Close();
//driver.Quit;
}
}}
Webdrivermanager
namespace TestAutomation{
public class WebDriverManager
{
public IWebDriver driver { get; set; }
}
}
我正在寻找像ThreadLocal injava这样的解决方案,我可以在设置方法中获取并设置每个线程的驱动程序
答案 0 :(得分:0)
你正在做两件相互矛盾的事情:
你应该做一个或另一个。如果您想为每个测试创建一个新浏览器,请不要在其他测试也访问它的地方存储对它的引用。
或者,使用Future
和OneTimeSetUp
并仅创建一次浏览器。但是,在这种情况下,您无法并行运行测试。
答案 1 :(得分:0)
删除SetUp& TearDown方法的属性并显式调用它们。当您使用这些方法属性时,它会开始在同一个类或继承类中的测试之间共享资源。
以下解决方案完美无缺。我开发了一个项目,您可以在其中并行执行浏览器测试(方法级并行化)。您可以根据需要修改项目。
[TestFixture]
class Tests
{
[Test]
public void Test1
{
using(var testInst = new TestCase())
{
testInst
.Init()
.NavigateToHomePage();
}
}
}
public class TestBase:IDisposable
{
private IWebDriver BaseWebDriver;
private TestContext _testContext;
public NavigatePage Init()
{
_testContext = TestContext.CurrentTestContext;
BaseWebDriver = new ChromeDriver();
.
.
.
}
public override void Dispose()
{
//Kill Driver here
//TestContext instance will have the AssertCounts
//But The Testcontext instance will have the result as Inconclusive.
}
}