How does Sahi work?
How does the script in sah files
execute?
Why do variables need to be prefixed with a
dollar($) sign?
Why do all Sahi APIs start with an
underscore?
Sahi's core parts include the Sahi proxy
server and the javascript
engine

Html responses which pass through the proxy are modified such that
javascript is injected at the start and end of the response.
This will allow the browser to record and playback scripts and talk
back to the proxy when needed.
Apart from handling requests for pages that the browser requests,
Sahi also handles custom commands related to recording, playback
etc. which the browser sends.
The Sahi script, even though looking like javascript, is not
executed as regular javascript on the browser.
The reasons for this are:
- The script refers to objects spread over multiple pages and
will result in errors if executed directly on any page
- The script needs to be executed step by step with a slight
delay between execution of each step.
This cannot be accomplished directly since javascript has no way of
pausing execution.
Sahi handles this by parsing and modifying the script in the
proxy.
Thus, a line which looked like this:
_click(_link("Link Test"));
gets translated to:
sahiAdd("sahi_click(sahi_link(\"Link Test\"));", "sahi_demo.sah : 3")
The method sahiAdd(cmd, debugInfo) takes two parameters.
The first is the line of script, which has been converted into a
string.
The second is debug information which the proxy adds.
function sahiAdd(cmd, debugInfo){
var i = _sahiCmds.length;
_sahiCmds[i] = cmd;
_sahiCmdDebugInfo[i] = debugInfo;
}
During page load, Scheduler
Functions add steps in the script to an array.
A counter is maintained on the server which marks the index in the
array of the step that is to be run next.
This counter is updated with each successful execution of a
step.
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");
function s_v(v){
var type = typeof v;
if (type == "number") return v;
else if (type == "string") return "\""+v+"\"";
else return v;
}
Thus, what will eventually execute, will be:
sahi_click(sahi_link("Link Test"));
For easy identifcation of variables while parsing, it is needed
that there is some way of tagging variables.
The dollar($) sign serves that purpose.
Sahi scripts are loaded with each page that appears on the
browser.
Since it is all javascript, the API function names need to be
unique.
If the application under test has a function with the same name, it
can cause problems.
For this, all API functions start with "sahi_".
When Sahi's proxy serves the script to the browser, it parses and
does a lot of modifications to the script.
One of these is to correctly replace the API methods starting with
"_" with "sahi_".
Thus,
_click(_link("Create Login"));
actually becomes
sahi_click(sahi_link("Create Login"));
Starting the APIs with "_" helps in easy substitution with "sahi_"
with less scope for ambiguity.