Reputation: 2489
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();
}
}
}
Upvotes: 1
Views: 7513
Reputation: 5908
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
<suite name="Test Automation" verbose="0" parallel="tests">
<test name="Test on FF">
<parameter name="browser" value="InternetExplorerWebDriver" />
...
</test>
<test name="Test on IE">
<parameter name="browser" value="firefoxWebDriver" />
...
</test>
</suit>
Upvotes: 2
Reputation: 9568
JUNIT with Selenium on Different Browsers
Launching different browsers ex: Chrome & FireFox automatically
public class SimpleJunit {
private static WebDriver driver;
public static int random = 0;
private String baseURL;
// @BeforeClass : Executes only once for the Test-Class.
@BeforeClass public static void setting_SystemProperties(){
System.out.println("System Properties seting Key value.");
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe"); // Chrome Driver Location.
}
// @Before : To execute once before ever Test.
@Before public void test_Setup(){
System.out.println("Launching Browser");
if (random == 0) {
driver = new ChromeDriver(); // Creates new SessionID & opens the Browser.
}else {
driver = new FirefoxDriver();
}
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
System.out.println("Session ID : " + ((RemoteWebDriver) driver).getSessionId() );
}
// @Test : Testing senarios.
@Test public void robot_ScreenShot() throws AWTException, IOException{
System.out.println("Robot Tset Screen Shot.");
baseURL = "http://searchsoa.techtarget.com/definition/stickiness";
Robot robot = new Robot(); // CTRL+T new tab in Browser.
driver.get(baseURL);
Toolkit toolkit = Toolkit.getDefaultToolkit();
int width = (int) toolkit.getScreenSize().getWidth();
int height = (int) toolkit.getScreenSize().getHeight();
Rectangle area = new Rectangle(0, 0, width, height);
BufferedImage bufferedImage = robot.createScreenCapture(area);
ImageIO.write(bufferedImage, "png", new File("D:\\Screenshots\\JUNIT-Robot.png"));
random += 1;
}
@Test public void selenium_ScreenShot() throws IOException {
baseURL = "http://www.w3schools.com/css/css_positioning.asp";
driver.get(baseURL);
System.out.println("Selenium Screen shot.");
File screenshotFile = ((RemoteWebDriver) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshotFile, new File("D:\\Screenshots\\JUNIT-Selenium.jpg"));
random += 1;
}
// @After : To execute once after ever Test.
@After public void test_Cleaning(){
System.out.println("Closing Browser");
baseURL = null;
driver.close(); // Removing SessionID & Close the Browser.
/*if you are not using driver.quit(). then JUNIT-Test will not terminate untill you end chromedriver.exe process
in Task-Manager. use CTRL+SHIFT+ESC to open TaskManager then goto processes-view find chromedriver.exe and
then end the process manually. */
driver.quit(); // Ends the Process by removing chromedriver.exe process from Task-Manager.
}
// @AfterClass : Executes only once before Terminating the Test-Class.
@AfterClass public static void clearing_SystemProperties(){
System.out.println("System Property Removing Key value.");
System.clearProperty("webdriver.chrome.driver");
}
}
Upvotes: 1