2
我正在尝试通过TestNG进行多线程测试。 @BeforeMethod实例化测试的WebDrivers @AfterMethod在测试后关闭WebDrivers。 @dataProvider提供用于测试的数据以循环多次运行多线程TestNG DataProvider执行
import java.lang.reflect.Method;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class MultipleSession {
private WebDriver driver;
@BeforeMethod
public void beforeMethod() {
System.err.println("Before ID" + Thread.currentThread().getId());
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
if (driver == null) {
driver = new ChromeDriver();
driver.get("https://www.google.co.in/");
}
}
@DataProvider(name = "sessionDataProvider", parallel = true)
public static Object[][] sessionDataProvider(Method method) {
int len = 12;
Object[][] parameters = new Object[len][1];
for (int i = 0; i < len; i++) {
parameters[i][0] = i;
}
return parameters;
}
@Test(dataProvider = "sessionDataProvider")
public void executSessionOne(int input) {
System.err.println("Test ID" + Thread.currentThread().getId());
driver.findElement(By.name("q")).sendKeys(input + "");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@AfterMethod
public void afterMethod() {
System.err.println("After ID" + Thread.currentThread().getId());
}
@AfterSuite
public void afterSuti() {
driver.close();
driver.quit();
}
}
我的问题是,即使TestNG的打开浏览器10在一时间,任务只由一个浏览器中进行,而其他9个浏览器什么都不做。 如何将beforeMethod中声明的Webdriver实例分发给所有线程?
在此先感谢。
TestNG的创建该类一次,整个股领域测试方法。而是通过'DataProvider'传递'WebDriver'来限定变量。 –
@ben如果我这样做,问题是只有一个浏览器实例被打开,所有任务都在该实例中执行。我的要求是针对多个浏览器,所有的任务应该分配给所有打开的线程,而不关闭浏览器。 – manish
您可能需要将测试运行器设置为'parallel ='methods'',否则测试将按顺序运行。但是,如果测试套件的其余部分不是并行就绪,则需要使用@Test(singleThreaded = true)'注释它。我很久没有从Java使用WebDriver,所以希望每个JVM都可以运行多个。如果不是,那么您将不得不使用fork方法将测试分割到多个JVM。 –