Jul 12, 2017 | Zabil Maliackal

Testing with headless chrome

Testing with headless chrome

The new headless feature in Chrome 59, makes it easy to run gauge with selenium on a CI/CD setup or Docker instances without having to use xfvb.

Java

For Maven add the following dependencies to pom.xml.

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.4.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>1.7.1</version>
</dependency>

For Gradle add dependencies to build.gradle

dependencies {
   compile 'org.seleniumhq.selenium:selenium-java:3.4.0'
    compile 'io.github.bonigarcia:webdrivermanager:1.7.1'
}

webdrivermanager is a library that automatically downloads and manages chromedriver.

Initialize WebDriver with arguments for headless mode and run tests.

public class DriverFactory {
   public static WebDriver getDriver() {
        ChromeDriverManager.getInstance().setup();

        ChromeOptions options = new ChromeOptions();
        options.addArguments("--headless");
        options.addArguments("--disable-gpu");

        return new ChromeDriver(options);
    }
}

Ruby

If you are using bundler add this to your Gemfile

source 'https://rubygems.org'

group :test do
    gem 'selenium-webdriver'
    gem 'test-unit'
    gem 'chromedriver-helper'
end

And initialize a driver

require 'selenium-webdriver'

module Driver
    def driver
        options = Selenium::WebDriver::Chrome::Options.new

        options.add_argument('--headless')
        options.add_argument('--disable-gpu')

        Selenium::WebDriver.for :chrome, options: options    
    end

end

Gauge

Gauge sets all of this via project templates!

For a maven selenium project run

$ gauge init java_maven_selenium
$ cd <projectdirectory>
$ headless=Y gauge run specs

Or for setting up a ruby project

$ gauge init ruby_selenium
$ headless=Y bundle exec gauge run specs

Screenshot on failure

By default, Gauge captures the screen display. In headless mode, the browser is not launched into a display, use getScreenShotAs method in WebDriver to capture the browser’s screenshot instead.

For Gauge, implement a custom screenshot handler.

CustomScreenGrabber implements ICustomScreenshotGrabber {
    public byte[] takeScreenshot() {
        // DriverFactory is a custom class to manage WebDriver instances
        // and may vary between projects.
        WebDriver driver = DriverFactory.getDriver();
        return ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
    }
}

Have fun setting up tests in headless mode!

Gauge is a free and open source test automation framework that takes the pain out of acceptance testing. Download it or read documentation to get started!