Exception Handling and Recovery

Try Catch

For anticipated exceptions, one may use try catch blocks.

Syntax
try{
// sahi statements
}catch($e){
// Corrective action
// Can print exact source of error in log
// Can throw the same or another exception
}


Corrective Action

try{
  _click(_link("does not exist"));
}catch($e){
  _log("Exception occured"); // simple logging. no failure
  _click(_link("linkByHtml")); // Corrective action
}


Corrective Action and Log the Exception Message

try{
  _disableDefaultErrorLogging(); // This will ignore and not log the failures which occur in try block
  _click(_link("does not exist"));
}catch($e){
  _click(_link("linkByHtml")); // Corrective action
  _logException($e); // Logs the exception, but does not fail
}


Corrective Action, Log and then Fail

try{
  _disableDefaultErrorLogging(); // This will ignore and not log the failures which occur in try block
  _click(_link("does not exist"));
}catch($e){
  _click(_link("linkByHtml")); // Corrective action
  _logExceptionAsFailure($e); // Logs the exception, and fails,
  // and in the logs, points to the original line as source of failure.
}


Script Callback Functions

For unanticipated exceptions, override Sahi's callback functions to recover.

Example:
function onScriptEnd(){
  _click(_button("Logout"));
}
function onScriptError(){
  _log(">> In onScriptError");
}
function onScriptFailure(){
  _log(">> In onScriptFailure");
}

_navigateTo("http://sahi.co.in/demo/training/");
_setValue(_textbox("user"), "test");
_setValue(_password("password"), "secret");
_click(_submit("Login"));
_assertExists(_submit("Login")); // cause SCRIPT ASSERTION FAILURE - triggers onScriptFailure
_setValue(_textbox("q11"), "2"); // causes SCRIPT ERROR - triggers onScriptError

// Script aborts here, but executes onScriptEnd() to logout

_setValue(_textbox("q[1]"), "1");
_setValue(_textbox("q[2]"), "1");
_click(_button("Add"));
_assertEqual("1150", _textbox("total").value); // cause SCRIPT FAILURE

// If not aborted earlier, automatically calls onScriptEnd() to logout.


Taking screenshots

Use _focusWindow() and _takeScreenShot() (available since Sahi Pro V4.3)
function onScriptError($e){
  _focusWindow();
  _takeScreenShot();
}
onScriptFailure = onScriptError;
_navigateTo("http://sahi.co.in/demo/training/");
_setValue(_textbox("user"), "test");
_setValue(_password("password"), "secret");
_click(_submit("Login"));


Force Sahi to continue on error after screenshots and logging.

function onScriptError($e){
  _logExceptionAsFailure($e);
  _focusWindow();
  _takeScreenShot();
  return true; // Forces Sahi to continue execution and not stop at error. Since Sahi Pro V4.3
}

_navigateTo("http://sahi.co.in/demo/training/");
_setValue(_textbox("user"), "test");
_setValue(_password("password"), "secret");
_click(_submit("Login"));


_setRecovery

warning_setRecovery is no longer recommended and may be deprecated soon. Use the callback functions instead
The relevant APIs are:

_setRecovery(fn) _removeRecovery()

Any function can be assigned to a script as a recovery function. Once set, if there is an error during execution, the recovery function will be called before the script stops.

_navigateTo("http://sahi.co.in/demo/");

function myRecoveryFn(){
  _alert("In myRecoveryFn."); // This statement will be alerted in case of script error.
}

_setRecovery(myRecoveryFn); // Set the myRecoveryFn as recovery function.
_click(_link("Link Test")); // Works normally
_click(_link("Bad Link"));
// This statement fails and causes myRecoveryFn to be called.
_alert("done");
// This statement will not be called, because script failed in the last statement.


The recovery function can be removed via _removeRecovery();

warning_setRecovery is no longer recommended and may be deprecated soon. Use the callback functions instead