Skip to main content

Docker Compose a Selenium Grid

There are times when you would like to Selenium Grid quickly so that it can scale to whatever testing goal is you want to achieve.
To start out you will need to get Docker you can goto to find out more information on installing.

Create a docker-compose.yml

Make a new directory and name a file docker-compose.yml inside that directory. The contents are below.
  image: selenium/hub
    - "4444:4444"
  image: selenium/node-chrome
    - hub
    - "5555"
  image: selenium/node-firefox
    - hub
    - "5555"
Once you have created your file goto that directory in your command line. This will create your instances and download necessary files.
$ docker-compose build
To run your instances you can run the following and it will start your servers.
$ docker-compose up
At this point you can now point your test code to as the selenium server. You will notice at this point that you are running only 1 Chrome and 1 Firefox container on your grid. Scaling is very simple. With your servers running you just need to run an additional command to scale to your needs. For instance lets say we want to scale up to 10 Chrome instances.
$ docker-compose scale chrome 10
Voila! you now have 10 chrome containers running on your machine. Scaling works very simple, however keep in mind that memory and processors play a big role in how many you can run on a single machine. With the Chrome container memory is very important. I find that I generally want 1gb of physical memory per Chrome container that I need. Firefox seems to be less and can tolerate 512mb most the time.


Popular posts from this blog

JSON Schema testing with Postman

Postman is becoming quite the popular tool for accessing and testing REST api services. One of the cool features is that you can write some Javascript tests on your responses. Built into Postman is also the Tiny Validator v4 and Cheerio. Cheerio is a small core JQuery like implementation. The problem I have is that there is no way to import a schema file from a remote place or a file. This will be about how I get around that issue.Pre-request Script var uri=''; $.get(uri + '/someFolder/schema.json', function(schema) { postman.setEnvironmentVariable('schema', JSON.stringify(schema)); }); This Pre-request script is what saves the day. There are a couple of timing issues that are present due to async processing. If you were to put this in your test script your chances of it not completing in time are very high and you would get inconsistent results. If you are familiar with JQuery the $.get should look familiar as a ajax call that d…

Mock HTTP calls with Angular and Protractor

One of the benefits using AngularJS is also using some test tools like Protractor. Protractor is a tool that was made for Angular testing. Many times when testing you will need to mock some data so that you can see if your application responds in the correct manner. Let us assume that we have the following HTML file running our application.
<!doctype html> <html ng-app="demo"> <head> <title>Hello</title> <script src=""></script> <script src=""></script> <script src="hello.js"></script> </head> <body> <div ng-controller="Hello"> <p>Hello <span id="gname">{{}}</span></p> </div> …

Remote API useful tricks for Docker on Mac OS X

Install SocatSocat allow you to forward ports to a variety of things. For Docker forwarding a port to the docker.sock file makes a quick way to get access to the Docker remote api. Docker also allow a way to open up that TCP port however on Mac it is temperamental and hard to usebrew install socat socat -d TCP-LISTEN:2375,reuseaddr,fork UNIX:/var/run/docker.sock & Create an IP aliasRunning Docker containers locally is a fairly common thing. Interconnectivity between containers works naturally. However, sometimes you may also want a container to connect back to the Docker Remote API. If you are constantly on the go changing networks you do not want to have to change that IP address every time. A great use case for this is running Jenkins and using docker slavessudo ifconfig lo0 alias Remote API There are also some interesting endpoints you can use for informationcurl http://localhost:2375 curl http://localhost:2375/containers/json curl http://localhost:2375/image…