Selenium Remote Control on Linux

This a tutorial about front-end unit testing using Selenium Remote Control and Firefox on a headless Linux server.

Requirements
  • Selenium Remote Control
  • Firefox
  • Xvfb (X Windows Virtual Frame Buffer)
  • PHPUnit

Install Selenium

$ wget http://selenium.googlecode.com/files/selenium-remote-control-1.0.3.zip
$ unzip selenium-remote-control-1.0.3.zip -d /opt/selenium-remote-control-1.0.3
$ ln -s /opt/selenium-remote-control-1.0.3 /opt/selenium


Install Firefox

$ wget http://openaccess.oldapps.com/mozilla.org//firefox/releases/3.6.3/linux-i686/en-US/firefox-3.6.3.tar.bz2
$ tar xjf firefox-3.6.3.tar.bz2
$ export PATH=$PATH:/path/to/firefox/dir


Install Xvfb

$ yum install Xvfb 

Install PHPUnit

$ pear channel-discover pear.phpunit.de
$ pear install channel://pear.phpunit.de/PHPUnit


Ant's Build File

Copy / paste as build.xml

<project name="apw" default="build" basedir=".">

<target name="start-selenium">
<exec executable="Xvfb" spawn="true">
<arg line=" :0 -ac -noreset -screen 0 1024x768x24 -sp /etc/X11/fs/config"/>
</exec>
<exec executable="java" spawn="true">
<env key="DISPLAY" value=":0"/>
<arg line="-jar /opt/selenium/selenium-server-1.0.3/selenium-server.jar -log /tmp/selenium.log"/>
</exec>
</target>

<target name="stop-selenium">
<get taskname="selenium-shutdown"
src="http://localhost:4444/selenium-server/driver/?cmd=shutDownSeleniumServer"
dest="/tmp/result.txt" ignoreerrors="true" />
<echo taskname="selenium-shutdown" message="DGF Errors during shutdown are expected" />
</target>
</project>


PHPUnit Test Script

Copy / paste as apw.php

<?php

require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class APW extends PHPUnit_Extensions_SeleniumTestCase
{
protected $autoStop = FALSE;
protected $captureScreenshotOnFailure = TRUE;
protected $screenshotPath = '/tmp/screenshots';
protected $screenshotUrl = 'http://localhost/screenshots';

protected function setUp()
{
$this->setBrowser("*chrome");
$this->setBrowserUrl("http://www.autopartswarehouse.com/");
}

public function test_search()
{
$this->open("/");
$this->click("search_text");
$this->type("search_text", "brakes");
$this->click("submit");
$this->waitForPageToLoad("30000");
try {
$this->assertTrue($this->isTextPresent("You searched for \"Brakes\" (2 matches)"));
} catch (PHPUnit_Framework_AssertionFailedError $e) {
array_push($this->verificationErrors, $e->toString());
//$this->drivers[0]->captureEntirePageScreenshot($this->screenshotPath . DIRECTORY_SEPARATOR . str_replace('/', '_', $this->getLocation()) . $this->testId . '.png');
$this->drivers[0]->captureEntirePageScreenshot($this->screenshotPath . DIRECTORY_SEPARATOR . rawurlencode($this->getLocation()) . '.png');
}
}
}


Screenshots

$ mkdir /tmp/screenshots


Start Selenium

$ ant start-selenium


Execute Test Script

$ phpunit apw.php


Result

PHPUnit 3.4.12 by Sebastian Bergmann.

F

Time: 17 seconds, Memory: 7.75Mb

There was 1 failure:

1) APW::test_search
Failed asserting that <boolean:false> is true.


FAILURES!
Tests: 1, Assertions: 1, Failures: 1.


screenshots

$ ls -l /tmp/screenshots


Stop Selenium

$ ant stop-selenium


Troubleshooting

SecurityPolicy file error

Error message

FreeFontPath: FPE "unix/:7100" refcount is 2, should be 1; fixing.
error opening security policy file /usr/lib64/xserver/SecurityPolicy


You need to specify SecurityPolicy file location by using -sp argument

$ Xvfb :0 -ac -noreset -screen 0 1024x768x24 -sp /etc/X11/fs/config


Suppress exec output

Prevent Ant's <exec> output messages from displaying. Add spawn attribute and set value to true.

<exec executable="java" spawn="true">
<arg line="-jar /opt/selenium/selenium-server-1.0.3/selenium-server.jar -log /tmp/selenium.log"/>
</exec>


Firefox error

Failed to start new browser session: java.lang.RuntimeException: Firefox 3 could not be found in the path!
Please add the directory containing ''firefox-bin' or 'firefox'' to your PATH environment


Make sure Firefox is accessible and you have properly configured PATH variable.

$ export PATH=$PATH:/path/to/firefox/dir