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。 –