Code Monkey home page Code Monkey logo

docker-selenium's Introduction

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

docker-selenium's People

Contributors

elgalu avatar mtscout6 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.