我正在从事自动化项目,我需要使用 testNG 并行运行测试。当我只运行一个实例时,一切正常,但是当像这样运行时:
@Test(invocationCount = 3, threadPoolSize = 3)
只有一个测试完成所有步骤,其余测试由于找不到可见元素而在第一步中的某个地方失败。
这是我的 DriverFactory 代码:
public class Factory {
private static ThreadLocal<WebDriver> ThreadDriver = new InheritableThreadLocal<>();
public static synchronized WebDriver getDriver() {
WebDriver driver = ThreadDriver.get();
if (driver==null) {
FirefoxBinary binary = new FirefoxBinary(new File(
"path-to-mozilla"));
FirefoxOptions options = new FirefoxOptions();
options.setBinary(binary);
WebDriverManager.firefoxdriver().setup();
driver = new FirefoxDriver(options);
ThreadDriver.set(driver);
}
return driver;
}
public static synchronized void quitDriver() {
WebDriver driver = ThreadDriver.get();
if(driver!=null) {
driver.quit();
ThreadDriver.remove();
}
}
}
然后它在@BeforeMethod中被初始化:
public class UploadPhotoTest {
WebDriver driver;
static String dateName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date());
static String extentReportFile = "./src/main/resources/reports/report_" + dateName + ".html";
public static ExtentReports extent = new ExtentReports(extentReportFile, false);
public static ExtentTest test;
@BeforeMethod
public void setUp() {
driver = Factory.getDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
我尝试通过 testng.xml 运行它,并使用不同名称的测试副本,如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Load Tests" parallel="methods" thread-count="2">
<test name="Create video Test">
<classes>
<class name="UploadPhotoTest">
</class>
</classes>
</test>
</suite>
但是随后一个测试正在执行一些步骤并失败,抛出有关未找到元素的错误,然后第二个测试开始工作。
问题出在你的测试代码上。
您正在配置方法中执行此操作
@BeforeMethod
public void setUp() {
driver = Factory.getDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
此代码在类级别设置一个
WebDriver
实例,这违背了 ThreadLocal
变量的目的。
请进行以下更改
driver = Factory.getDriver();
更改为 WebDriver driver = Factory.getDriver()
。这将确保您有一个本地变量来引用网络驱动程序,因此您可以轻松设置超时并最大化窗口部分。@Test
方法中,直接通过 Factory.getDriver()
访问线程本地 webdriver,而不是通过类级别 WebDriver
变量引用它。这应该确保您的代码可以工作。
这个想法是,您仅在所有
WebDriver
方法中直接通过 ThreadLocal
读取 @Test
实例,而不是在测试类中存储对其的引用。