Docker images for Selenium Standalone Server Hub and Node configurations with Chrome and Firefox
Images included:
- elgalu/selenium-base: Base image which includes Java runtime and Selenium jar
- elgalu/selenium-hub: Image for running a Selenium Grid Hub
- elgalu/selenium-node-base: Base image for Selenium Nodes which includes a virtual desktop environment and VNC support
- elgalu/selenium-node-chrome: Selenium node with Chrome installed, needs to be connected to a Selenium Hub
- elgalu/selenium-node-firefox: Selenium node with Firefox installed, needs to be connected to a Selenium Hub
- elgalu/selenium-full: Self contained Selenium Hub and Node combined configuration with both Chrome and Firefox
Running the images
Selenium Grid Hub
$ docker run -d -p 4444:4444 -p 5900:5900 --name selenium-hub elgalu/selenium-hub:2.44.0
Chrome and Firefox Nodes
$ docker run -d --link selenium-hub:hub elgalu/selenium-node-chrome:2.44.0
$ docker run -d --link selenium-hub:hub elgalu/selenium-node-firefox:2.44.0
Self contained Selenium container
$ docker run -d -p 4444:4444 -p 5900:5900 elgalu/selenium-full:2.44.0
Building the images
Ensure you have the phusion/baseimage:0.9.15
base image downloaded, this step is optional since docker takes care of downloading the parent base image automatically.
$ docker pull phusion/baseimage:0.9.15
Clone the repo and from the project directory root you can build everything by running:
$ VERSION=local make build
Note: omitting VERSION=local
will build the images with the current version number thus overwriting the images downloaded from dockerhub.
Using the images
e.g. Spawn a container for Chrome testing:
$ docker run -d --name selenium-hub -p=127.0.0.1::4444 elgalu/selenium-hub:2.44.0
$ CH=$(docker run --rm --name=ch -p=127.0.0.1::5900 \
--link selenium-hub:hub -v /e2e/uploads:/e2e/uploads \
elgalu/selenium-node-chrome:2.44.0)
-- or --
$ CH=$(docker run --rm --name=ch -p=127.0.0.1::4444 -p=127.0.0.1::5900 \
-v /e2e/uploads:/e2e/uploads elgalu/selenium-full:2.44.0)
Note -v /e2e/uploads:/e2e/uploads
is optional in case you are testing browser uploads on your webapp you'll probably need to share a directory for this.
The 127.0.0.1::
part is to avoid binding to all network interfaces, most of the time you don't need to expose the docker container like that so just localhost for now.
I like to remove the containers after each e2e test with --rm
since this docker container is not meant to preserve state, spawning a new one is less than 3 seconds. You need to think of your docker container as processes, not as running virtual machines if case you are familiar with vagrant.
A dynamic port will be binded to the container ones, i.e.
# Obtain the selenium port you'll connect to:
docker port selenium-hub 4444
# -- or --
docker port $CH 4444
#=> 127.0.0.1:49155
# Obtain the VNC server port in case you want to look around
docker port $CH 5900
#=> 127.0.0.1:49160
e.g. Spawn a container for Firefox testing:
This command line is the same as for Chrome, remember that the selenium running container is able to launch either Chrome or Firefox, the idea around having 2 separate containers, one for each browser is for convenience plus avoid certain :focus
issues you web app may encounter during e2e automation.
$ docker run -d --name selenium-hub -p=127.0.0.1::4444 elgalu/selenium-hub:2.44.0
$ FF=$(docker run --rm --name=ch -p=127.0.0.1::5900 \
--link selenium-hub:hub -v /e2e/uploads:/e2e/uploads \
elgalu/selenium-node-firefox:2.44.0)
-- or --
$ FF=$(docker run --rm --name=ch -p=127.0.0.1::4444 -p=127.0.0.1::5900 \
-v /e2e/uploads:/e2e/uploads elgalu/selenium-full:2.44.0)
VNC Connection
In case you have RealVNC binary vnc
in your path, you can always take a look, view only to avoid messing around your tests with an unintended mouse click or keyboard.
$ ./bin/vncview 127.0.0.1:49160
If you are running Boot2Docker on Mac then you already have a VNC client built-in. You can connect by entering vnc://<boot2docker-ip>:49160
in Safari or Alfred
When you are prompted for the password it is secret. If you wish to change this then you should either change it in the /NodeBase/Dockerfile
and build the images yourself, or you can define a docker image that derives from the posted ones which reconfigures it:
FROM elgalu/selenium-node-base:2.44.0
#FROM elgalu/selenium-node-chrome:2.44.0
#FROM elgalu/selenium-node-firefox:2.44.0
#FROM elgalu/selenium-full:2.44.0
# Choose the FROM statement that works for you.
RUN x11vnc -storepasswd <your-password-here> /home/seluser/.vnc/passwd
Look around
$ docker images
#=>
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
elgalu/selenium-full 2.44.0 68e369e3141e 30 minutes ago 886.3 MB
elgalu/selenium-node-firefox 2.44.0 c7c0c99afabd 31 minutes ago 695.9 MB
elgalu/selenium-node-chrome 2.44.0 c4cd17423321 31 minutes ago 796.7 MB
elgalu/selenium-node-base 2.44.0 4f7c1788fe4c 32 minutes ago 584.8 MB
elgalu/selenium-hub 2.44.0 427462f54676 35 minutes ago 431.4 MB
elgalu/selenium-base 2.44.0 9126579ae96e 35 minutes ago 431.4 MB
phusion/baseimage 0.9.15 cf39b476aeec 4 weeks ago 289.4 MB
Troubleshooting
All output is sent to stdout so it can be inspected by running:
$ docker logs -f <container-id|container-name>
The containers leave a few log files in addition to stdout output to see what happened:
/tmp/Xvfb_headless.log
/tmp/fluxbox_manager.log
/tmp/x11vnc_forever.log
/tmp/sel-hub.log
/tmp/sel-node.log