Home‎ > ‎Testing‎ > ‎

Headless Running

This describes how to run chrome and firefox in Selenium tests on a remote server headlessly or run the tests in a virtual frame buffer. In other words, run the tests with out UI. 

Setup Virtual Frame Buffer

0. Install the xvfb package
sudo apt-get install xvfb

1. Create a file /etc/init.d/xvfbd by running nano or favorite terminal editor.
sudo nano /etc/init.d/xvfbd
2. Copy the contents of the file and add them to the new file /etc/init.d/xvfbd. source
#! /bin/sh
### BEGIN INIT INFO
# Provides:          Xvfb
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start Xvfb.
# Description:       Start the X virtual framebuffer.
### END INIT INFO

# Author: Hannes Brandstaetter-Mueller <hannes.brandstaetter@fh-hagenberg.at>
#
# Please remove the "Author" lines above and replace them
# with your own name if you copy and modify this script.

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH
=/sbin:/usr/sbin:/bin:/usr/bin
DESC
="X virtual framebuffer"
NAME
="Xvfb"
DAEMON
=/usr/bin/$NAME
DAEMON_ARGS
=":1 -screen 0 1024x768x24"
PIDFILE
=/var/run/$NAME.pid
SCRIPTNAME
=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start
()
{
       
# Return
       
#   0 if daemon has been started
       
#   1 if daemon was already running
       
#   2 if daemon could not be started
        start
-stop-daemon --start --background --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
               
|| return 1
        start
-stop-daemon --start --background --quiet --pidfile $PIDFILE --exec $DAEMON -- \
                $DAEMON_ARGS
\
               
|| return 2
       
# Add code here, if necessary, that waits for the process to be ready
       
# to handle requests from services started subsequently which depend
       
# on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop
()
{
       
# Return
       
#   0 if daemon has been stopped
       
#   1 if daemon was already stopped
       
#   2 if daemon could not be stopped
       
#   other if a failure occurred
        start
-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL
="$?"
       
[ "$RETVAL" = 2 ] && return 2
       
# Wait for children to finish too if this is a daemon that forks
       
# and if the daemon is only ever run from this initscript.
       
# If the above conditions are not satisfied then add some other code
       
# that waits for the process to drop all resources that could be
       
# needed by services started subsequently.  A last resort is to
       
# sleep for some time.
        start
-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
       
[ "$?" = 2 ] && return 2
       
# Many daemons don't delete their pidfiles when they exit.
        rm
-f $PIDFILE
       
return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload
() {
       
#
       
# If the daemon can reload its configuration without
       
# restarting (for example, when it is sent a SIGHUP),
       
# then implement that here.
       
#
        start
-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
       
return 0
}

case "$1" in
  start
)
       
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
       
case "$?" in
               
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
               
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
       
esac
       
;;
  stop
)
       
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
       
case "$?" in
               
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
               
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
       
esac
       
;;
  status
)
       status_of_proc
"$DAEMON" "$NAME" && exit 0 || exit $?
       
;;
 
#reload|force-reload)
       
#
       
# If do_reload() is not implemented then leave this commented out
       
# and leave 'force-reload' as an alias for 'restart'.
       
#
       
#log_daemon_msg "Reloading $DESC" "$NAME"
       
#do_reload
       
#log_end_msg $?
       
#;;
  restart
|force-reload)
       
#
       
# If the "reload" option is implemented then remove the
       
# 'force-reload' alias
       
#
        log_daemon_msg
"Restarting $DESC" "$NAME"
        do_stop
       
case "$?" in
         
0|1)
                do_start
               
case "$?" in
                       
0) log_end_msg 0 ;;
                       
1) log_end_msg 1 ;; # Old process is still running
                       
*) log_end_msg 1 ;; # Failed to start
               
esac
               
;;
         
*)
               
# Failed to stop
                log_end_msg
1
               
;;
       
esac
       
;;
 
*)
       
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        echo
"Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
       
exit 3
       
;;
esac

3. Set the file permissions by running:
sudo chmod 0755 /etc/init.d/xvfbd 

4. Have the server start it up on boot by running this:
sudo update-rc.d xvfbd defaults

