# Using Selenium Remote Control

by Dave Bauer

To use Selenium Remote Control to run browser-based tested from acs-automated-testing first install Selenium Remote Control. Download Selenium RC. This requires a working Java configuration. See Selenium RC Documentation and specifically Selenium RC Installation.

You can record tests to Tcl code that will run in acs-automated-testing by adding the a Tcl-RC mode in Selenium-IDE.

Open up Firefox, click on Tools, select Selenium IDE, select Options, then Options again. Click on the formats tab. Click add. Name the format "Tcl-Rc". Paste the following code in the large box.

    /*
     * Format for Selenium Remote Control Python client.
     */

    load('remoteControl.js');

    this.name = "tcl-rc";

    function testMethodName(testName) {
    	return "test_" + underscore(testName);
    }

    notOperator = function() {
    	return "! ";
    }

    tclString = function(value) {
    	value = value.replace(/\\/g, '\\\\');
    	value = value.replace(/\"/g, '\\"');
    	value = value.replace(/\r/g, '\\r');
            value = value.replace(/\n/g, '\\n');
            value = value.replace(/\{/g, '\\{');
            value = value.replace(/\}/g, '\\}');
            value = value.replace(/\[/g, '\\[');
            value = value.replace(/\]/g, '\\]');
            value = value.replace(/\$/g, '\\$');

    	var unicode = false;
    	for (var i = 0; i < value.length; i++) {
    		if (value.charCodeAt(i) >= 128) {
    			unicode = true;
    		}
    	}
    	return (unicode ? 'u' : '') + '"' + value + '"';
    }

    function assertTrue(expression) {
    	return "aa_true " + tclString(expression.toString()) + " [expr {![catch {" + expression.toString() + "} errmsg]}]";
    }

    function assertFalse(expression) {
    	return "aa_false " + tclString(expression.toString()) + " [expr {![catch {" + expression.toString() + "} errmsg]}]";
    }

    function verify(statement) {
            return statement;
    }

    function verifyTrue(expression) {
    	return verify(assertTrue(expression));
    }

    function verifyFalse(expression) {
    	return verify(assertFalse(expression));
    }

    function joinExpression(expression) {
        return "join " + expression.toString();
    }

    function assignToVariable(type, variable, expression) {
    	return "set " + underscore(variable) + " [" + expression.toString() + "]";
    }

    function waitFor(expression) {
        return "for {set i 0} {i < " + expression.toString() + "} {incr i} {\n"
            + "if {" + expression.toString() + "} {break}\n"
            + "after 1000\n"
            + "}\n"
            + "if {$i == 60} {error \"time out\"}";
    }

    function assertOrVerifyFailure(line, isAssert) {
        return "" + line + "} errmsg]} {error \"expected failure\"}";
    }

    Equals.prototype.toString = function() {
    	return this.e1.toString() + " eq " + this.e2.toString();
    }

    Equals.prototype.assert = function() {
    	return 'aa_equal ' + string(this.e2.toString() + this.e1.toString()) + ' ' + this.e1.toString() + ' [' + this.e2.toString() +']';
    }

    Equals.prototype.verify = function() {
    	return verify(this.assert());
    }

    NotEquals.prototype.toString = function() {
    	return this.e1.toString() + " ne " + this.e2.toString();
    }

    NotEquals.prototype.assert = function() {
    	return "aa_true " + tclString(this.e1.toString() + " ne " + this.e2.toString()) + " [expr {" + this.e1.toString() + " ne " + this.e2.toString() + "}]";
    }

    NotEquals.prototype.verify = function() {
    	return verify(this.assert());
    }

    RegexpMatch.prototype.toString = function() {
    	var str = this.pattern;
    	if (str.match(/\"/) || str.match(/\n/)) {
    		str = str.replace(/\\/g, "\\\\");
    		str = str.replace(/\"/g, '\\"');
    		str = str.replace(/\n/g, '\\n');
    		return '"' + str + '"';
    	} else {
    		str = 'r"' + str + '"';
    	}
    	return "re.search(" + str + ", " + this.expression + ")";
    }

    function pause(milliseconds) {
    	return "after " + milliseconds;
    }

    function echo(message) {
            return "aa_log " + xlateArgument(message);
    }

    function statement(expression) {
    	return expression.toString();
    }

    function array(value) {
    	var str = '[lst ';
    	for (var i = 0; i < value.length; i++) {
    		str += string(value[i]);
    		if (i < value.length - 1) str += " ";
    	}
    	str += ']';
    	return str;
    }

    function nonBreakingSpace() {
        return "u\"\\u00a0\"";
    }

    CallSelenium.prototype.toString = function() {
    	var result = '';
    	if (this.negative) {
    		result += '! ';
    	}
    	if (options.receiver) {
    		result += options.receiver + ' ';
    	}
    	result += this.message + ' ';
    	for (var i = 0; i < this.args.length; i++) {
    		result += this.args[i];
    		if (i < this.args.length - 1) {
    			result += ' ';
    		}
    	}
    	return result;
    }

    function formatComment(comment) {
    	return comment.comment.replace(/.+/mg, function(str) {
    			return "# " + str;
    		});
    }

    this.options = {
    	header:'',
    	footer:''
    };

    this.configForm =
    	'<description>Variable for Selenium instance</description>' +
    	'<description>Header</description>' +
    	'<textbox id="options_header" multiline="true" flex="1" rows="4"/>' +
    	'<description>Footer</description>' +
    	'<textbox id="options_footer" multiline="true" flex="1" rows="4"/>';

You may also refer to the Selenese Commands Documentation which may give some hints to writing tests.