Selenium is a set of tools which allows to test web applications automatically. Here’s a way to get it working on Centos 6. At the end we should be able to run headless Selenium tests with Firefox. Please note that as X11 disaplay server we will use Xvfb.
At first let’s install required packages and prepare directories.
yum install firefox Xvfb libXfont Xorg mkdir /usr/lib/selenium /var/log/selenium /var/log/Xvfb chown screener.screener /usr/lib/selenium /var/log/selenium /var/log/Xvfb
“screener” is a regular user we use for running Selenium and X server, you can use any user you want, but please do not use root.
Now we can download selenium standalone server:
cd /usr/lib/selenium ; wget http://selenium-release.storage.googleapis.com/2.40/selenium-server-standalone-2.40.0.jar
Make sure you downlowd the latest version.
Besides we definitely need Java:
yum install jre
To manage Selenium and Xvfb we use two simple scripts. Put them to /etc/init.d/selenium and /etc/init.d/Xvfb respectively.
#!/bin/bash # selenium - this script starts and stops the selenium grid # # chkconfig: - 85 15 # description: Selenium Grid is a distributed testing platform for browser-based automation. # processname: selenium # pidfile: /etc/selenium/tmp/selenium.pid # Source function library. . /etc/rc.d/init.d/functions selenium_dir=/usr/lib/selenium log_dir=/var/log/selenium/ error_log=$log_dir/selenium_error.log std_log=$log_dir/selenium_std.log pid_file=/var/log/selenium/selenium.pid java=/usr/bin/java selenium="$selenium_dir/selenium-server-standalone-2.40.0.jar" user=screener start() { if test -f $pid_file then PID=`cat $pid_file` if ps --pid $PID >/dev/null; then echo "Selenium is already running: $PID" exit 0 else echo "Removing stale pid file: $pid_file" fi fi echo -n "Starting Selenium..." su $user -c "$java -jar $selenium -host 127.0.0.1 >$std_log 2>$error_log &" if [ $? == "0" ]; then success else failure fi echo ps -C java -o pid,cmd | grep $selenium | awk {'print $1 '} > $pid_file } stop() { if test -f $pid_file then echo -n "Stopping Selenium..." PID=`cat $pid_file` su $user -c "kill -3 $PID" if kill -9 $PID ; then sleep 2 test -f $pid_file && rm -f $pid_file success else echo "Selenium could not be stopped..." failure fi else echo "Selenium is not running." failure fi echo } status() { if test -f $pid_file then PID=`cat $pid_file` if ps --pid $PID >/dev/null ; then echo "Selenium is running...$PID" else echo "Selenium isn't running..." fi else echo "Selenium isn't running..." fi } case "$1" in start) $1 ;; stop) $1 ;; restart) stop start ;; status) $1 ;; *) echo "Usage: $SELF start|stop|restart|status" exit 1 ;; esac
Xvfb init.d script:
#!/bin/bash # selenium - this script starts and stops Xvfb # # chkconfig: - 85 15 # description: Xvfb # processname: Xvfb # pidfile: /var/log/Xvfb/Xvfb.pid # Source function library. . /etc/rc.d/init.d/functions #selenium_dir=/usr/lib/selenium log_dir=/var/log/Xvfb error_log=$log_dir/Xvfb_error.log std_log=$log_dir/Xvfb_std.log pid_file=/var/log/selenium/Xvfb.pid java=/usr/bin/java xvfb=$( which Xvfb ) user=screener start() { if test -f $pid_file then PID=`cat $pid_file` if ps --pid $PID >/dev/null; then echo "Xvfb is already running: $PID" exit 0 else echo "Removing stale pid file: $pid_file" fi fi echo -n "Starting Xvfb..." su $user -c "$xvfb :99 -ac -screen 0 1280x1024x24 -nolisten tcp >$std_log 2>$error_log &" if [ $? == "0" ]; then success else failure fi echo ps -C Xvfb -o pid,cmd | grep Xvfb | awk {'print $1 '} > $pid_file } stop() { if test -f $pid_file then echo -n "Stopping Xvfb..." PID=`cat $pid_file` su $user -c "kill -15 $PID" if kill -9 $PID ; then sleep 2 test -f $pid_file && rm -f $pid_file success else echo "Xvfb could not be stopped..." failure fi else echo "Xvfb is not running." failure fi echo } status() { if test -f $pid_file then PID=`cat $pid_file` if ps --pid $PID >/dev/null ; then echo "Xvfb is running...$PID" else echo "Xvfb isn't running..." fi else echo "Xvfb isn't running..." fi } case "$1" in start) $1 ;; stop) $1 ;; restart) stop start ;; status) $1 ;; *) echo "Usage: $SELF start|stop|restart|status" exit 1 ;; esac
Now we are ready to start them both:
/etc/init.d/Xvfb start /etc/init.d/selenium start
Let’s check if it works using selenium wrapper for Python:
python-pip install -U selenium
!/usr/bin/env python from selenium import webdriver browser = webdriver.Firefox() browser.get('http://supportex.net') browser.save_screenshot('supportex.png') browser.quit()
Now you should get supportex.png in your current directory.
Please also note that by default Selenium opens TCP port 4444 on all network interfaces. So for security reasons it’s strongly reccomended to limit an access to these port by firewall. For instance this way,
iptables -N SELENIUM iptables -A INPUT -p tcp --dport 4444 -j SELENIUM iptables -A SELENIUM -p tcp --dport 4444 -s 127.0.0.1 -j ACCEPT iptables -A SELENIUM -p tcp --dport 4444 -j DROP