我正在尝试并行化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字段。
据我所知,如果您要在每个测试用例之前和之后设置和拆除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
实例。