3

我正在尝试通过 TestNG 进行多线程测试。 @BeforeMethod为测试实例化 WebDrivers。 @AfterMethod测试后关闭 WebDrivers。@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 afterSuite() {
         driver.close();
         driver.quit();
     }
  }

我的问题是,即使 TestNG 一次打开 10 个浏览器,任务也只能由一个浏览器执行,而其他 9 个浏览器什么也不做。

如何将 beforeMethod 中声明的 Webdriver 实例分发给所有线程?

4

1 回答 1

0
private WebDriver driver;

这行意味着只有一个 webdriver driver = new ChromeDriver();实例,一次又一次地实例化同一个驱动程序对象。

为了解决这个问题,创建一个工厂并在每个 @Test 方法中从工厂请求驱动对象。工厂的示例代码将类似于

static synchronized RemoteWebDriver getDriver()
{
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
         if (driver == null) {
             driver = new ChromeDriver()
}
于 2016-02-23T10:16:25.420 回答