Selenium RC Firefox 2 support on Ubuntu Hardy

You may find after upgrading your Ubuntu boxes to Hardy Heron that Selenium RC stops working with Firefox, giving the following error:

java.lang.RuntimeException: Firefox couldn't be found in the path!
Please add the directory containing 'firefox-bin' to your PATH environment
variable, or explicitly specify a path to Firefox like this:
*firefox /blah/blah/firefox-bin

The problem is that by default Hardy uses Firefox 3. Firefox 3 support for Selenium RC is out of the scope of this page; the below assumes you want to test against Firefox 2, the current stable release.

First, you need to install the Firefox 2 package:

apt-get install firefox-2

If you don't want to use Firefox 3 on this box, you can remove it:

apt-get remove firefox-3

If you try and run Selenium RC now, you'll still get the same error we saw before – and yes, firefox-bin still isn't on our PATH.

The ‘firefox’ command is on the PATH, but it's not what Selenium RC is after – if you try linking that up as firefox-bin, you'll get:

java.lang.RuntimeException: File was a script file,
  not a real executable: /usr/local/bin/firefox-bin

Briefly, Selenium RC need to know the real binary so that it can pass in a bunch of custom options, and know what the real process is so that it can shut it down again at the end.

So, we need to find the real firefox-bin.

The odd thing is, if you check on a Feisty box, you'll find that firefox-bin isn't on the path there either.

After a lot of debugging I discovered that the Selenium RC developers have in fact hardcoded the old firefox-bin path for Ubuntu, as one of the special paths checked in addition to those actually on your PATH!:

private static final String DEFAULT_NONWINDOWS_LOCATIONS[] = {
    "/usr/lib/firefox/firefox-bin", // Ubuntu 7.04 default location
    "/Applications/Firefox.app/Contents/MacOS/firefox-bin"};

So at this point we can see what we have to do. With Hardy the Firefox 2 binary path in is now /usr/lib/firefox/firefox-2-bin.

Your first option is to explicitly give this full path to Selenium RC in the open call, as the original error suggested.

The second option is to make a link to this binary from somewhere on your PATH. But, if you try using say:

sudo ln -s /usr/lib/firefox/firefox-2-bin /usr/local/bin/firefox-bin

You'll just get:

firefox-bin: error while loading shared libraries: libmozjs.so: 
  cannot open shared object file: No such file or directory

The problem is that Firefox is built to use a number of .so shared libraries, and on Ubuntu these numerous libraries are installed not in /usr/lib itself, but the /usr/lib/firefox directory. When you run the Firefox binary in that directory, it looks for .so files there (in addition to the usual system paths); but if you run it from /usr/local/bin, it looks in /usr/local/bin, and there's nothing there.

So rather than linking up all the other resources that the binary needs, just put the firefox-bin link in /usr/lib/firefox, where it used to be on Feisty.

Recipe

sudo apt-get install firefox-2
# optionally: sudo apt-get remove firefox-3.0
sudo ln -s /usr/lib/firefox/firefox-2-bin /usr/lib/firefox/firefox-bin

Selenium RC should then work with Firefox 2 ‘out of the box’ as it used to on Feisty.