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() 
}