So you built a website. You even run it in Docker container. That’s perfect, but how do you test it? Do you have Selenium tests running in Docker container? Nice. Does the browser Selenium tests drive run in Docker container too? If you feel it’s too much, don’t worry. We’ll see an example with all of that covered 🙂 Keep reading to find out more.
Prerequisites
Install on your machine:
- docker
- docker-compose
- git
The tutorial assumes familiarity with basic git, docker and docker-compose commands.
Demo WordPress in Docker site
We’ll run Selenium tests on a demo WordPress site. Previously, I showed how easy it is to Create WordPress site using Docker fast and how to Point host name to WordPress in Docker. Please follow WordPress in Docker host name configurations section in order to successfully run Selenium tests in Docker demo. Next, we’ll see how to run Selenium tests in Docker container. Of course, tests will drive a browser running in Docker container as well 🙂
Selenium Tests in Docker
Let’s jump straight into the demo of Selenium tests in Docker container.
- clone selenium_tests_in_docker repository from my GitHub.
- inside local repository run:
selenium_tests_in_docker$ docker-compose up -d tests
Creating network "sample_default" with the default driver
Creating sample-db ... done
Creating sample-webserver ... done
Creating sample_browser_1 ... done
Creating sample_tests_1 ... done
Once webserver
, db
and browser
services start and are healthy, Selenium tests run in tests
service.
- Inspect the logs of
tests
service:
selenium_tests_in_docker$ docker logs -f sample-tests-1
test_smth (__main__.Tests) ... ok
----------------------------------------------------------------------
Ran 1 test in 6.192s
OK
True
What does our sample Selenium test look like? In fact, it’s simple Python Selenium test:
...
BROWSER_URL = 'http://browser:4444/wd/hub'
WP_URI = 'http://docker.wp.com/'
class Tests(unittest.TestCase):
def test_smth(self):
options = webdriver.ChromeOptions()
driver = webdriver.Remote(command_executor=BROWSER_URL, options=options)
driver.get(WP_URI)
print(driver.get_screenshot_as_file('/tmp/a.png'))
driver.quit()
The test connects to the containerized browser and navigates to our containerized website using host name. Then, it saves the website’s screenshot to /tmp/a.png
inside tests
service container.
Let’s copy and inspect the screenshot.
docker cp sample_tests_1:/tmp/a.png /tmp
firefox /tmp/a.png
Wow, our Selenium test did its job 🙂
As a Python fan, I chose to write Selenium tests in Python. Though, you can use any language using the same URLs.
Note, that test
s service uses custom tests
Docker image extending Python 3.8 base image.
Its spec:
tests:
build:
context: ./tests
image: 'selenium-tests:latest'
networks:
- default
command: ["python3", "sample_docker_test.py"]
depends_on:
browser:
condition: service_healthy
and Dockerfile
are straightforward:
FROM python:3.8
USER root
COPY requirements.txt requirements.txt
RUN python3 -m pip install -r requirements.txt
RUN mkdir -p workspaces/tests
COPY . workspaces/tests/
WORKDIR workspaces/tests
So far, so good. Lastly, let’s look at how we run Chrome browser in Docker container.
Chrome Browser in Docker
Usually, Selenium tests use WebDriver
instance for driving a browser. That’s correct for driving a local browser. Though, Chrome Browser in our demo runs in Docker container. For that reason, the test drives the browser using RemoteWebDriver
. So the browser is just another web application accessible via APIs from Selenium tests.
In fact, running Chrome in Docker is quite easy. browser
service in our demo uses the official Selenium Chrome docker image.
Its spec is below:
browser:
image: selenium/standalone-chrome:91.0
ports:
- '${NO_VNC_PORT}:7900'
- 4444:4444
shm_size: 2g
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:4444"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
depends_on:
webserver:
condition: service_healthy
Next, let’s see how to view Chrome interaction with the website using VNC.
View Chrome in Docker with VNC
So we have got a browser
in Docker container as well as WordPress website. Is it possible to view the browser’s interaction with the website? Of course 🙂 In order to achieve that, I mapped 7900 port to VNC server running inside browser
service container.
Navigate to http://localhost:7900/, click connect. Then, type secret
as password and your should see the screen below.
Now, go back to the terminal and run tests
again while inspecting the Selenium Grid page.
For a brief moment you should see Chrome opening our demo WordPress site. Of course, in the case of a real test suite, you’ll see Selenium tests live via VNC running inside Docker.
Summary
That’s it about running Selenium tests in Docker. As always, feel free to share and comment.
Wondering where to host your WordPress site? Siteground is highly recommended because of its great support and caching solution. ( I use it myself 🙂 ).
If you prefer fully-managed WordPress on cloud try Linode. Get 100$ credit on Linode using this link.
Bonus: Recommended Selenium courses on Pluralsight:
Sign up using this link to get exclusive discounts like 50% off your first month or 15% off an annual subscription)
Recommended books on Amazon:
- Learn Selenium: Build data-driven test frameworks for mobile and web applications with Selenium Web Driver 3
- Selenium WebDriver Quick Start Guide: Write clear, readable, and reliable tests with Selenium WebDriver 3
You may find interesting below articles I wrote: