So I’m using the selenium API, and am using it successfully to test on firefox and chrome. But what would I need to do to run the same unit tests on both browsers automatically. I’ve tried putting the WebDrivers in an ArrayList<WebDriver> drivers object, but the tests don’t run correctly if I do it this way. At the moment there is only one driver in the ArrayList, but it still will not work with just one entry. Here’s some code…
package testsuites;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class BingTests extends BaseTestSuite{
//private WebDriver fireFoxDriver;
private WebDriver chromeDriver;
private WebDriver fireFoxDriver;
private ArrayList<WebDriver> drivers;
@Before
public void setUp() throws Exception {
fireFoxDriver = new FirefoxDriver();
fireFoxDriver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
drivers.add(fireFoxDriver);
}
@Test
public void testGoogle(){
for(WebDriver driver: drivers){
driver.get("http://www.bing.com");
driver.findElement(By.id("sb_form_q")).clear();
driver.findElement(By.id("sb_form_q")).sendKeys("Selenium IDE");
driver.findElement(By.id("sb_form_go")).click();
driver.findElement(By.xpath("//ul[@id='wg0']/li[2]/div/div/h3/a/strong")).click();
WebElement elem = driver.findElement(By.id("mainContent"));
assertTrue(elem.getText().contains("Selenium News"));
}
}
@Test
public void isWikiContentCorrect(){
for(WebDriver driver: drivers){
driver.get("http://www.bing.com");
driver.findElement(By.id("sb_form_q")).clear();
driver.findElement(By.id("sb_form_q")).sendKeys("Saturn");
driver.findElement(By.id("sb_form_go")).click();
driver.findElement(By.linkText("Saturn - Wikipedia, the free encyclopedia")).click();
driver.findElement(By.cssSelector("li.toclevel-1.tocsection-9 > a > span.toctext")).click();
assertTrue(driver.getPageSource().contains("53 of which"));
}
}
@Test
public void isWikiTitleCorrect(){
for(WebDriver driver: drivers){
driver.get("http://www.bing.com");
driver.findElement(By.id("sb_form_q")).clear();
driver.findElement(By.id("sb_form_q")).sendKeys("Saturn");
driver.findElement(By.id("sb_form_go")).click();
driver.findElement(By.linkText("Saturn - Wikipedia, the free encyclopedia")).click();
assertEquals("Saturn - Wikipedia, the free encyclopedia", driver.getTitle());
}
}
@Test
public void testDropDownWithSelenium(){
for(WebDriver driver: drivers){
driver.get("http://www.bing.com");
driver.findElement(By.id("sb_form_q")).clear();
driver.findElement(By.id("sb_form_q")).sendKeys("Neptunes moon");
driver.findElement(By.partialLinkText("moons and rings")).click();
driver.findElement(By.linkText("Neptune (planet) :: Neptune's moons and rings -- Britannica Online ...")).click();
List<WebElement> elems = driver.findElements(By.tagName("Input"));
for(WebElement elem: elems){
System.out.println(elem.getText());
}
}
}
@After
public void tearDown() throws Exception {
for(WebDriver driver: drivers){
driver.close();
}
}
}
You employed wrong practice.This implementation requires unnecessary looping code within test method. As number of test cases get increase, this kind of practice becomes more painful (think 100s of test cases).
Use Selenium Grid or utilise QAF formerly ISFW. In Qmetry Automation Framework (QAF) you can set it in configuration file to run against different browsers.
For example