General Docker image for executing headless Google Chrome or Firefox Protractor e2e test cases in a Docker container. The created image does not contain any javascript test code or project. This is the environment for running Protractor test cases. The image is test project independent.
The Dockerfile was design based on the following projects:
- Protractor and headless Chrome on Docker or Docker image of Protractor with headless Chrome
- docker-protractor
- Protractor-Firefox-Headless-Docker
- Clone this repository.
- If you have any environment variable which is used for your test project, provide here environment file. The following variable is mandatory for the Docker image:
- TESTCONF=
e2e.conf.js
here should add your e2e test configuration JS file (for our project it ise2e.conf.js
)
- Build the Docker image.
docker build -t sequenceiq/protractor-runner .
- Execute your Protractor test configuration in Docker container:
docker run -it --rm --name protractor-runner --env-file utils/testenv -v $(pwd):/protractor/project sequenceiq/protractor-runner
utils/testenv
the location (full path) of thetestenv
file on your machinesequenceiq/protractor-runner
built Docker image name$(pwd)
orpwd
the root folder of your Protractor test project- For example the local folder where the ULUWATU functional E2E tests project has been cloned from GitHub.
- The use of PWD is optional, you do not need to navigate to the Protractor test project root. If it is the case, you should add the full path of the root folder instead of the
$(pwd)
.
Protractor can test directly using Chrome Driver or Firefox Driver, bypassing any Selenium Server. The advantage of direct connect is that your test project start up and run faster.
To use this, you should change your config file:
directConnect: true
If this is true, settings for seleniumAddress and seleniumServerJar will be ignored. If you attempt to use a browser other than Chrome or Firefox an error will be thrown.
Chrome does not support to running it in container. So you need to start the Chrome Driver with --no-sandbox
argument to avoid errors.
In the Protractor configuration file:
capabilities: {
'browserName': 'chrome',
/**
* Chrome is not allowed to create a SUID sandbox when running inside Docker
*/
'chromeOptions': {
'args': ['no-sandbox']
}
},
Chrome uses sandboxing, therefore if you try and run Chrome within a non-privileged container you will receive the following message:
"Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted".
The --privileged
flag gives the container almost the same privileges to the host machine resources as other processes running outside the container, which is required for the sandboxing to run smoothly.
Based on the Webnicer project.
We created a very simple Makefile to be able build and run easily our Docker image:
make build
then
make run
The rules are same as in case of To run your test cases in this image.
Docker has hardcoded value of 64MB for /dev/shm
. Error can be occurred, because of page crash on memory intensive pages. The easiest way to mitigate the problem is share /dev/shm
with the host.
docker run -it --rm --name protractor-runner --env-file utils/testenv -v /dev/shm:/dev/shm -v $(pwd):/protractor/project sequenceiq/protractor-runner
The size of /dev/shm
in the Docker container can be changed when container is made with option --shm-size
.
For Mac OSX users this conversation can be useful.
Based on the Webnicer project.
This options is required only if the dockerised Protractor is run against localhost on the host.
Imagine this scenario:
Run an http test server on your local machine, let's say on port 8000. You type in your browser http://localhost:8000 and everything goes smoothly. Then you want to run the dockerised Protractor against the same localhost:8000. If you don't use --net=host
the container will receive the bridged interface and its own loopback and so the localhost within the container will refer to the container itself. Using --net=host
you allow the container to share host's network stack and properly refer to the host when Protractor is run against localhost.
Based on the Webnicer project.