Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to test multiple browser(versions) with selenium and junit

I just discovered selenium - a great tool!
I plan to run/use selenium-ide generated junit4 code. But I need it to run with many browsers/web drivers. Is there a junit/java-pattern for this use case? My first idea was to use @RunWith(Parameterized.class) and provide a List of WebDrivers (the parameter for the class - probably provided as an external file listing browsers and versions?!). Is this a good idea? Is it possible to provide a central @Parameters -method to be used by all my Selenium-tests?

What alternatives are there?

Probably it is possible to change the "Format" that Selenium exports to minimize manual changes?

like image 612
dermoritz Avatar asked Feb 13 '12 15:02

dermoritz


2 Answers

Well, I do need to switch drivers from time to time, so I did this:

I initialize selenium related stuff in my own Class - called by name of the application and the driver is approached by the getters. When calling my class constructor, I use enum type of driver to initialize with:

 private WebDriver driver;
 public TestUI(Environment.DriverToUse drv){
   switch (drv){
        case CHROME:{
            ChromeDriverService service = ChromeDriverService.createDefaultService();
            File file = new File(TestUI.class.getResource("/chromedriver.exe").toURI());
            System.setProperty(ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY, file.getAbsolutePath());                
            ChromeOptions options = new ChromeOptions();
            options.addArguments("--start-maximized");
            driver = new ChromeDriver(service,options);
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            break;
        }
        case FIREFOX:{
            FirefoxProfile ffProfile = new FirefoxProfile();
            ffProfile.setPreference("browser.safebrowsing.malware.enabled", false);
            driver = new FirefoxDriver(ffProfile);
            driver.manage().window().setPosition(new Point(0, 0));
            java.awt.Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            Dimension dim = new Dimension((int) screenSize.getWidth(), (int) screenSize.getHeight());
            driver.manage().window().setSize(dim);
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            break;

        }    

public WebDriver getDriver(){
 return driver;
}

of course my Environment class looks like this

public class Environment {
public enum DriverToUse {FIREFOX, CHROME};
// .. and some other stuff, because I need to test on different environments, so I store here Environment URL for example

And my test class looks something like this

@Before
public static final Environment.DriverToUse USED_DRIVER = Environment.DriverToUse.FIREFOX;

@Test
public void testVersionNumber() throws Exception{

    TestUI testUI= new TestUI(USED_DRIVER);
    WebElement version = testUI.getDriver().findElement(By.id("the Id of element"));
    version.click();
    //...
}
like image 58
Pavel Janicek Avatar answered Oct 04 '22 14:10

Pavel Janicek


Use Selenium RC/Selenium Server. These come with the API's you will need to run remote tests in multiple browsers simply. Happy Hunting!

like image 22
Brandon Kindred Avatar answered Oct 04 '22 16:10

Brandon Kindred