About Sahi script
Variables
Sahi APIs
Functions
While Sahi scripts can easily be recorded, as a project grows in
size, the scripts may have to be more logically organized into
functions and split into multiple files. The following section
gives more details on the Sahi Script and the rules to follow. Sahi
script is based on Javascript. The constructs of javascript, like
functions, variables, loops, conditional statements etc. are all
available in Sahi script
But the script is parsed and transformed slightly in the Sahi proxy
server before it reaches the browser.
Details of how Sahi script executes is available here.
All calls to Scheduler Functions
(like _click, _setValue etc.),
are transformed into strings and added to an array.
They are executed later, sequentially, but with a slight delay
between each call.
Example:
_setValue(_textbox("name"), "Kamlesh");
will be parsed and scheduled for execution later,
But
var $x = 10;
will be executed immediately on every page load.
eg.
var $name = "Kamlesh"; // Right way
_setValue(_textbox("name1"), $name); // Right way
$name = "Raman"; // Right way
_setValue(_textbox("name2"), $name); // Right way
is the right way to use variables.
When done the wrong way, i.e., without $ prefix,
var nameWithoutDollar = "Kamlesh"; // Wrong way
_setValue(_textbox("name1"), nameWithoutDollar); // Wrong way
nameWithoutDollar = "Raman"; // Wrong way
_setValue(_textbox("name2"), nameWithoutDollar); // Wrong way
This is wrong, and will not work correctly.
While execution with nameWithoutDollar, both the _setValue calls
will set the value to "Raman"!
This happens because the code gets converted to:
var nameWithoutDollar = "Kamlesh";
sahiAdd("sahi_setValue(sahi_textbox(\"name1\"), nameWithoutDollar)", "aaTest.sah : 2")
nameWithoutDollar = "Raman";
sahiAdd("sahi_setValue(sahi_textbox(\"name2\"), nameWithoutDollar)", "aaTest.sah : 4")
Notice that the 2nd and 4th lines actually schedule the strings
for later execution using sahiAdd().
So the execution order is rather like:
var nameWithoutDollar = "Kamlesh";
nameWithoutDollar = "Raman";
// Some delay later
sahi_setValue(sahi_textbox("name1"), nameWithoutDollar);
// Some delay later
sahi_setValue(sahi_textbox("name2"), nameWithoutDollar);
So when these eventually execute, the variable
nameWithoutDollar, if available will contain the reassigned
value of "Raman".
Also read Why do variables need
to be prefixed with a dollar($) sign? and Scheduler Functions
Variables which are not used as parameters in Sahi APIs need not
start with a dollar.
As mentioned earlier, when variables are used, the transformation
of script is as follows:
var $linkText = "Link Test";
_click(_link($linkText));
becomes
var $linkText = "Link Test";
sahiAdd("sahi_click(sahi_link("+s_v($linkText)+"));", "sahi_demo.sah : 4")
Since the statement is transformed into a string, only variables
which are strings or numbers are possible.
Example
_setValue(_textbox("name"), "Kamlesh"+(++$i));
is not valid;
It should be broken into 2 steps, as follows
$i++;
_setValue(_textbox("name"), "Kamlesh"+$i);
will work correctly
While the rules are the same as in javascript, a couple of points
to note are:
eg.
function createCustomer(){
__setValue(_text("name"), "cust1"); // double underscores. Not a Scheduler Action Function
__setValue(_Password("pwd"), "pwd1"); // double underscores. Not a Scheduler Action Function
__click(_submit()); // double underscores. Not a Scheduler Action Function
}
_call(createCustomer());
This will schedule execution of createCustomer() till later. Note
that all the Action Functions in
createCustomer() use __ (double underscores). This means that even
though createCustomer() will be
called at its scheduled turn, all these functions inside will be
executed immediately when
createCustomer() is executed.
Thus, if the same function existed like this:
function createCustomer(){
_setValue(_text("name"), "cust1"); //Scheduler Action Function
_setValue(_Password("pwd"), "pwd1"); //Scheduler Action Function
_click(_submit()); //Scheduler Action Function
}
createCustomer(); // is Right
//_call(createCustomer()); // is Wrong
Read more about Scheduler
Functions