Get Selenium on Rails to Use A Separate Firefox Browser Profile

Posted by Alvin Lai on November 05, 2009

You might notice that Selenium’s rake acceptance test would fail the second time because Firefox restored tabs that belonged to the first time you ran the acceptance test.

If you run Selenium for the first time round, you’ll end with 2 tabs, the second one being the results:

5b218e74660545b72c952d249954ac5e

When you run the test again, the first tab (circled in red) which was created in the previous session (also the first Selenium test), restored by Firefox, also runs a parallael Selenium test, resulting test failures:

C17adfa3188545cbbb61a90835821b6b

The way to fix this is to disable session restore in Firefox’s about:config:

15a44d34a68104d1f38d716a4872d801

5ec56c333c8308b83b38fca179ebb1ad

547440cfb1dd3719dca9cec797876ea4

But what if you love Firefox’s session restore feature? Create a separate Firefox profile for Selenium testing!

Go to Terminal.app then enter this to run Firefox’s Profile Manager:


/Applications/Firefox.app/Contents/MacOS/firefox-bin -ProfileManager

E2cddef89cdc23dcf81ae6c582a51642

Then modify /vendor/plugins/selenium-on-rails/lib/selenium-on-rails/acceptance_test_runner.rb:

Under the start_browser method, add a


-P Selenium

An example:


command = "\"#{path}\" -P Selenium \"http://#{HOST}:#{@port}#{TEST_RUNNER_URL}?test=tests&auto=true&baseUrl=#{base_url}&resultsUrl=postResults/#{log}&multiWindow=#{MULTI_WINDOW}\""

That would set Selenium to use Firefox with your newly created Selenium Profile, where you can turn off Session Restore just for that profile and still enjoy it in your default Firefox profile.

Run Rake Tasks Locally in Capistano with Quit on Failure

Posted by Alvin Lai on November 04, 2009

After a git commit and push, the next command you might run is cap deploy. But how about running your tests?

If you don’t want to run any extra commands beyond git commit/push and cap deploy, you’ll want to look having your Capistrano script run your Rake tests locally too.

The Capistrano command “run” execute stuff remotely on your target deployed server, but since the deploy.rb Capistrano script is just a regular ruby script, you can just use “system()” or ““” (backticks) to execute commands locally.

Here’s an example:


# acceptance test
task :run_acceptance_test do
system("rake test:acceptance") # can use backticks `` as a shorthand also
exit if $? != 0
end
before "deploy:set_comment", :run_acceptance_test

Let me explain.


before "deploy:set_comment", :run_acceptance_test

would tell Capistrano to run your custom named task, in the case here, it’s “:run_acceptance_test”.


exit if $? != 0

Would check the error code of the previously run system command and if the error code (defined by $?) is not 0 (zero), it’ll cause the whole Capistrano script to exit.

So, if rake test:acceptance fails, the Capistrano script will exit and deployment will not happen at all.

Installing RSelenese in Selenium IDE

Posted by Alvin Lai on October 30, 2009

Selenium on Rails is just plain awesome, providing an web testing interface that doesn’t interfere with your main code. That said, there’s a Firefox plugin called Selenium IDE that records your actions in Firefox and generates tests for use with Selenium, how cool is that!

The only problem is, Selenium IDE doesn’t output in RSelenese and having to port one of their supported formats (Ruby Selenium) is a pain. So what do you do? Install the RSelenese plugin of course!

Here are the steps:

35aaa9dae09704b6186bf35f150277c2

F1b862385d68c472b8a0dca4758cd1cf

Then paste the following code:


/*
* Selenium on Rails RSelenese format for Selenium IDE
*
* Written by Shinya Kasatani (kasatani at gmail.com)
*/

load('formatCommandOnlyAdapter.js');

function string(value) {
if (value != null) {
value = value.replace(/\\/g, '\\\\');
value = value.replace(/\"/g, '\\"');
value = value.replace(/\r/g, '\\r');
value = value.replace(/\n/g, '\\n');
return '"' + value + '"';
} else {
return '""';
}
}

function underscore(text) {
return text.replace(/[A-Z]/g, function(str) {
return '_' + str.toLowerCase();
});
}

function formatCommand(command) {
var line = underscore(command.command);
if (command.target) {
line += ' ' + string(command.target);
if (command.value) {
line += ', ' + string(command.value);
}
}
return line;
}

this.playable = false;

(Taken from http://wiki.openqa.org/display/SIDE/SeleniumOnRails)

here:

39603dd88dd72866cfb0e2d5b074ff32

If you’d wanna tweak the generated RSelenese code, here’s a handy reference:

http://svn.openqa.org/fisheye/browse/~raw,r=1000/selenium-on-rails/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilder.html

Enjoy! :)