How to start selenium in a background process and wait for it to start

Spawn Selenium server process before tests start for easier acceptance testing.

If you write software or QA tests you may have encountered Selenium. It's a popular browser automation tool used for end-to-end acceptance testing. This means you can test applications in a real browser like Firefox or Chrome using code. There are many frameworks that support Selenium (such as Codeception, Specflow, ThirtyFour, and JUnit) but many of them lack a clear way to start Selenium before tests begin. Many developers start Selenium processes manually - but there is an easier way!

Starting background processes (and capturing the PID)

You can start a process and send it to the background in linux by appending an ampersand to the command:

java -jar selenium-server.jar &

Capturing the process ID

You can save the PID of the process you created with the special variable $!.

java -jar selenium-server.jar &
PID=$!

Waiting for Selenium to start

One issue many encounter with this technique is that Selenium can take some time to start. This means that any tests executed after the Selenium server is started may run before the server is ready. To make sure the server is ready we can use this nifty one-liner:

timeout 300 bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:4444)" != '200' ]]; do sleep 5; done' || false

This will retry the server endpoint http://localhost:444 every 5 seconds until a 200 response status is returned or 300 seconds elapses.

Running tests and killing Selenium afterwards

We can use this technique to start Selenium before tests, run tests, then kill the process with a simple bash script:

#!/bin/bash
set -e

echo "Starting selenium"

# start selenium
java -Dwebdriver.gecko.driver="$DRIVER_LOCATION" -jar "$SELENIUM_LOCATION" &
PID=$!

echo "Server running on process $PID"

echo "Waiting for server response"
timeout 300 bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:4444)" != '200' ]]; do sleep 5; done' || false

echo "Running tests"
{ # try
    mix test && echo "Tests passed. Killing process $PID" && kill "$PID"
} || { # catch
    echo "Tests failed. Killing process $PID" && kill "$PID"
}

In the example above we ran mix test to run some Elixir ExUnit tests but you could run whatever you like. Hope that helps! For more information on testing with Selenium or using test email accounts see our developers page.

Related content

Golang email library

Golang Email Library for sending and receiving emails in Go over SMTP or HTTP/S.

Email for testing

Test email accounts for email testing. Alternatives to Mailinator, MailTrap, Mailosaur and more.

How to wait for Selenium to start during Codeception tests

Example tutorial for how to wait until webdriver and Selenium have started during Codeception PHP tests

Email API for email marketing and more

APIs for email marketing and social campaign testing. Send, receive, validate and test emails in code and online.

How to test an email address

Test email accounts for testing email addresses in code or online. Create fake email accounts for testing.

How to start selenium in a background process and wait for i...

Spawn Selenium server process before tests start for easier acceptance testing.

Ready to dive in?Start building email applications today.