并行进行硒测试并确保线程安全

问题描述 投票:0回答:1

我正在尝试并行化Selenium测试。我发现了Selenium's IWebDriver is not thread safe。我不知道没有线程安全测试是否存在严重的危险,但是无论如何,我想尝试解决任何“不良做法”。在我的代码中,我正在使用以下设计。

public abstract class Parent
{
    public IWebDriver driver;
    public Parent(IWebDriver driver) { this.driver = driver; }
    public bool ElementExists(By by) { 
        if (this.driver.FindElement(by) != null) 
            return true; 
        return false;
    }
}

public class Child1 : Parent 
{
    public Child1(IWebDriver driver) : base(driver) { }
}

public class Child2 : Parent 
{
    public Child2(IWebDriver driver) : base(driver) { }
}

此代码线程安全吗?

据我所知,由于我将IWebDriver实例传递给构造函数,因此我不必担心使用相同的IWebDriver会错误地将子类视为子类。但是,仅通过查看非线程安全代码的示例,就可以关注抽象的Parent类中的IWebDriver字段。

c# selenium thread-safety
1个回答
0
投票

据我所知,如果您要在每个测试用例之前和之后设置和拆除WebDriver实例-而不是对多个测试使用相同的WebDriver实例-那么您已经在练习线程安全。

但是,我过去使用NUnit的Parallelizable属性遇到问题-您提到您正在使用C#,所以如果您使用NUnit进行测试,则可能是一个问题。

您可以声明一个旨在确保线程安全的ThreadLocal驱动程序实例:

public static ThreadLocal<IWebDriver> driver =
    new ThreadLocal<IWebDriver>(() =>
    {
        return new ChromeDriver();
    });

ThreadLocal是对任何对象(不仅仅是WebDriver)进行线程安全编码的C#方法。您可以使用Dispose()方法释放资源,并使用WebDriver访问threadLocalDriver.Value实例。

© www.soinside.com 2019 - 2024. All rights reserved.