5. Export the display for the web driver to use when ran by adding this to /etc/environment. (reboot)
sudo nano /etc/environment
# /etc/environment
# Export display to use the virtual frame buffer
DISPLAY
=:1

Running Browsers

Setting up chromium-browser (chrome) and firefox for running selenium tests.

1. First install the browsers
sudo apt-get install chromium-browser
sudo apt-get install firefox
2. The chrome browser needs the chrome webdriver installed. So download it from chromedriver list.
wget https://chromedriver.googlecode.com/files/chromedriver2_linux64_0.7.zip
3. Extract the files from the zip like.
unzip chromedriver2_linux64_0.7.zip
4. Move the file chromedriver to /usr/bin/chromedriver.
mv chromedriver /usr/bin/chromedriver
5. Set runnable permissions on the chromedriver bin. 
sudo chmod 0755 /usr/bin/chromedriver
6. Test the driver runs and produces the output. Use control-c to quit.
chromedriver
Started ChromeDriver
port=9515
version=26.0.1383.0
log=/tmp/chromedriver.log
7. Test run Chrome. If the virtual frame buffer is running test it too. The DBus errors are ocurring from referencing features not enabled. Ignore the Xlib: randr error, this has no bearing on the running. Use control-c to quit.
chromium-browser
Xlib:  extension "RANDR" missing on display ":1".
[2031:2031:0414/082813:ERROR:master_preferences.cc(110)] Failed to read master_preferences file at /usr/lib/chromium-browser/master_preferences. Falling back to default preferences.
[2031:2050:0414/082813:ERROR:object_proxy.cc(624)] Failed to get name owner. Got org.freedesktop.DBus.Error.NameHasNoOwner: Could not get owner of name 'org.chromium.Mtpd': no such name
[2031:2050:0414/082813:ERROR:object_proxy.cc(624)] Failed to get name owner. Got org.freedesktop.DBus.Error.NameHasNoOwner: Could not get owner of name 'org.chromium.Mtpd': no such name
[2031:2031:0414/082814:ERROR:object_proxy.cc(529)] Failed to call method: org.chromium.Mtpd.EnumerateStorages: object_path= /org/chromium/Mtpd: org.freedesktop.DBus.Error.ServiceUnknown: The name org.chromium.Mtpd was not provided by any .service files
[2031:2031:0414/082814:ERROR:omnibox_view_gtk.cc(431)] Not implemented reached in virtual void OmniboxViewGtk::ApplyCaretVisibility()
Xlib:  extension "RANDR" missing on display ":1".
8. Test run firefox. And has similar output to chrome. 
firefox
Xlib:  extension "RANDR" missing on display ":1".

(firefox:2264): GConf-WARNING **: Client failed to connect to the D-BUS daemon:
//bin/dbus-launch terminated abnormally without any error message

(firefox:2264): GConf-WARNING **: Client failed to connect to the D-BUS daemon:
//bin/dbus-launch terminated abnormally without any error message

(firefox:2264): GConf-WARNING **: Client failed to connect to the D-BUS daemon:
//bin/dbus-launch terminated abnormally without any error message

(firefox:2264): GConf-WARNING **: Client failed to connect to the D-BUS daemon:
//bin/dbus-launch terminated abnormally without any error message

(firefox:2264): GConf-WARNING **: Client failed to connect to the D-BUS daemon:
//bin/dbus-launch terminated abnormally without any error message

(firefox:2264): GConf-WARNING **: Client failed to connect to the D-BUS daemon:
//bin/dbus-launch terminated abnormally without any error message

(firefox:2264): GConf-WARNING **: Client failed to connect to the D-BUS daemon:
//bin/dbus-launch terminated abnormally without any error message

(firefox:2264): GConf-WARNING **: Client failed to connect to the D-BUS daemon:
//bin/dbus-launch terminated abnormally without any error message
9. Be sure the terminal process is running under a user with out root privileges. In other words the web drivers will not run under root privileges!

Common Errors

1. Trying to run any web driver as a root process!!!
2. If you have tried running the driver or browsers as root. Delete the matched settings in the user account. Like removing chrome cache if it exists. Check to see if anything in the user account has root:root perimissions and revert them to the user account permissions. 
sudo rm -R ~/.cache











































































































Comments