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实例分发给所有线程?

在此先感谢。

+0

TestNG的创建该类一次,整个股领域测试方法。而是通过'DataProvider'传递'WebDriver'来限定变量。 –

+0

@ben如果我这样做,问题是只有一个浏览器实例被打开,所有任务都在该实例中执行。我的要求是针对多个浏览器,所有的任务应该分配给所有打开的线程,而不关闭浏览器。 – manish

+0

您可能需要将测试运行器设置为'parallel ='methods'',否则测试将按顺序运行。但是,如果测试套件的其余部分不是并行就绪,则需要使用@Test(singleThreaded = true)'注释它。我很久没有从Java使用WebDriver,所以希望每个JVM都可以运行多个。如果不是,那么您将不得不使用fork方法将测试分割到多个JVM。 –

回答

0
private WebDriver driver; 

这条线是指仅存在的webdriver的单个实例, driver = new ChromeDriver();被一次又一次实例相同的驱动程序对象。

为了解决这个问题,建立一个工厂,在工厂的每一个@Test method.Sample代码要求司机对象从工厂会像

static synchronized RemoteWebDriver getDriver() 
{ 
System.setProperty("webdriver.chrome.driver", "chromedriver.exe"); 
     if (driver == null) { 
      driver = new ChromeDriver() 
}