我想在一臺機器上使用TestNG並行運行Selenium Webdriver測試。我有3個@Test方法,3個不同的用戶登錄到同一個應用程序併到達主頁。我需要@Test方法並行運行,並寫入ExtentReports報告。Selenium Webdriver TestNG測試是「覆蓋」對方
我的問題是,儘管在不同的類中有3種完全不同的方法,其中一個用戶將被登錄到3個瀏覽器中的2個,從而使用戶不在。
登錄方法位於PageFactory頁面對象類中。
這裏是我的3個測試方法:
@Test(enabled = true, priority = 0)
public void JohnLogin() throws Exception {
ExtentTest t = ClientReportFactory.getTest();
try {
Login objLogin = new Login(getDriver());
String username = "John";
String password = "Password";
objLogin.SignIn(username, password);
HomePage objHomePage = new HomePage(getDriver());
assertTrue(objHomePage.clientName.getText().contains("John"));
} catch (Exception e) {
}
}
@Test(enabled = true, priority = 1)
public void BobLogin() throws Exception {
ExtentTest t = ClientReportFactory.getTest();
try {
Login objLogin = new Login(getDriver());
String username = "Bob";
String password = "Password";
objLogin.SignIn(username, password);
HomePage objHomePage = new HomePage(getDriver());
assertTrue(objHomePage.clientName.getText().contains("Bob"));
} catch (Exception e) {
}
}
@Test(enabled = true, priority = 2)
public void SamLogin() throws Exception {
ExtentTest t = ClientReportFactory.getTest();
try {
Login objLogin = new Login(getDriver());
String username = "Sam";
String password = "Password";
objLogin.SignIn(username, password);
HomePage objHomePage = new HomePage(getDriver());
assertTrue(objHomePage.clientName.getText().contains("Sam"));
} catch (Exception e) {
}
}
所以,如果我停下首頁上的測試。我將打開2個瀏覽器窗口作爲「John」,一個「Bob」和「Sam」......導致失敗。
這是PageFactory對象的登錄方法。
public void SignIn(String strUsername, String strPassword) throws InterruptedException {
WebDriverWait wait = new WebDriverWait(driver, 15);
username.clear();
username.sendKeys(strUsername);
password.clear();
password.sendKeys(strPassword);
submit.click();
wait.until(ExpectedConditions.visibilityOf(homePagePanel));
}
起初我相信這個問題是在@BeforeMethod線程(如,測試是在不同的線程比@Before和@After)。但我不明白這是怎麼回事。基本測試方法成功打開並關閉3個瀏覽器。它看起來像@Test方法使用彼此的數據!但爲了以防萬一,這裏是我的@Before和@After,以及我的Threading代碼。
public class BaseTest {
public String browser;
private ThreadLocal<WebDriver> threadedDriver = new ThreadLocal<WebDriver>();
@BeforeMethod(alwaysRun = true)
@Parameters({ "browser"})
public void setup(String browser)throws MalformedURLException,
InterruptedException {
WebDriver driver = null;
if (browser.equalsIgnoreCase("Internet Explorer")) {
System.setProperty("webdriver.ie.driver", "C:\\Selenium\\IEDriverServer.exe");
driver = new InternetExplorerDriver();
} else if (browser.equalsIgnoreCase("Firefox")) {
System.setProperty("webdriver.gecko.driver", "C:\\Selenium\\geckodriver.exe");
driver = new FirefoxDriver();
} else if (browser.equalsIgnoreCase("chrome")) {
System.setProperty("webdriver.chrome.driver", "C:\\Selenium\\chromedriver.exe");
driver = new ChromeDriver();
} else if (browser.equalsIgnoreCase("MicrosoftEdge")) {
System.setProperty("webdriver.edge.driver", "C:\\Selenium\\MicrosoftWebDriver.exe");
driver = new EdgeDriver();
}
setWebDriver(driver);
this.browser = browser;
ClientReportFactory.getTest(ExtentTestName, ExtentTestDescription);
baseURL = "testApp.com";
driver.get(baseURL);
driver.manage().window().maximize();
}
public WebDriver getDriver(){
return threadedDriver.get();
}
public void setWebDriver(WebDriver driver) {
threadedDriver.set(driver);
}
@AfterMethod
public void afterMethod() {
ClientReportFactory.closeTest(ExtentTestName, ExtentTestDescription);
getDriver().quit();
threadedDriver.set(null);
}
@AfterSuite
public void afterSuite() {
ClientReportFactory.closeReport();
if (getDriver() != null) {
getDriver().quit();
} else {
System.out.println("Drivers already closed");
}
}
克里希南,下面我的答案有什麼問題?我樂意去學。 – Dineshmohan
@Dineshmohan - 我已經修復了反對票的一部分。另一方面,我認爲您的解決方案可能會受到Java嘗試使用ThreadLocals時出現的奇怪行爲的困擾,其中initialValue()在方法範圍內定義,並且該值取決於封閉範圍。你可以在我的博客文章https://rationaleemotions.wordpress.com/2016/05/16/a-date-with-threadlocal/閱讀更多關於它的信息(我不確定你的代碼是否也會顯示相同的問題,但它確實有可能導致問題的相同類型的代碼) –