Skip to content

Instantly share code, notes, and snippets.

@tdomzal
Last active March 11, 2020 08:23

Revisions

  1. tdomzal revised this gist Jul 22, 2015. 2 changed files with 8 additions and 8 deletions.
    14 changes: 7 additions & 7 deletions ParallelSeleniumTestBase.java
    Original file line number Diff line number Diff line change
    @@ -8,15 +8,13 @@
    import java.util.List;

    import org.apache.commons.lang3.StringUtils;
    import org.apache.log4j.Logger;
    import org.junit.AfterClass;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.junit.runners.Parameterized;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;

    @@ -27,6 +25,8 @@
    @RunWith(Parallelized.class)
    public class ParallelSeleniumTestBase {

    private static final Logger log = Logger.getLogger(ParallelSeleniumTestBase.class);

    /** Available driver types */
    enum WebDriverType {
    CHROME,
    @@ -71,8 +71,8 @@ public static Collection<Object[]> driverTypes() {

    @BeforeClass
    public static void initChromeVariables() {
    // chromedriver requires system variable
    System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
    System.setProperty("webdriver.chrome.driver", "c:\\Programs\\chromedriver\\chromedriver.exe");
    //System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
    }

    @Before
    @@ -100,11 +100,11 @@ public static void driverCleanup() {
    }

    /**
    * Log to console: current thread, current {@link WebDriver} instance and message.
    * Log: current thread, current {@link WebDriver} and message.
    */
    protected static void log(WebDriver driver, String message) {
    String driverShortName = StringUtils.substringAfterLast(driver.getClass().getName(), ".");
    System.out.println(String.format("%15s, %15s: %s", Thread.currentThread().getName(), driverShortName, message));
    log.info(String.format("%15s, %15s: %s", Thread.currentThread().getName(), driverShortName, message));
    }

    }
    2 changes: 1 addition & 1 deletion Parallelized.java
    Original file line number Diff line number Diff line change
    @@ -45,4 +45,4 @@ public Parallelized(Class klass) throws Throwable {
    super(klass);
    setScheduler(new ThreadPoolScheduler());
    }
    }
    }
  2. tdomzal revised this gist Jul 22, 2015. 1 changed file with 3 additions and 0 deletions.
    3 changes: 3 additions & 0 deletions ParallelSeleniumTestBase.java
    Original file line number Diff line number Diff line change
    @@ -99,6 +99,9 @@ public static void driverCleanup() {
    }
    }

    /**
    * Log to console: current thread, current {@link WebDriver} instance and message.
    */
    protected static void log(WebDriver driver, String message) {
    String driverShortName = StringUtils.substringAfterLast(driver.getClass().getName(), ".");
    System.out.println(String.format("%15s, %15s: %s", Thread.currentThread().getName(), driverShortName, message));
  3. tdomzal revised this gist Jul 22, 2015. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions ParallelSeleniumTestBase.java
    Original file line number Diff line number Diff line change
    @@ -71,8 +71,8 @@ public static Collection<Object[]> driverTypes() {

    @BeforeClass
    public static void initChromeVariables() {
    System.setProperty("webdriver.chrome.driver", "c:\\Programs\\chromedriver\\chromedriver.exe");
    //System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
    // chromedriver requires system variable
    System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
    }

    @Before
  4. tdomzal created this gist Jul 22, 2015.
    107 changes: 107 additions & 0 deletions ParallelSeleniumTestBase.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,107 @@
    package example.junit;

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collection;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;

    import org.apache.commons.lang3.StringUtils;
    import org.junit.AfterClass;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.junit.runners.Parameterized;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;

    /**
    * Parallel Selenium WebDriver example for http://stackoverflow.com/questions/30353996/selenium-and-parallelized-junit-webdriver-instances
    * Parallelized class is like http://hwellmann.blogspot.de/2009/12/running-parameterized-junit-tests-in.html
    */
    @RunWith(Parallelized.class)
    public class ParallelSeleniumTestBase {

    /** Available driver types */
    enum WebDriverType {
    CHROME,
    FIREFOX
    }

    /** Create WebDriver instances for specified type */
    static class WebDriverFactory {
    static WebDriver create(WebDriverType type) {
    WebDriver driver;
    switch (type) {
    case FIREFOX:
    driver = new FirefoxDriver();
    break;
    case CHROME:
    driver = new ChromeDriver();
    break;
    default:
    throw new IllegalStateException();
    }
    log(driver, "created");
    return driver;
    }
    }

    // for description how to user Parametrized
    // see: https://github.com/junit-team/junit/wiki/Parameterized-tests
    @Parameterized.Parameter
    public WebDriverType currentDriverType;

    // test case naming requires junit 4.11
    @Parameterized.Parameters(name= "{0}")
    public static Collection<Object[]> driverTypes() {
    return Arrays.asList(new Object[][] { //
    { WebDriverType.CHROME }, //
    { WebDriverType.FIREFOX } //
    });
    }

    private static ThreadLocal<WebDriver> currentDriver = new ThreadLocal<WebDriver>();
    private static List<WebDriver> driversToCleanup = Collections.synchronizedList(new ArrayList<WebDriver>());

    @BeforeClass
    public static void initChromeVariables() {
    System.setProperty("webdriver.chrome.driver", "c:\\Programs\\chromedriver\\chromedriver.exe");
    //System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
    }

    @Before
    public void driverInit() {
    if (currentDriver.get()==null) {
    WebDriver driver = WebDriverFactory.create(currentDriverType);
    driversToCleanup.add(driver);
    currentDriver.set(driver);
    }
    }

    protected WebDriver getDriver() {
    return currentDriver.get();
    }

    @AfterClass
    public static void driverCleanup() {
    Iterator<WebDriver> iterator = driversToCleanup.iterator();
    while (iterator.hasNext()) {
    WebDriver driver = iterator.next();
    log(driver, "about to quit");
    driver.quit();
    iterator.remove();
    }
    }

    protected static void log(WebDriver driver, String message) {
    String driverShortName = StringUtils.substringAfterLast(driver.getClass().getName(), ".");
    System.out.println(String.format("%15s, %15s: %s", Thread.currentThread().getName(), driverShortName, message));
    }

    }
    48 changes: 48 additions & 0 deletions Parallelized.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,48 @@
    package example.junit;

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;

    import org.apache.log4j.Logger;
    import org.junit.runners.Parameterized;
    import org.junit.runners.model.RunnerScheduler;

    /**
    * From: http://hwellmann.blogspot.de/2009/12/running-parameterized-junit-tests-in.html
    */
    public class Parallelized extends Parameterized {

    private static final Logger log = Logger.getLogger(Parallelized.class);

    private static class ThreadPoolScheduler implements RunnerScheduler {
    private ExecutorService executor;

    public ThreadPoolScheduler() {
    String threads = System.getProperty("junit.parallel.threads", "16");
    int numThreads = Integer.parseInt(threads);
    executor = Executors.newFixedThreadPool(numThreads);
    }

    @Override
    public void finished() {
    executor.shutdown();
    try {
    executor.awaitTermination(10, TimeUnit.MINUTES);
    } catch (InterruptedException exc) {
    throw new RuntimeException(exc);
    }
    }

    @Override
    public void schedule(Runnable childStatement) {
    log.debug(String.format("scheduled (%s): %s", childStatement.getClass(), childStatement));
    executor.submit(childStatement);
    }
    }

    public Parallelized(Class klass) throws Throwable {
    super(klass);
    setScheduler(new ThreadPoolScheduler());
    }
    }
    34 changes: 34 additions & 0 deletions SearchKeywordsTest.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,34 @@
    package example.junit;

    import org.junit.Test;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;

    public class SearchKeywordsTest extends ParallelSeleniumTestBase {

    @Test
    public void searchForChromeDriver() throws InterruptedException {
    openAndSearch(getDriver(), "chromedriver");
    }

    @Test
    public void searchForJunit() throws InterruptedException {
    openAndSearch(getDriver(), "junit");
    }

    @Test
    public void searchForStackoverflow() throws InterruptedException {
    openAndSearch(getDriver(), "stackoverflow");
    }

    private void openAndSearch(WebDriver driver, String phraseToSearch) throws InterruptedException {
    log(driver, "search for: "+phraseToSearch);
    driver.get("http://www.google.com");
    WebElement searchBox = driver.findElement(By.name("q"));
    searchBox.sendKeys(phraseToSearch);
    searchBox.submit();
    Thread.sleep(3000);
    }

    }