Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selenium Webdriver: How do I run multiple tests, one after the other in the same window?

My goal is to have a series of tests run one after the other. I would like to have a "login" script log the user in and then the following scripts kick off continuing in the same window/driver. I'm using TestNG so my test suite is setup in the testng.xml file if that helps.

public class LoginScript {
String username, password, siteid;
private WebDriver driver;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
static Logger log = Logger.getLogger(LoginScript.class);


@BeforeSuite (alwaysRun=true)
@Parameters({ "url","username","password","site" })

public void setUp(String env, String user, String pwd, String ste) throws Exception {
username=user;
password=pwd;
siteid=ste;

driver = new FirefoxDriver();
driver.get(env);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}

@Test
public void testLoginScript() throws Exception {
//Maximize window
driver.manage().window().maximize();

//Login
driver.findElement(By.id("TBSiteID")).clear();
driver.findElement(By.id("TBSiteID")).sendKeys(siteid);
driver.findElement(By.id("TBUserName")).clear();
driver.findElement(By.id("TBUserName")).sendKeys(username);
driver.findElement(By.name("TBPassword")).clear();
driver.findElement(By.name("TBPassword")).sendKeys(password);
driver.findElement(By.name("Login")).click();
Thread.sleep(2000);
log.info("Found requested site");

}

 @AfterSuite
 public void tearDown() throws Exception {
//driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
  fail(verificationErrorString);
 }
 }

private boolean isElementPresent(By by) {
try {
  driver.findElement(by);
  return true;
} catch (NoSuchElementException e) {
  return false;
 }
}

private boolean isAlertPresent() {
try {
  driver.switchTo().alert();
  return true;
} catch (NoAlertPresentException e) {
  return false;
  }
 }

 private String closeAlertAndGetItsText() {
  try {
  Alert alert = driver.switchTo().alert();
  String alertText = alert.getText();
  if (acceptNextAlert) {
    alert.accept();
  } else {
    alert.dismiss();
  }
  return alertText;
} finally {
  acceptNextAlert = true;
}
}
}

Next script that I would like to run:

public class AddNormalEE {
String username, password, siteid;
private WebDriver driver;
private boolean acceptNextAlert = true;
 private StringBuffer verificationErrors = new StringBuffer();
static Logger log = Logger.getLogger(AddNormalEE.class);


@BeforeSuite (alwaysRun=true)
@Parameters({ "url","username","password","site" })

public void setUp(String env, String user, String pwd, String ste) throws Exception {
username=user;
 password=pwd;
siteid=ste;

    //driver = new FirefoxDriver();
  //driver.get(env);
  //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}


@Test
public void testAddNormalEE() throws Exception {
//Maximize window
//driver.manage().window().maximize();



@AfterSuite
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
  fail(verificationErrorString);
}
}

private boolean isElementPresent(By by) {
try {
  driver.findElement(by);
  return true;
  } catch (NoSuchElementException e) {
    return false;
  }
}

private boolean isAlertPresent() {
try {
  driver.switchTo().alert();
  return true;
} catch (NoAlertPresentException e) {
  return false;
}
}

private String closeAlertAndGetItsText() {
try {
  Alert alert = driver.switchTo().alert();
  String alertText = alert.getText();
  if (acceptNextAlert) {
    alert.accept();
  } else {
    alert.dismiss();
  }
  return alertText;
} finally {
  acceptNextAlert = true;
}
 }
}  
like image 720
Jason Krept Avatar asked Dec 09 '14 21:12

Jason Krept


People also ask

How do you run multiple tests in Selenium?

We can run multiple test cases using TestNG test suite in Selenium webdriver. To execute test cases simultaneously, we have to enable parallel execution in TestNG. A TestNG execution is driven by the TestNG xml file. To trigger parallel execution we have to use the attributes – parallel and thread-count.

How do I run Selenium test sequentially?

To execute test cases in sequential mode or sequential order, we need to make use of [ProcessTestFixture] and [TestSequence] attribute. To Execute test cases sequentially in the given selected order which is given by a programmer/ developer, we need to add Mbunit. Framework.

Can Selenium run multiple tests in parallel?

Selenium parallel execution enables organizations to simultaneously run tests in parallel on different devices and browsers to significantly shrink testing times. Parallel testing is a test automation method wherein test cases are simultaneously run on multiple combinations of browsers, operating systems, and devices.

How do you get parallel execution in Selenium?

Parallel Testing using TestNG and Selenium Methods: Helps run methods in separate threads. Tests: Help to run all methods belonging to the same tag in the same thread. Classes: Helps to run all methods belonging to a class in a single thread. Instances: Helps run all methods in the same instance in the same thread.


2 Answers

If your tests are dependent, you can put them in the same class with dependsOnMethod={method1} defined on method2 so that the order is gauranteed. If it is between different classes, you might consider extending your AddNormalEE class from the LoginScript class.

To run tests in the same browser, your driver instance needs to be shared between your classes or it has to be the same in all your @Tests. Either make it static or consider having a threadlocal webdriver variable in case you plan to run parallely some day. In the above case, you can also have a method getDriver() in your loginScript which returns the driver object to the AddNormalEE class if static needs to be avoided.

As a general practice, it is good to have independent tests. You can make use of parallel runs to overcome the time issue with independent tests. Making login as a method and not a test since we are not asserting any behavior as per your code above. If I am testing login, I would have separate tests that test login functionality only.

like image 96
niharika_neo Avatar answered Sep 29 '22 19:09

niharika_neo


Each test in a test class should perform the test using a new browser session, This can be easily done by putting the browser invoke and the kill process in a base Test class and extends this class in each test class.

like image 41
vini007 Avatar answered Sep 29 '22 18:09

vini007